前言
在使用Python开发爬虫时,可以使用urllib+BeautifulSoup,Requests+BeautifulSoup,Scrapy等框架实现对静态网页的抓取。
但在处理动态网页时,网页上采用异步加载的JavaScript和XML等。为了避免分析页面请求等复杂问题,我们可以牺牲一定的数据采集效率和时间,采用控制浏览器模拟用户的操作,以实现目标信息的获取。
Selenium是一个用于对Web应用测试的自动化工具。基于Web的管理任务也能够利用Selenium进行自动化实现。他已经能够得到大部分浏览器的原生支持,包括Chrome,Firefox,IE,Safari等。他提供的用于驱动浏览器的语言绑定集合Selenium WebDriver,为Python, Ruby, Java, and C#等语言提供了简单直接的API,可以简单直接地实现对浏览器的操作控制。
为了使Selenium能够自动化操作浏览器,我们需要同时下载对应浏览器的相应驱动。一般地,如果采用桌面版的浏览器如Chrome,Firefox等,就能够在运行程序时直接观察到浏览器到变化。对于不要求界面的服务器端,可以使用PhantomJS(一个提供JavaScript API接口,基于WebKit的无头浏览器)以提高执行效率。一般情况下,可以在调试程序时采用桌面版浏览器,然后将其更改为PhantomJS上传到服务器执行。
常见浏览器的相应驱动如下:
- Chrome: 官方插件ChromeDriver
- Firefox: 官方插件GeckoDriver
- Edge: 官方插件Microsoft WebDriver / Internet Explorer Driver - GitHub wiki
- Safari: Safari 10官方提供了对WebDriver的原生支持。You can enable Remote Automation in the Develop menu你可以在
开发
(Develop
)菜单中选择允许远程自动化
(enable Remote Automation
) ,然后利用指令/usr/bin/safaridriver
启动服务器。 / WebDriver Support in Safari 10
部署及配置
部署平台
- MacOS 10.12
- Python 3.6 / Anaconda 4.4
- Selenium 3.4
- Firefox 54.0 / GeckoDriver 0.18.0
步骤
- 安装Selenium
在安装了python包管理器pip后,打开终端直接输入
pip install selenium
或直接前往PyPI下载Selenium安装包: https://pypi.python.org/pypi/selenium
- 安装GeckoDriver
GeckoDriver是由Mozilla开发的针对Gecko引擎的网络浏览器驱动。在 https://github.com/mozilla/geckodriver/releases 下载最新的文件包,并确保将其放在PATH中,如/usr/bin
或者/usr/local/bin
目录下。
既然我们使用了MacOS,我们就可以使用homebrew来安装:
$ brew install geckodriver
另外,如果我们要想在Anaconda中也可以直接运行GeckoDriver,还需要将执行文件放置在Anaconda.app/bin/
下。
第一个实例
运行下面的代码能够自动实现在百度中搜索“Hello, world!”的功能。具体的分析可以参考代码中的注释。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = "http://www.baidu.com"
driver = webdriver.Firefox() # 打开浏览器窗口
driver.get(url) # 转到目标URL
elem = driver.find_element_by_name("f") # 查找到搜索栏元素
elem.send_keys("python") # 输入”python“
elem.send_keys(Keys.RETURN) # 键盘操作回车
driver.close() # 关闭浏览器
添加本机Firefox Profile启动条件
需要注意的是,这里webdriver在启动Firefox时,启动的一个干净的没有任务、插件及cookies信息的浏览器。也就是说,即使你的Firefox安装了某些插件,webdriver在启动时也是不会加载这些插件的。
为了能够加载我们需要的某些插件,需要在启动Firefox添加Profile配置文件,相关的代码变为:
profile_dir = r"/Users/macbook/Library/Application Support/Firefox/Profiles/62rkdb8y.default"
profile = webdriver.FirefoxProfile(profile_dir)
driver = webdriver.Firefox(profile)
代码中第一行的路径指向的就是本机默认的Profile文件,一般在Firefox地址栏中输入about:support
后即可找到配置文件夹的具体路径。
Selenium常用操作
selenium.webdriver
模块提供了所有的WebDriver实现。
selenium.webdriver.common.keys.Keys
类提供了键盘按键的输入操作。
- 转到链接
driver.get("http://www.google.com")
- 查找页面元素
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
- 填写表单
# 在文本框中输入文字及键盘操作
element.send_keys(" and some", Keys.ARROW_DOWN)
# 清除内容
element.clear()
# 选择菜单<select>的操作
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)
# 提交表单的两种方法
driver.find_element_by_id("submit").click()
element.submit()
- 其他操作
# 鼠标拖拽
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
# 在窗口和标签页中切换
driver.switch_to_window("windowName")
driver.switch_to_frame("frameName")