文中案例參考 GitHub項目
2 信息驗證型反爬蟲
2.1 User-Agent反爬蟲
- User-Agent是用戶身份識別的重要信息,User-Agent中包含用戶瀏覽器、瀏覽器引擎、操作系統等信息
- python的requests庫請求時候,服務器讀取到的User-Agent信息就是 python-requests/2.21.0
- User-Agent反爬蟲:
- nginx中加入User-Agent檢測,將python,Java,PHP等一些關鍵詞都加入到黑名單中
- 檢測時候,發現含有這些關鍵詞,就認定爲是爬蟲程序
- 除了User-Agent頭部信息,常用的還有Host,Referer頭部信息
-
- Host 描述請求將被髮送的目的地,只含域名和端口號;
-
- Origin 請求是從哪裏發起的,包括域名和端口號,這個參數一般存在於CORS跨域請求中,
可以看到response有對應的header: Access-Control-Allow-Origin
- Origin 請求是從哪裏發起的,包括域名和端口號,這個參數一般存在於CORS跨域請求中,
-
- Referer 告知服務器請求的原始資源的URI,其用於所有類型的請求,包括:協議+域名+查詢參數
-
2.2 Cookies反爬蟲
- 服務器端,一般是Nginx中加入檢測請求頭信息中是否有http_cookie信息,然後返回不同的結果。
- 瀏覽器正常請求網頁,服務器返回的cookie會自動保存在本地,下次訪問時候會自動攜帶
- 沒有攜帶cookie訪問,返回結果都是重定向,一般都是重定向30x,一般都是定位到首頁或者登陸頁面
2.3 簽名驗證反爬蟲
-
JavaScript異步動態請求類型一般都是xhr(ajax封裝對象),可以在請求裏面查找類型爲xhr的請求,請求源一般都是js文件
-
請求正文內容裏面有特徵值是32位(一般是MD5加密後字段),一般可以大膽猜測就是簽名驗證反爬蟲,
-
加密內容都是使用JavaScript裏面的函數生成的,通過進js文件搜索關鍵字,就可以找到加密字段的生成方式
-
案例1:
-
訪問一下網址,然後點擊查看詳情
- http://www.porters.vip/verify/sign/
- 上述網址,點擊查看詳情,查看network
- 下面網址就是動態加密生成的,直接複製去請求是無效的,網址有多個參數還有時間戳,直接瀏覽器再次去請求就是無效的
- http://www.porters.vip/verify/sign/fet?actions=31288&tim=1583827827&randstr=JUBMB&sign=1f46e27e48caacc155fbf9afde6bbbc0
- 動態加密請求,就是需要破解動態網址是如何生成的
- 點擊查看詳情,network裏面有一個fet…開頭的網址請求,類型是xhr(ajax封裝的對象)
-
查看網址,點擊查看詳情位置,參考圖片005,發現onclick綁定一個fetch()函數
- 表明點擊後執行該函數,函數都是放在js代碼裏面,head裏面發現引入了兩個自定義的js文件
- Chrome檢查,查看,右鍵在js文件上,open in new tab
- 查看fetch()函數具體內容,函數訪問一個動態生成的網址,網頁內容插入替換原始網頁id="content"標籤的內容
- 然後我們在python中實現該真實網址的生成方式
-
案例2:
-
有道翻譯加密分析:
- 打開有道翻譯,輸入中國,network裏面出現一個xhr類型的post請求,請求源Initiator是一個js文件
- post請求,Request URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
- 請求體的formdata裏面有很多參數,i就是要翻譯的字符串
- 加密的參數進請求源js文件裏面搜索,可以找到參數的生成方式
- 具體參考006圖片
- 實際有道翻譯加密只需要保留formdata中的i和doctype就可以獲取翻譯後的json數據,直接忽略加密內容
- 參考006案例
2.4 js動態請求補充:
-
網頁源碼中(Name,Status,Type,Initiator,Size,Time,Waterfall)的含義
- 第一列 Name :請求的名稱,一般會將URL 最後一部分內容當作名稱
- 第二列 Status :響應的狀態碼,顯示爲 200 代表響應是正常的 通過狀態碼,我們可以判斷髮送了請求之後是否得到了正常的響應 。
- 第三列 Type: 請求的文檔類型 。這裏爲 document ,代表我們這次請求的是 HTML 文檔, 內容就是一些 HTML 代碼。
- 第四列 Initiator: 請求源。 用來標記請求是由哪個對象或進程發起的
- 第五列 Size : 從服務器下載的文件和請求的資源大小。 如果是從緩存中取得的資源,則該列 會顯示from cache。
- 第六列 Time : 發起請求到獲取響應所用的總時間
- 第七列 Waterfall:網絡請求的可視化瀑布流
-
動態ajax請求一般是xhr類型
-
xhr:XMLHttpRequest在後臺與服務器交換數據,這意味着可以在不加載整個網頁的情況下,對網頁某部分的內容進行更新。
是Ajax的一種用法,而Ajax並不是一門語言,只是一種不需要加載整個網頁,只是更新局部內容的技術。 -
案例:
-
比較常見的就是網頁內容繁多,我們僅僅看評論時,無需整個頁面都加載,
-
那麼就可以採用這種方式來實現,只需要在翻頁時,局部加載評論的內容即可。
-
-
js(ajax)動態請求
- 1、在使用Chrome或者firebug抓取類似網頁的內容時,只需要找到xhr類型的url地址,Initiator請求源一般是一個js文件
- 2、在瀏覽器地址欄中打開即可看到對應的內容。
- 3、一般情況爲json格式,
- 4、再利用python等語言抓取json中的需要的內容即可
3 動態渲染反爬蟲
3.1 Selenium工具
- 工具1:Selenium + Chrome + 驅動器 三件套抓取動態渲染網頁
- 缺點:執行效率低,佔用系統資源大,不能異步請求
3.2 Puppeteer工具
- 工具2:Puppeteer(python中的庫叫pyppeteer)
- 安裝:
-
安裝命令:
pip install pyppeteer
python -m pip install pyppeteer -
從GIT安裝最新版本:python -m pip install -U git+https://github.com/miyakogi/pyppeteer.git@dev
-
推薦安裝方式:
- 第一步:需要先安裝支持庫 pip install tdqm
- 第二步:pip install pyppeteer
- 第三步:含有pyppeteer的代碼運行時候,會自動下載chromium解壓安裝(Chrome的實驗版)
-
- 參考案例008
3.3 Splash異步渲染服務
-
Splash是一個異步的JavaScript的渲染服務,它帶有HTTP API的輕量級Web服務器。
-
可視化界面地址:http://www.porters.vip:8050/
-
上面地址輸入網址,然後render me就可以獲取網頁的截圖、資源加載數據、HTML原始文本
-
腳本里面也可以自己編寫,但是使用的是Lua語言
-
參考009圖片
-
Splash服務也可以和Python語言結合使用
-
參考案例009
-
上面三種渲染工具對比:
- Selenium套件通過驅動瀏覽器執行操作,本質上是模擬瀏覽器操作
- Puppeteer實際上通過API控制Chromium或者Chrome瀏覽器
- Splash基於開源的瀏覽器引擎WebKit