Python 3反爬虫原理与绕过实战
上QQ阅读APP看书,第一时间看更新

1.3 第三方库的安装

在学习过程中,我们会用到很多Python第三方库及其关联软件。在本节中,我们将介绍这些库及其关联软件的安装方法。

1.3.1 Requests

爬虫对网络的请求最为频繁,所以一个易用的网络请求库有助于我们更好地完成工作。Requests是一个简单易用的HTTP请求库,它是爬虫工程师常用的库之一,其中文文档网址为https://requests.kennethreitz.org//zh_CN/latest/user/quickstart.html。我们可以通过Python的包管理工具pip安装该库,具体命令如下:

$ pip install requests

如果希望安装指定版本的Requests,可以在安装库的时候指定版本号,如:

$ pip install requests==2.21.0

它的使用非常简单。如果想要对某个URI发出GET请求,只需要使用Requests提供的get()方法即可。我们可以在终端中尝试:

$ python
>>> import requests
>>> content = requests.get("http://www.example.com")
>>> print(content.status_code)
200
>>>

上述代码完成了几件事,首先在终端中进入Python命令行模式,接着导入Requests库,然后向www.example.com发起GET请求并将网站的响应内容赋值给content对象,最后打印输出本次请求的响应状态码。

终端输出的200就是本次请求的响应状态码,这代表本次请求得到了服务器的响应。

1.3.2 Selenium

Selenium是一个用于Web应用程序测试的工具。我们可以通过它驱动浏览器执行特定的操作,例如点击、下滑、资源加载与渲染等。

相关链接

❑ Selenium官方网站:https://www.seleniumhq.org/

❑ Selenium官方文档:https://www.seleniumhq.org/docs/

❑ Selenium中文文档:https://selenium-python-zh.readthedocs.io/en/latest/

与其他第三方库一样,我们可以使用Python的包管理工具pip安装Selenium,具体命令如下:

$ pip install selenium

如果此时终端显示如下提示:

Successfully installed selenium-3.141.0 urllib3-1.25.3

就代表Selenium安装成功。

1.3.3 浏览器驱动

Selenium安装成功后,并不能直接调用浏览器,它对浏览器的操控是通过浏览器驱动发出的。不同的浏览器对应的驱动不同,例如Chrome浏览器的驱动是ChromeDriver,而Firefox浏览器的驱动是GeckoDriver。要注意的是,浏览器驱动版本必须与计算机上的浏览器版本对应,否则无法正常使用。

提示如未安装Chrome浏览器,可按照1.4.7节的指引进行安装。

相关链接

在下载ChromeDriver之前,需要先确认Chrome浏览器的版本。打开Chrome浏览器后点击其右上角三个点菜单中的“帮助”选项,并选择“关于Google Chrome”,即可看到如图1-18所示的版本信息。

图1-18 Chrome版本信息

确认对应的驱动版本后,打开驱动下载网址下载对应版本的压缩包。使用如下命令将压缩包解压后得到的chromedriver文件复制到/user/bin/目录下:

$ sudo mv chromedriver /usr/bin/

接着在终端输入如下命令,查看ChromeDriver版本号:

$ chromedriver --version

如果此时终端显示如下信息:

