Just so so
8/27
2017

利用Selenium爬取网络数据

Selenium 简介

Selenium 是一个用于Web应用程序测试的工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。框架底层使用 JavaScript 模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。

环境配置

sudo apt-get install python默认2.7.12
sudo apt-get update        #更新下apt-get库否则下载pip会出错
sudo apt-get install python-pip        #默认是8.1.1
sudo pip install selenium    #安装selenium
sudo apt-get install firefox
sudo apt-get install xvfb
sudo pip install pyvirtualdisplay
下载 geckodriver        https://github.com/mozilla/geckodriver/releases
sudo chmod a+w geckodriver

相关方法

  • 定位页面中的元素

    find_element_by_id
    find_element_by_name
    find_element_by_xpath
    find_element_by_link_text
    find_element_by_partial_link_text
    find_element_by_tag_name
    find_element_by_class_name
    find_element_by_css_selector
    
  • 定位多个元素

    find_elements_by_name
    find_elements_by_xpath
    find_elements_by_link_text
    find_elements_by_partial_link_text
    find_elements_by_tag_name
    find_elements_by_class_name
    find_elements_by_css_selector
    
  • 操作元素方法

    clear 清除元素的内容
    send_keys 模拟按键输入
    click 点击元素
    submit 提交表单
    

延时等到

利用Selenium爬取网络数据时,遇到的最多的问题就是页面或浏览器选项卡未加载出来时,对页面进行操作的问题。常见得报错包括IndexError: list index out of range等。

一种解决办法是,在一些操作后加 time.sleep(3) 来使进程等待一段固定时长,再进行后续操作。更好的办法应该是等到页面加载完成后,自动进行后续操作。

  • 等待元素出现后再执行后续操作

    wait模块的WebDriverWait类是显性等待类,先看下它有哪些参数与方法:

    def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
          """Constructor, takes a WebDriver instance and timeout in seconds.
    
             :Args:
              - driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)
              - timeout - Number of seconds before timing out
              - poll_frequency - sleep interval between calls
                By default, it is 0.5 second.
              - ignored_exceptions - iterable structure of exception classes ignored during calls.
                By default, it contains NoSuchElementException only.
    
             Example:
              from selenium.webdriver.support.ui import WebDriverWait \n
              element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \n
              is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \n
                          until_not(lambda x: x.find_element_by_id("someId").is_displayed())
          """
    

    调用方法如下:

    WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
    

    示例代码:

    WebDriverWait(driver, 600).until(lambda x: x.find_elements_by_xpath("//div[@class=\"col-9 search-2017-2 pr10 pl0\"]/div"))
    
  • 等待新的页面(选项卡)打开后执行后续操作

    while len(driver.window_handles)<2:        #如果选项卡数量小于2
        first.click()
        time.sleep(1)
    

参考文章