Python语言下使用Selenium实现对浏览器的自动控制

 

前言在使用Python开发爬虫时,可以使用urllib+BeautifulSoup,Requests+BeautifulSoup,Scrapy等框架实现对静态网页的抓取。但在处理动态网页时,网页上采用异步加载的JavaScript和XML等。为了避免分析页面请求等复杂问题,我们可以牺牲一定的数据采集效率和时间,采用控制浏览器模拟用户的操作,以实现目标信息的获取。Selenium是一个用于对W...

前言

在使用Python开发爬虫时,可以使用urllib+BeautifulSoupRequests+BeautifulSoupScrapy等框架实现对静态网页的抓取。

但在处理动态网页时,网页上采用异步加载的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上传到服务器执行。

常见浏览器的相应驱动如下:

部署及配置

部署平台

  • MacOS 10.12
  • Python 3.6 / Anaconda 4.4
  • Selenium 3.4
  • Firefox 54.0 / GeckoDriver 0.18.0

步骤

  1. 安装Selenium

在安装了python包管理器pip后,打开终端直接输入

pip install selenium

或直接前往PyPI下载Selenium安装包: https://pypi.python.org/pypi/selenium

  1. 安装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")

延伸阅读