在前面爬虫的相关介绍中, 我们介绍了如何抓取静态页面信息. 但是, 在实际的网页浏览过程中, 我们可能会经常碰到各种需要进行交互的操作, 典型的如输入信息, 点击按钮之类.
对于这种场景, 之前的静态页面操作方式已经不能满足需求, 这时我们需要借助新的工具, 比如 selenium 或者 PhantomJS. 由于后者已经停止维护, 推荐使用前者.
1.selenium 是什么
如果大家有做过 web 的自动化测试, 相信对于 selenium 一定不陌生, 测试人员经常使用它来进行自动化测试.
selenium 最初是一个自动化 Web 测试工具, 通过代码模拟人使用浏览器自动访问目标站点并操作, 比如跳转, 输入, 点击, 下拉等.
由于开发者的不断完善, 目前的功能越来越强大, 基本支持各种交互操作. 同时, 不止支持有界浏览, 还支持无界浏览.
2.selenium 有什么用
正如我们前面讲过的, 爬虫的本质过程就是模拟人对浏览器的操作过程. 在爬虫中使用, selenium 主要是为了解决 requests 无法执行 JavaScript 代码的问题.
本质上是通过驱动浏览器, 完全模拟浏览的操作, 比如跳转, 输入, 点击, 下拉等... 进而进行跳转.
当然, 它也有坏处, 主要的坏处就是它的速度比较慢. 原因是 selenium 在操作时, 需要等浏览器对页面的元素渲染好之后才能操作. 而我们知道, 由于页面渲染过程需要加载各种资源, 响应速度与网络带宽要求非常高. 通常情况, 它比静态页面的响应至少慢一个数量级.
3. 如何使用 selenium
在知道 selenium 是什么以及有什么用之后, 我们来具体学习如何操作这个工具.
由于 selenium 本质是模拟人对浏览器进行输入, 选择, 点击等操作, 因此对于目标标签的定位非常重要.
在前面的章节, 我们对于如何定位目标标签有过详细的介绍, 这里就不再赘述. selenium 对于目标标签定位的方式本质与静态的页面一样, 只不过因为使用的包不同, 因此在 beautifulSoup 中使用的是 find 和 findAll, 而在 selenium 中使用的接口有所变化.
下图中已对各种定位方式进行了归纳总结:
在找到目标标签之后, 最重要的是对这些标签进行模拟操作. Selenium 库下 webdriver 模块常用方法主要分类两类: 一类是模拟浏览器, 键盘操作, 另一类是模拟鼠标操作.
3.1 模拟浏览器, 键盘操作
模拟浏览器, 键盘操作的方法归纳如下:
3.2 模拟鼠标操作
模拟鼠标操作的方法归纳如下:
4. 示例演示
在介绍了 selenium 相关的使用方法之后, 我们来进行操作. 这里介绍两个例子: 第一个例子是模拟百度搜索, 第二个例子是模拟自动登录网易 163 邮箱发送邮件.
在开始示例之前我们需要安装 selinum 插件包, 同时还需要下载 webdriver. 在我们的示例中, 需要是使用 Chrome 浏览器进行操作, 需要使用浏览器的驱动 webdriver.
关于下载什么版本的 webdriver, 可以在浏览器的属性中查看, 并在 http://npm.taobao.org/mirrors/chromedriver / 下载对应的版本就好, 如果是其他的浏览器, 则需要下载对应的浏览器驱动程序, 这种不再做进一步介绍.
4.1 模拟百度搜索
第一步还是需要打开目标的地址 "w w w.baidu.com", 分析目标网页中目标元素的特点, 如下图所示:
通过分析, 我们很容易就找到搜索框的 id 为 kw, 点击按钮的 id 为 su, 余下的就是使用方法进行模拟.
实现的代码如下所示:
- from selenium import webdriver
- #get 方法 打开指定网址
- driver=webdriver.Chrome()
- driver.get('http://www.baidu.com')
- # 选择网页元素
- element_keyword = driver.find_element_by_id('kw')
- # 输入字符
- element_keyword.send_keys('python 爬虫')
- # 找到搜索按钮
- element_search_button = driver.find_element_by_id('su')
- element_search_button.click()
- driver.close()
4.2 模拟自动登录网易 163 邮箱发送邮件
操作过程跟上面相似, 第一步也是分析目标网页 http://mail.163.com.
如下图所示:
找到了目标标签然后就是模拟登录.
实现代码如下:
- # coding:UTF-8
- import time
- from selenium.webdriver.common.keys import Keys
- from selenium import webdriver
- driver = webdriver.Chrome()
- driver.implicitly_wait(5)
- driver.get('http://mail.163.com/')
- driver.switch_to_frame(driver.find_element_by_tag_name('iframe'))
- # driver.switch_to_frame('x-URS-iframe')
- driver.find_element_by_name('email').clear()
- driver.find_element_by_name('email').send_keys('邮箱地址')
- driver.find_element_by_name('password').send_keys('邮箱密码', Keys.ENTER)
- # 跳转页面时, 强制等待 6s
- time.sleep(6)
- # 点击写信按钮
- driver.find_element_by_xpath("//div[@id='dvNavTop']/ul/li[2]/span[2]").click()
- time.sleep(2)
- # 收件人
- driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys('目标的邮箱')
- driver.find_element_by_xpath("//input[@class='nui-ipt-input'and @type='text'and @maxlength='256']").send_keys(
- u'测试') # 主题
- xpath = driver.find_element_by_xpath("//div[@class='APP-editor-edtr']/iframe")
- # 文本内容在 iframe 中
- driver.switch_to_frame(xpath)
- driver.find_element_by_xpath("//body[@class='nui-scroll'and @contenteditable='true']").send_keys(u'这是一个自动化测试邮件')
- # 发送按钮在 iframe 外, 所以需要跳出
- driver.switch_to_default_content()
- # 发送
- driver.find_element_by_xpath("//div[@class='nui-toolbar-item']/div/span[2]").click()
- driver.close()
当然, 在实际过程中, 可能往往还有验证码的验证. 因为现在的验证码难度越来越大, 形式也多种多样, 使用常规的方法很难解决, 必须借助机器学习或者第三方接口进行实现, 将在后续单独列一个章节进行介绍如何破解验证码.
来源: https://www.cnblogs.com/turing09/p/13171897.html