ChromeDriver 75.0.3770.90
(a6dcaf7e3ec6f70a194cc25e8149475c6590e025-refs/branch-heads/3770@{#1003})

这代表ChromeDriver可以正常使用。刚才提到,浏览器版本与驱动版本必须对应,否则无法使用。我们可以通过Python代码来验证浏览器与驱动版本是否匹配,唤起终端并输入以下内容:

$ python
>>> from selenium import webdriver
>>> browser = webdriver.Chrome()

如果在命令执行后唤起如图1-19所示的浏览器窗口,且终端无报错,则代表浏览器与驱动程序匹配,可以正常使用。

图1-19 浏览器窗口

如果出现闪退或者终端报错,提示会话相关的信息,那么很有可能是浏览器与驱动不匹配,请检查浏览器版本号与驱动版本号。

与Chrome浏览器不同,Firefox浏览器驱动(下载地址:https://github.com/mozilla/geckodriver/releases/)并不需要版本匹配,因为它是向下兼容的,所以我们只需要下载最新版本的GeckoDriver即可。下载后,同样需要将驱动文件复制到/usr/bin/目录下。然后在终端输入如下命令即可查看GeckoDriver的版本号:

$ geckodriver --version

控制台输出版本号相关的信息则代表驱动可用,否则根据错误提示寻找解决办法。

1.3.4 Splash

Splash是一个异步的JavaScript渲染服务。它是带有HTTP API的轻量级Web浏览器,能够并行处理多个页面请求,可以在页面上下文中执行自定义的JavaScript以及模拟浏览器中的点击、下滑等操作。

Splash的安装方式有两种,一种是下载已经封装好的Docker镜像,另一种是从GitHub下载源码后安装,这里我推荐第一种安装方式。在安装好Docker后,只需要从DockerHub中拉取Splash镜像并运行即可,相关命令如下:

$ sudo docker run -it -p 8050:8050 scrapinghub/splash

命令中的 -p 8050:8050是将本地的8050端口与Splash镜像的8050端口进行映射。命令运行后,在浏览器输入http://localhost:8050,如果看到如图1-20所示的界面,就代表Splash服务已经正常启动了。

图1-20 Splash界面

Splash提供了一个可视化的操作页面。在页面右侧输入目标网站的URL地址后点击Render me! 按钮,在几秒钟后就可以看到资源加载信息和页面截图了。

1.3.5 Puppeteer

Puppeteer是谷歌官方出品的一个Node.js库,提供了一个高级API来控制DevTools协议上的Chrome或Chromium。Puppeteer默认无界面运行,但可以配置为运行有界面的Chrome或Chromium。

在用户浏览器中,使用Puppeteer可以完成大多数手动执行的操作。有开发者开源了支持Python的Puppeteer库,叫作Pyppeteer,其文档网址为https://miyakogi.github.io/pyppeteer/。要注意的是,它仅支持在Python 3.6 + 的环境下运行。同样,我们可以使用Python包管理工具pip来安装Pyppeteer,命令如下:

$ pip install pyppeteer

安装后,如果终端显示如下内容:

Successfully built pyppeteer
Installing collected packages: appdirs, pyee, tqdm, urllib3, websockets, pyppeteer
Successfully installed appdirs-1.4.3 pyee-6.0.0 pyppeteer-0.0.25 tqdm-4.32.2
urllib3-1.25.3 websockets-7.0

就代表Pyppeteer库安装成功,并提示我们它安装了一些依赖。

接着我们可以用官方示例代码验证安装结果。新建名为pyteer.py的文件,并在其中写入如下代码:

import asyncio
from pyppeteer import launch

async def main():
    # 初始化浏览器对象
    browser = await launch()
    page = await browser.newPage()
    # 访问指定url
    await page.goto('http://example.com')
    # 打开网址后进行截图并保存在当前路径
    await page.screenshot({'path': 'example.png'})
    # 关闭浏览器对象
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

然后唤起终端,并在命令行模式下运行pyteer.py文件:

$ python pyteer.py

这里要注意的是,第一次运行Pyppeteer时,它会下载最新版本的Chromium(大小约100 MB),所以第一次运行的等待时间较长。命令运行完毕后,在pyteer.py的同级目录下就会多出名为example.png的图片,如图1-21所示,这说明Pyppeteer安装成功,且可以正常运行。

图1-21 example.png

1.3.6 PyTesseract

图像识别也是爬虫工程师经常面对的问题,尤其是验证码。现在验证码除少部分需要主观意识去判断和操作以外,大部分依旧是图形验证码,如图1-22所示,这时候我们就可以使用图像识别进行处理。

图1-22 图形验证码

OCR(Optical Character Recognition,光学字符识别)是指通过扫描字符并检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。OCR采用光学方式将纸质文档中的印刷体文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。

Tesseract是一个开源文本识别器引擎,允许开发者在Apache 2.0许可下使用。它可以直接使用,也可以通过API从图像中提取文本。Tesseract的安装说明网址为https://github.com/tesseract-ocr/tesseract/wiki,其中对于常见操作系统的安装都有说明。Ubuntu系统对应的安装命令如下:

$ sudo apt install tesseract-ocr --fix-missing
$ sudo apt install libtesseract-dev --fix-missing

Tesseract安装完成之后,Python还不能直接调用。我们需要安装PyTesseract ,它对谷歌出品的Tesseract-OCR(详见http://code.google.com/p/tesseract-ocr/)做了一层封装,是Python中的光学字符识别库。我们可以用它读取Python Imaging Library支持的所有图像类型,包括JPEG、PNG、GIF、BPM和TIFF等。

PyTesseract库的使用介绍详见https://pypi.org/project/pytesseract/,其安装命令为:

$ pip install pytesseract

安装完成后,如果终端显示如下信息:

Successfully built pytesseract
Installing collected packages: Pillow, pytesseract
Successfully installed Pillow-6.0.0 pytesseract-0.2.7

就代表PyTesseract库安装成功,并提示我们它安装了一些依赖。

接着我们可以在使用之前访问example.com得到的截图,验证PyTesseract库是否可用。新建名为pyocr.py的文件,并将以下代码写入文件:

try:
    from PIL import Image
except ImportError:
    import Image
import pytesseract

print(pytesseract.image_to_string(Image.open('example.png')))

这段代码比较简单,首先导入Image库和PyTesseract库,接着使用PyTesseract库中的image_to_string()方法识别example.png图片中的文字,并打印识别结果。其运行结果下:

Example Domain
This domain is established to be userd for illustrative examples in documents. You may
use this domain in examples without prior coordination or asking for permission.
More information.

通过与原图对比可以看出,PyTesseract库的识别准确率是比较高的。