selenium2 版本,可以用 Selenium + PhantomJS 来爬取异步加载的网页信息。

selenium3+ 的某个版本起,selenium已经抛弃Phantomjs了:UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead

selenium

selenium

selenium python

PhantomJS

Selenium 是一款 web 应用自动化测试工具,selenium 本身是不带浏览器引擎,所以使用 selenium 进行自动化测试需要驱动其它浏览器。

Installation selenium

1
pip install selenium

Selenium 简单应用

1
2
3
4
from selenium import webdriver

driver = webdriver.Firefox(executable_path='/path/to/firefox')
driver.get('http://www.lizs.cc')
  • selenium 支持驱动 Firefox, Chrome, Opera, Safari 等浏览器。
  • webdriver.Firefox(): 返回一个 WebDriver 对象。
  • get(url): 用当前驱动的浏览器加载一个 url 页面。

注意:因为浏览器版本问题,有可能自动测试失败。

WebDriver 对象的常用属性和方法

  • 常用属性

    • name: 浏览器的名称。
    • title: 加载页面的 title。
    • current_url: 当前页面的URL。
    • page_source: 加载页面的源码。
    • service: 启动浏览器的服务对象
    • switch_to: 返回一个SwitchTo对象。即当前页面选择(聚焦)的对象,如WebElement对象点击操作click()的时候如果弹窗,则当前就聚焦在弹窗,当前页面聚焦的元素可以用self.switch_to.alert来表示。
    1
    2
    3
    4
    5
    6
    7
    8
    from selenium import webdriver

    driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
    driver.get('http://www.lizs.cc')
    driver.name # the browser name
    driver.title # the page title
    driver.current_url # current url of the page
    driver.page_source # the response content
  • 常用方法

    • get(url): 用当前浏览器session加载url
    • set_page_load_time(seconds): 设置页面加载超时时间。
    • maxsize_window(): 设置浏览器全屏化。
    • set_window_size(width, height, windowHandle='current'): 设置浏览器窗口大小
    • forward(): 前进。
    • back(): 后退。
    • refresh(): 刷新页面。
    • get_cookies(): 返回当前页面所有cookies的key/value字典。
    • get_cookie(name): 获取当前页面cookie中名为name的cookie值。
    • execute_script(script): 在当前窗口执行 JavaScript 代码 script
    • close(): 关闭当前窗口。
    • quit(): 关闭浏览器。
  • 定位元素,返回一个 WebElement 对象

    • find_element_by_name(name)/find_elements_by_name(name): 根据元素名称定位页面上的元素。
    • find_element_by_id(id)/find_elements_by_id(id): 根据元素ID定位页面上的元素。
    • find_element_by_tag_name(name)/find_elements_by_tag_name(name): 根据元素tag名称定位页面上的元素。
    • find_element_by_class_name(name)/find_elements_by_class_name(name): 根据元素class定位页面上的元素。
    • find_element_by_css_selector(selector)/find_elements_by_css_selector(selector): 根据 CSS 选择器定位元素。
    • find_element_by_xpath(xpath)/find_elements_by_xpath(xpath): 根据 xpath 规则定位元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver

driver = webdriver.Chrome(execute_path='/path/to/chromedriver')
driver.maxsize_window()
driver.set_page_load_time(10) # 设置页面加载的超时时间,单位:秒。
driver.get('http://www.lizs.cc')
element = driver.find_element_by_name('a') # 查找当前页面中的一个<a>标签元素
element.click() # 点击元素,一般会跳转到新页面
print(driver.current_url) # 页面当前的URL
driver.back() # 后退
print(driver.current_url)
driver.forward()
element = driver.find_element_by_xpath('//*[@onclick]') # 查找当前页面中有 onclick 动作的元素
if element:
element.click()
driver.switch_to.alert.accept() # 如果当前页面有alert弹窗,接受
driver.quit() # 退出浏览器

更多属性和功能查看 selemium.webdriver.remote.WebDriver 对象。

WebElement 对象的常用属性和方法

  • id: 获取元素的ID。
  • text: 获取元素的文本内容。
  • tag_name: 获取元素的 tag 名称。
  • size: 获取元素的大小(width, height)。
  • clear(): 如果元素是输入框,清除输入框的内容。
  • click(): 点击元素。
  • submit(): 提交表单。
  • send_keys(value): 模拟输入,即输入 value 到输入框。

更多属性和功能查看 selemium.webdriver.remote.WebElement 对象。

selenium.webdriver.common.keys.Keys 键盘对象

Keys 对象定义了键盘上相应按键的编码,可以通过 WebElement.send_keys() 进行操作。

  • WebElement.send_keys(Keys.TAB): 清除元素输入框的内容,同 click()
  • WebElement.send_keys(Keys.ENTER): 回车操作
  • WebElement.send_keys(Keys.CONTROL, 'a'): 全选输入框的内容
  • WebElement.send_keys(Keys.CONTROL, 'c'): 复制选中的内容

selenium.webdriver.common.action_chains.ActionChains 鼠标对象

  • ActionChains(WebDriver).click(WebElement).perform(): 鼠标点击。
  • ActionChains(WebDriver).double_click(WebElement).perform(): 鼠标双击。
  • ActionChains(WebDriver).context_click(WebElement).perform(): 鼠标右键点击。

PhantomJS

PhantomJS 是一个基于 Webkit 的 headless 浏览器。PhantomJS 没有交互界面,并且Selenium 驱动 PhantomJS 速度比 Firefox、chrome 等快。
所以,用 Selenium + PhantomJS 来爬取异步加载的网页信息。

PhantomJS 可以从官网免费下载 PhantomJS

Selenium + PhantomJS

1
2
3
4
from selenium import webdriver

driver = webdriver.PhantomJS(executable_path='/path/to/phantomjs', service_log_path='/path/to/save/log', service_args=[])
driver.get('http://www.lizs.cc')

在初始化 WebDriver 对象的时候可以指定一些其它选项:

  • service_log_path:指定日志文件的路径,默认为当前目录下的 ghostdriver.log
  • service_args: 列表,执行 PhantomJS 时传递给 PhantomJS 的参数。如:['--ignore-ssl-error=true']。更多参数可以查看 PhantomJS command line

执行到 webdriver.PhantomJS() 的时候,会在后台启动一个 PhantomJS 进程,其中包含了一个选项 --webdriver=xxxx 为分配的 socket 端口号。可以用 driver.service.port 来获取。

1
2
$ ps -ef | grep phantomjs
lizs 12027 1542 0 Feb27 ? 00:12:07 /home/lizs/apps/my-project/utils/phantomjs --cookies-file=/tmp/tmpOzM7CL --webdriver=56849

Chrome

Chrome和Firefox最新的版本已经支持headless了。
headless-chrome

1
2
3
4
5
6
7
8
9
10
11
12
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

url = 'http://www.lizs.cc'
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1696')
options.binary_location = '/path/to/chrome'
driver = webdriver.Chrome(executable_path='/path/to/chromedriver', chrome_options=options)
driver.set_page_load_timeout(15)
driver.get(url)