- Python 3反爬蟲原理與繞過實(shí)戰(zhàn)
- 韋世東
- 2628字
- 2021-02-07 09:17:43
1.3 第三方庫(kù)的安裝
在學(xué)習(xí)過程中,我們會(huì)用到很多Python第三方庫(kù)及其關(guān)聯(lián)軟件。在本節(jié)中,我們將介紹這些庫(kù)及其關(guān)聯(lián)軟件的安裝方法。
1.3.1 Requests
爬蟲對(duì)網(wǎng)絡(luò)的請(qǐng)求最為頻繁,所以一個(gè)易用的網(wǎng)絡(luò)請(qǐng)求庫(kù)有助于我們更好地完成工作。Requests是一個(gè)簡(jiǎn)單易用的HTTP請(qǐng)求庫(kù),它是爬蟲工程師常用的庫(kù)之一,其中文文檔網(wǎng)址為https://requests.kennethreitz.org//zh_CN/latest/user/quickstart.html。我們可以通過Python的包管理工具pip安裝該庫(kù),具體命令如下:
$ pip install requests
如果希望安裝指定版本的Requests,可以在安裝庫(kù)的時(shí)候指定版本號(hào),如:
$ pip install requests==2.21.0
它的使用非常簡(jiǎn)單。如果想要對(duì)某個(gè)URI發(fā)出GET請(qǐng)求,只需要使用Requests提供的get()方法即可。我們可以在終端中嘗試:
$ python >>> import requests >>> content = requests.get("http://www.example.com") >>> print(content.status_code) 200 >>>
上述代碼完成了幾件事,首先在終端中進(jìn)入Python命令行模式,接著導(dǎo)入Requests庫(kù),然后向www.example.com發(fā)起GET請(qǐng)求并將網(wǎng)站的響應(yīng)內(nèi)容賦值給content對(duì)象,最后打印輸出本次請(qǐng)求的響應(yīng)狀態(tài)碼。
終端輸出的200就是本次請(qǐng)求的響應(yīng)狀態(tài)碼,這代表本次請(qǐng)求得到了服務(wù)器的響應(yīng)。
1.3.2 Selenium
Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。我們可以通過它驅(qū)動(dòng)瀏覽器執(zhí)行特定的操作,例如點(diǎn)擊、下滑、資源加載與渲染等。
相關(guān)鏈接
? Selenium官方網(wǎng)站:https://www.seleniumhq.org/。
? Selenium官方文檔:https://www.seleniumhq.org/docs/。
? Selenium中文文檔:https://selenium-python-zh.readthedocs.io/en/latest/。
與其他第三方庫(kù)一樣,我們可以使用Python的包管理工具pip安裝Selenium,具體命令如下:
$ pip install selenium
如果此時(shí)終端顯示如下提示:
Successfully installed selenium-3.141.0 urllib3-1.25.3
就代表Selenium安裝成功。
1.3.3 瀏覽器驅(qū)動(dòng)
Selenium安裝成功后,并不能直接調(diào)用瀏覽器,它對(duì)瀏覽器的操控是通過瀏覽器驅(qū)動(dòng)發(fā)出的。不同的瀏覽器對(duì)應(yīng)的驅(qū)動(dòng)不同,例如Chrome瀏覽器的驅(qū)動(dòng)是ChromeDriver,而Firefox瀏覽器的驅(qū)動(dòng)是GeckoDriver。要注意的是,瀏覽器驅(qū)動(dòng)版本必須與計(jì)算機(jī)上的瀏覽器版本對(duì)應(yīng),否則無(wú)法正常使用。
提示如未安裝Chrome瀏覽器,可按照1.4.7節(jié)的指引進(jìn)行安裝。
相關(guān)鏈接
ChromeDriver 下載地址:http://chromedriver.storage.googleapis.com/index.html。
在下載ChromeDriver之前,需要先確認(rèn)Chrome瀏覽器的版本。打開Chrome瀏覽器后點(diǎn)擊其右上角三個(gè)點(diǎn)菜單中的“幫助”選項(xiàng),并選擇“關(guān)于Google Chrome”,即可看到如圖1-18所示的版本信息。

