Python公开课 - 数据抓取之Selenium使用(上)

1. 前言

在上一章中,我们阐述了如何抓取Ajax页面的内容,但是实际情况动态网页的产生不单单只有Ajax这一种方式。

网页通过Javascript编写展现逻辑代码,也是实现页面动态展示的非常普遍的方式。如果这段代码中涉及到计算、加密等,会让你很难逆向解析。

这时候可以考虑Selenium登场了,它具备自动运行Javascript代码的功能,能够模拟浏览器访问页面,并获取实际展现出来的页面内容。

不需要去考虑目标网站的的JS编码逻辑,这对爬虫开发人员来说是一个很好的工具。

数据抓取之Selenium使用

2. 什么是Selenium

Selenium的出发点是作为一个用于Web应用程序测试的工具。它可以直接运行在浏览器中,就像真正的用户在操作一样。支持丰富的浏览器产品包括IE, Chrome, Firefox等。

它的主要功能包括:

  • 测试与浏览器的兼容性 - 测试你的应用程序看是否能够工作在不同浏览器和操作系统
  • 测试系统功能 - 创建回归测试检验软件功能和用户需求
  • 动作录制 - 支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本

相较于测试人员来说,爬虫开发人更关注的是上述第一项和第三项。

同时Selenium还可以驱动浏览器执行特定的动作(如点击、输入、下拉等操作),对于需要登录才能抓取的页面,这种方式非常有效。

3. 安装Selenium

我们可以直接通过pip来安装Selenium

pip3 install selenium

来验证是否安装成功,进入Python命令行交互模式,导人Selenium包:

import selenium 

如果没有报错,则证明安装成功。

4. 安装Chrome Browser

可以选择从从谷歌网站下载最新的chrome,ubuntu环境下可以在兔子先生下载71版本

  • wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
  • 下载chrome_amd64_71.deb

下载完毕后,通过sudo dpkg -i google-chrome-stable_current_amd64.deb来安装

5. 安装Goolge Chrome Driver

如果仅仅安装了Selenium还不够,因为它只是一个脚本测试框架,我们还需要浏览器驱动来配合使用。

这里我们以Goolge Chrome Driver为例子,从谷歌官网上找到最新的三个版本的Driver,并提供本地下载:

Name Size
chromedriver_linux64.zip 5.14MB
chromedriver_mac64.zip 6.63MB
chromedriver_win32.zip 4.39MB

6. 开始使用Selenium

在完成上述安装后,我们可以开始使用了,用如下代码来验证:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options


options = Options()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(executable_path='./chromedriver', chrome_options=options)
driver.implicitly_wait(5)
driver.get("https://www.xtuz.net/")
driver.quit()

运行程序,没有报错,说明我们已经安装ok,并可以使用了

7. 安装中碰到的坑

第一个问题

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: Chrome version must be between 70 and 73

解决办法:

驱动的版本和浏览器没有对应上,要找到正确的版本号,可以通过google-chrome --version查看当前浏览器的版本号。

第二个问题

root@vps:~# sudo dpkg -i google-chrome-stable_current_amd64.deb
正在选中未选择的软件包 google-chrome-stable。
(正在读取数据库 ... 系统当前共安装有 33655 个文件和目录。)
正准备解包 google-chrome-stable_current_amd64.deb  ...
正在解包 google-chrome-stable (71.0.3578.98-1) ...
dpkg: 依赖关系问题使得 google-chrome-stable 的配置工作不能继续:
 google-chrome-stable 依赖于 fonts-liberation;然而:
  未安装软件包 fonts-liberation。
 google-chrome-stable 依赖于 libappindicator3-1;然而:
  未安装软件包 libappindicator3-1。
 google-chrome-stable 依赖于 libasound2 (>= 1.0.16);然而:
  未安装软件包 libasound2。
 google-chrome-stable 依赖于 libatk-bridge2.0-0 (>= 2.5.3);然而:
  未安装软件包 libatk-bridge2.0-0。
 google-chrome-stable 依赖于 libatk1.0-0 (>= 1.12.4);然而:
  未安装软件包 libatk1.0-0。
 google-chrome-stable 依赖于 libatspi2.0-0 (>= 2.9.90);然而:
  未安装软件包 libatspi2.0-0。
 google-chrome-stable 依赖于 libcairo2 (>= 1.6.0);然而:
  未安装软件包 libcairo2。
 google-chrome-stable 依赖于 libgdk-pixbuf2.0-0 (>= 2.22.0);然而:
  未安装软件包 libgdk-pixbuf2.0-0。
 google-chrome-stable 依赖于 libgtk-3-0 (>= 3.9.10);然而:
  未安装软件包 li
dpkg: 处理软件包 google-chrome-stable (--install)时出错:
 依赖关系问题 - 仍未被配置
正在处理用于 man-db (2.7.5-1) 的触发器 ...
正在处理用于 mime-support (3.59ubuntu1) 的触发器 ...
在处理时有错误发生:
 google-chrome-stable
root@vps:~# apt-get install google-chrome-stable
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
google-chrome-stable 已经是最新版 (71.0.3578.98-1)。
您可能需要运行“apt-get -f install”来纠正下列错误:

解决办法:

  1. 终端输入sudo apt-get -f install
  2. 重新安装sudo dpkg -i google-chrome-stable_current_amd64.deb

第三个问题

  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

直接在命令行下运行命令google-chrome

发现有如下报错信息:

[5761:5761:0122/031401.376403:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

这个原因是由于是root账户的权限问题,也就是说在root账户下启动chrome不能没有--no-sandbox参数

8.相关阅读