• 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)

     

  • 相关阅读:
    silverlight 中缓存应用程序相应的库文件
    Silverlight 4 Unleashed 读书笔记:第二章
    使用虚拟打印机提交文档的文本
    ORACLE 中为什么要把列名都转换成大写字母?
    在 silverlight 自由绘图(WriteableBitmapEx)
    新的 WINDOWS 2003 系统上装了 TOMCAT 6 启动不了
    计算两个坐标所形成的角的角度
    在 Silverlight 绘制线帽(箭头)
    Linux下安装memecache缓存程序
    Linux下安装、配置、启动Apache
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11366037.html
Copyright © 2020-2023  润新知