圖1-18 Chrome版本信息
確認(rèn)對(duì)應(yīng)的驅(qū)動(dòng)版本后,打開驅(qū)動(dòng)下載網(wǎng)址下載對(duì)應(yīng)版本的壓縮包。使用如下命令將壓縮包解壓后得到的chromedriver文件復(fù)制到/user/bin/目錄下:
$ sudo mv chromedriver /usr/bin/
接著在終端輸入如下命令,查看ChromeDriver版本號(hào):
$ chromedriver --version
如果此時(shí)終端顯示如下信息:
ChromeDriver 75.0.3770.90 (a6dcaf7e3ec6f70a194cc25e8149475c6590e025-refs/branch-heads/3770@{#1003})
這代表ChromeDriver可以正常使用。剛才提到,瀏覽器版本與驅(qū)動(dòng)版本必須對(duì)應(yīng),否則無(wú)法使用。我們可以通過Python代碼來驗(yàn)證瀏覽器與驅(qū)動(dòng)版本是否匹配,喚起終端并輸入以下內(nèi)容:
$ python >>> from selenium import webdriver >>> browser = webdriver.Chrome()
如果在命令執(zhí)行后喚起如圖1-19所示的瀏覽器窗口,且終端無(wú)報(bào)錯(cuò),則代表瀏覽器與驅(qū)動(dòng)程序匹配,可以正常使用。

圖1-19 瀏覽器窗口
如果出現(xiàn)閃退或者終端報(bào)錯(cuò),提示會(huì)話相關(guān)的信息,那么很有可能是瀏覽器與驅(qū)動(dòng)不匹配,請(qǐng)檢查瀏覽器版本號(hào)與驅(qū)動(dòng)版本號(hào)。
與Chrome瀏覽器不同,F(xiàn)irefox瀏覽器驅(qū)動(dòng)(下載地址:https://github.com/mozilla/geckodriver/releases/)并不需要版本匹配,因?yàn)樗窍蛳录嫒莸模晕覀冎恍枰螺d最新版本的GeckoDriver即可。下載后,同樣需要將驅(qū)動(dòng)文件復(fù)制到/usr/bin/目錄下。然后在終端輸入如下命令即可查看GeckoDriver的版本號(hào):
$ geckodriver --version
控制臺(tái)輸出版本號(hào)相關(guān)的信息則代表驅(qū)動(dòng)可用,否則根據(jù)錯(cuò)誤提示尋找解決辦法。
1.3.4 Splash
Splash是一個(gè)異步的JavaScript渲染服務(wù)。它是帶有HTTP API的輕量級(jí)Web瀏覽器,能夠并行處理多個(gè)頁(yè)面請(qǐng)求,可以在頁(yè)面上下文中執(zhí)行自定義的JavaScript以及模擬瀏覽器中的點(diǎn)擊、下滑等操作。
Splash的安裝方式有兩種,一種是下載已經(jīng)封裝好的Docker鏡像,另一種是從GitHub下載源碼后安裝,這里我推薦第一種安裝方式。在安裝好Docker后,只需要從DockerHub中拉取Splash鏡像并運(yùn)行即可,相關(guān)命令如下:
$ sudo docker run -it -p 8050:8050 scrapinghub/splash
命令中的 -p 8050:8050是將本地的8050端口與Splash鏡像的8050端口進(jìn)行映射。命令運(yùn)行后,在瀏覽器輸入http://localhost:8050,如果看到如圖1-20所示的界面,就代表Splash服務(wù)已經(jīng)正常啟動(dòng)了。

圖1-20 Splash界面
Splash提供了一個(gè)可視化的操作頁(yè)面。在頁(yè)面右側(cè)輸入目標(biāo)網(wǎng)站的URL地址后點(diǎn)擊Render me! 按鈕,在幾秒鐘后就可以看到資源加載信息和頁(yè)面截圖了。
1.3.5 Puppeteer
Puppeteer是谷歌官方出品的一個(gè)Node.js庫(kù),提供了一個(gè)高級(jí)API來控制DevTools協(xié)議上的Chrome或Chromium。Puppeteer默認(rèn)無(wú)界面運(yùn)行,但可以配置為運(yùn)行有界面的Chrome或Chromium。
在用戶瀏覽器中,使用Puppeteer可以完成大多數(shù)手動(dòng)執(zhí)行的操作。有開發(fā)者開源了支持Python的Puppeteer庫(kù),叫作Pyppeteer,其文檔網(wǎng)址為https://miyakogi.github.io/pyppeteer/。要注意的是,它僅支持在Python 3.6 + 的環(huán)境下運(yùn)行。同樣,我們可以使用Python包管理工具pip來安裝Pyppeteer,命令如下:
$ pip install pyppeteer
安裝后,如果終端顯示如下內(nèi)容:
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庫(kù)安裝成功,并提示我們它安裝了一些依賴。
接著我們可以用官方示例代碼驗(yàn)證安裝結(jié)果。新建名為pyteer.py的文件,并在其中寫入如下代碼:
import asyncio from pyppeteer import launch async def main(): # 初始化瀏覽器對(duì)象 browser = await launch() page = await browser.newPage() # 訪問指定url await page.goto('http://example.com') # 打開網(wǎng)址后進(jìn)行截圖并保存在當(dāng)前路徑 await page.screenshot({'path': 'example.png'}) # 關(guān)閉瀏覽器對(duì)象 await browser.close() asyncio.get_event_loop().run_until_complete(main())
然后喚起終端,并在命令行模式下運(yùn)行pyteer.py文件:
$ python pyteer.py
這里要注意的是,第一次運(yùn)行Pyppeteer時(shí),它會(huì)下載最新版本的Chromium(大小約100 MB),所以第一次運(yùn)行的等待時(shí)間較長(zhǎng)。命令運(yùn)行完畢后,在pyteer.py的同級(jí)目錄下就會(huì)多出名為example.png的圖片,如圖1-21所示,這說明Pyppeteer安裝成功,且可以正常運(yùn)行。

圖1-21 example.png
1.3.6 PyTesseract
圖像識(shí)別也是爬蟲工程師經(jīng)常面對(duì)的問題,尤其是驗(yàn)證碼。現(xiàn)在驗(yàn)證碼除少部分需要主觀意識(shí)去判斷和操作以外,大部分依舊是圖形驗(yàn)證碼,如圖1-22所示,這時(shí)候我們就可以使用圖像識(shí)別進(jìn)行處理。

圖1-22 圖形驗(yàn)證碼
OCR(Optical Character Recognition,光學(xué)字符識(shí)別)是指通過掃描字符并檢測(cè)暗、亮的模式確定其形狀,然后用字符識(shí)別方法將形狀翻譯成計(jì)算機(jī)文字的過程。OCR采用光學(xué)方式將紙質(zhì)文檔中的印刷體文字轉(zhuǎn)換成為黑白點(diǎn)陣的圖像文件,并通過識(shí)別軟件將圖像中的文字轉(zhuǎn)換成文本格式,供文字處理軟件進(jìn)一步編輯加工的技術(shù)。
Tesseract是一個(gè)開源文本識(shí)別器引擎,允許開發(fā)者在Apache 2.0許可下使用。它可以直接使用,也可以通過API從圖像中提取文本。Tesseract的安裝說明網(wǎng)址為https://github.com/tesseract-ocr/tesseract/wiki,其中對(duì)于常見操作系統(tǒng)的安裝都有說明。Ubuntu系統(tǒng)對(duì)應(yīng)的安裝命令如下:
$ sudo apt install tesseract-ocr --fix-missing $ sudo apt install libtesseract-dev --fix-missing
Tesseract安裝完成之后,Python還不能直接調(diào)用。我們需要安裝PyTesseract ,它對(duì)谷歌出品的Tesseract-OCR(詳見http://code.google.com/p/tesseract-ocr/)做了一層封裝,是Python中的光學(xué)字符識(shí)別庫(kù)。我們可以用它讀取Python Imaging Library支持的所有圖像類型,包括JPEG、PNG、GIF、BPM和TIFF等。
PyTesseract庫(kù)的使用介紹詳見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庫(kù)安裝成功,并提示我們它安裝了一些依賴。
接著我們可以在使用之前訪問example.com得到的截圖,驗(yàn)證PyTesseract庫(kù)是否可用。新建名為pyocr.py的文件,并將以下代碼寫入文件:
try: from PIL import Image except ImportError: import Image import pytesseract print(pytesseract.image_to_string(Image.open('example.png')))
這段代碼比較簡(jiǎn)單,首先導(dǎo)入Image庫(kù)和PyTesseract庫(kù),接著使用PyTesseract庫(kù)中的image_to_string()方法識(shí)別example.png圖片中的文字,并打印識(shí)別結(jié)果。其運(yùn)行結(jié)果下:
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.
通過與原圖對(duì)比可以看出,PyTesseract庫(kù)的識(shí)別準(zhǔn)確率是比較高的。
- Spring 5.0 By Example
- C語(yǔ)言程序設(shè)計(jì)案例教程(第2版)
- Mastering RabbitMQ
- 認(rèn)識(shí)編程:以Python語(yǔ)言講透編程的本質(zhì)
- Learning Linux Binary Analysis
- Practical DevOps
- PhpStorm Cookbook
- EPLAN實(shí)戰(zhàn)設(shè)計(jì)
- JavaScript 程序設(shè)計(jì)案例教程
- PhoneGap:Beginner's Guide(Third Edition)
- Mastering ROS for Robotics Programming
- SQL 經(jīng)典實(shí)例
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)案例教程
- R語(yǔ)言:邁向大數(shù)據(jù)之路(加強(qiáng)版)
- Python繪圖指南:分形與數(shù)據(jù)可視化(全彩)