zoukankan      html  css  js  c++  java
  • chromedriver设置无界面模式 selenium基础操作

    chromedriver设置无界面模式

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    # 添加无界面参数
    options.add_argument('--headless')
    browser = webdriver.Chrome(options=options)
    browser.get('http://www.baidu.com/')
    browser.save_screenshot('baidu.png')

    selenium - 键盘操作

    from selenium.webdriver.common.keys import Keys
    
    browser = webdriver.Chrome()
    browser.get('http://www.baidu.com/')
    # 1、在搜索框中输入"selenium"
    browser.find_element_by_id('kw').send_keys('赵丽颖')
    # 2、输入空格
    browser.find_element_by_id('kw').send_keys(Keys.SPACE)
    # 3、Ctrl+a 模拟全选
    browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
    # 4、Ctrl+c 模拟复制
    browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c')
    # 5、Ctrl+v 模拟粘贴
    browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')
    # 6、输入回车,代替 搜索 按钮
    browser.find_element_by_id('kw').send_keys(Keys.ENTER)

    selenium - 鼠标操作

    from selenium import webdriver
    # 导入鼠标事件类
    from selenium.webdriver import ActionChains
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com/')
    #输入selenium 搜索
    driver.find_element_by_id('kw').send_keys('赵丽颖')
    driver.find_element_by_id('su').click()
    
    #移动到 设置,perform()是真正执行操作,必须有
    element = driver.find_element_by_name('tj_settingicon')
    ActionChains(driver).move_to_element(element).perform()
    
    #单击,弹出的Ajax元素,根据链接节点的文本内容查找
    driver.find_element_by_link_text('高级搜索').click()

    selenium - 切换页面

    适用网站

      页面中点开链接出现新的页面,但是浏览器对象browser还是之前页面的对象

    应对方案

    # 获取当前所有句柄(窗口)
    all_handles = browser.window_handles
    # 切换browser到新的窗口,获取新窗口的对象
    browser.switch_to.window(all_handles[1])

    民政部网站案例

    目标

      将民政区划代码爬取到数据库中,按照层级关系(分表 -- 省表、市表、县表)

    数据库中建表

    # 建库
    create database govdb charset utf8;
    use govdb;
    # 建表
    create table province(
        p_name varchar(20),
        p_code varchar(20)
        )charset=utf8;
    create table city(
        c_name varchar(20),
        c_code varchar(20),
        c_father_code varchar(20)
        )charset=utf8;
    create table county(
        x_name varchar(20),
        x_code varchar(20),
        x_father_code varchar(20)
        )charset=utf8;

    思路

    1、selenium+Chrome打开一级页面,并提取二级页面最新链接
    2、增量爬取: 和数据库version表中进行比对,确定之前是否爬过(是否有更新)
    3、如果没有更新,直接提示用户,无须继续爬取
    4、如果有更新,则删除之前表中数据,重新爬取并插入数据库表
    5、最终完成后: 断开数据库连接,关闭浏览器

    代码实现

    from selenium import webdriver
    import pymysql
    
    
    class GovSpider(object):
      def __init__(self):
        #设置无界面
        options = webdriver.ChromeOptions()
        options.add_argument('--headless')
        self.browser = webdriver.Chrome(options=options)
        self.one_url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
        self.db = pymysql.connect(
          'localhost', 'root', '123456', 'govdb', charset='utf8'
        )
        self.cursor = self.db.cursor()
        # 创建3个列表,用executemany()往3张表中插入记录
        self.province_list = []
        self.city_list = []
        self.county_list = []
    
      def get_incr_url(self):
        self.browser.get(self.one_url)
        # 提取最新链接,判断是否需要增量爬
        td = self.browser.find_element_by_xpath(
          '//td[@class="arlisttd"]/a[contains(@title,"代码")]'
        )
        # 提取链接 和 数据库中做比对,确定是否需要怎俩那个抓取
        # get_attribute()会自动补全提取的链接
        two_url = td.get_attribute('href')
        sel = 'select url from version where url=%s'
        # result为返回的受影响的条数
        result = self.cursor.execute(sel, [two_url])
        if result:
          print('无须爬取')
        else:
          td.click()
          # 切换句柄
          all_handlers = self.browser.window_handles
          self.browser.switch_to.window(all_handlers[1])
          self.get_data()
          # 把URL地址存入version表
          dele = 'delete from version'
          ins = 'insert into version values(%s)'
          self.cursor.execute(dele)
          self.cursor.execute(ins, [two_url])
          self.db.commit()
    
      def get_data(self):
        tr_list = self.browser.find_elements_by_xpath(
          '//tr[@height="19"]'
        )
        for tr in tr_list:
          code = tr.find_element_by_xpath('./td[2]').text.strip()
          name = tr.find_element_by_xpath('./td[3]').text.strip()
          print(code, name)
          # 数据添加到对应的表中
          if code[-4:] == '0000':
            self.province_list.append([name, code])
            if name in ['北京市', '天津市', '上海市', '重庆市']:
              self.city_list.append([name, code, code])
          elif code[-2:] == '00':
            self.city_list.append([name, code, (code[:2])])
          else:
            if code[:2] in ['11', '12', '31', '50']:
              self.county_list.append([name, code, (code[:2] + '0000')])
            else:
              self.county_list.append([name, code, (code[:4] + '00')])
        # 执行数据库插入语句
        self.insert_mysql()
    
      def insert_mysql(self):
        # 1.删除
        del_province = 'delete from province'
        del_city = 'delete from city'
        del_county = 'delete from county'
        self.cursor.execute(del_province)
        self.cursor.execute(del_city)
        self.cursor.execute(del_county)
        # 2.插入
        ins_province = 'insert into province values(%s,%s)'
        ins_city = 'insert into city values(%s,%s,%s)'
        ins_county = 'insert into county values(%s,%s,%s)'
        self.cursor.executemany(ins_province, self.province_list)
        self.cursor.executemany(ins_city, self.city_list)
        self.cursor.executemany(ins_county, self.county_list)
        self.db.commit()
        print('数据抓取完成,成功存入数据库')
    
      def main(self):
        self.get_incr_url()
        self.cursor.close()
        self.db.close()
        self.browser.quit()
    
    
    if __name__ == '__main__':
      spider = GovSpider()
      spider.main()
    代码实现

    selenium - Web客户端验证

    弹窗中的用户名和密码如何输入?

      不用输入,在URL地址中填入就可以

    示例: 爬取某一天笔记

    from selenium import webdriver
    
    url = 'http://tarenacode:code_2013@code.tarena.com.cn/AIDCode/aid1904/15-spider/spider_day06_note.zip'
    browser = webdriver.Chrome()
    browser.get(url)

     

  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11366037.html
Copyright © 2011-2022 走看看