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 代码scriptclose(): 关闭当前窗口。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.logservice_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 |