Selenium
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 是一款 web 应用自动化测试工具,selenium 本身是不带浏览器引擎,所以使用 selenium 进行自动化测试需要驱动其它浏览器。
Installation selenium
1 | pip install selenium |
Selenium 简单应用
1 | from selenium import webdriver |
- 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
8from 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 | from selenium import webdriver |
更多属性和功能查看 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 | from selenium import webdriver |
在初始化 WebDriver 对象的时候可以指定一些其它选项:
service_log_path
:指定日志文件的路径,默认为当前目录下的ghostdriver.log
service_args
: 列表,执行 PhantomJS 时传递给 PhantomJS 的参数。如:['--ignore-ssl-error=true']
。更多参数可以查看 PhantomJS command line。
执行到 webdriver.PhantomJS()
的时候,会在后台启动一个 PhantomJS 进程,其中包含了一个选项 --webdriver=xx
, xx
为分配的 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 | from selenium.webdriver import Chrome |