Python 爬蟲瀏覽器偽裝技術
- 2020 年 2 月 13 日
- 筆記
瀏覽器偽裝技術

瀏覽器偽裝技術實戰
1 網站常見的反爬蟲和應對方法
- 一般網站從三個方面反爬蟲:
用戶請求的Headers
,用戶行為
,網站目錄和數據載入方式
。 - 前兩種比較容易遇到,大多數網站都從這些角度來反爬蟲。第三種一些應用ajax的網站會採用,這樣增大了爬取的難度。
① 通過Headers反爬蟲
- 從用戶請求的Headers反爬蟲是最常見的反爬蟲策略。
- 很多網站都會對Headers的User-Agent進行檢測,還有一部分網站會對Referer進行檢測(一些資源網站的防盜鏈就是檢測Referer)。
- 對於檢測Headers的反爬蟲,在爬蟲中修改或者添加Headers就能很好的繞過。
- 將瀏覽器的User-Agent複製到爬蟲的Headers中;或者將Referer值修改為目標網站域名。
② 基於用戶行為反爬蟲
- 還有一部分網站是通過檢測用戶行為,例如同一IP短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作。
- 大多數網站都是前一種情況,對於這種情況,使用IP代理就可以解決。
- 對於第二種情況,可以在每次請求後隨機間隔幾秒再進行下一次請求。
- 有些有邏輯漏洞的網站,可以通過請求幾次,退出登錄,重新登錄,繼續請求來繞過同一帳號短時間內不能多次進行相同請求的限制。
③ 動態頁面的反爬蟲
- 大多網站介面都是靜態頁面(即在瀏覽器中查看源程式碼可見),但是還有一部分網站中的數據是後期通過ajax請求(或其他方式如推送技術)得到。
- 解決辦法:首先用Firebug或者Fiddler對網路請求進行分析。找到ajax的請求url,通過Python模擬請求得到需要的數據。
- 但是還有些網站把ajax請求的所有參數全部加密了,針對於這方式我們後面會給大家講解
動態渲染頁面資訊爬取
。
2 請求頭Headers介紹
1)請求(客戶端->服務端[request]) GET(請求的方式) /newcoder/hello.html(請求的目標資源) HTTP/1.1(請求採用的協議和版本號) Accept: */*(客戶端能接收的資源類型) Accept-Language: en-us(客戶端接收的語言類型) Connection: Keep-Alive(維護客戶端和服務端的連接關係) Host: localhost:8080(連接的目標主機和埠號) Referer: http://localhost/links.asp(告訴伺服器我來自於哪裡) User-Agent: Mozilla/4.0(客戶端版本號的名字) Accept-Encoding: gzip, deflate(客戶端能接收的壓縮數據的類型) If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(快取時間) Cookie(客戶端暫存服務端的資訊) Date: Tue, 11 Jul 2000 18:23:51 GMT(客戶端請求服務端的時間) 2)響應(服務端->客戶端[response]) HTTP/1.1(響應採用的協議和版本號) 200(狀態碼) OK(描述資訊) Location: http://www.baidu.com(服務端需要客戶端訪問的頁面路徑) Server:apache tomcat(服務端的Web服務端名) Content-Encoding: gzip(服務端能夠發送壓縮編碼類型) Content-Length: 80(服務端發送的壓縮數據的長度) Content-Language: zh-cn(服務端發送的語言類型) Content-Type: text/html; charset=GB2312(服務端發送的類型及採用的編碼方式) Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服務端對該資源最後修改的時間) Refresh: 1;url=http://www.it315.org(服務端要求客戶端1秒鐘後,刷新,然後訪問指定的頁面路徑) Content-Disposition: attachment; filename=aaa.zip(服務端要求客戶端以下載文件的方式打開該文件) Transfer-Encoding: chunked(分塊傳遞數據到客戶端) Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服務端發送到客戶端的暫存數據) Expires: -1//3種(服務端禁止客戶端快取頁面數據) Cache-Control: no-cache(服務端禁止客戶端快取頁面數據) Pragma: no-cache(服務端禁止客戶端快取頁面數據) Connection: close(1.0)/(1.1)Keep-Alive(維護客戶端和服務端的連接關係) Date: Tue, 11 Jul 2000 18:23:51 GMT(服務端響應客戶端的時間)
3 在requests中設置請求頭Headers
import requests # 代理IP地址 proxy = {'HTTP':'117.85.105.170:808','HTTPS':'117.85.105.170:808'} # header頭資訊 headers = { 'Host': 'blog.csdn.net', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Referer': 'http://www.baidu.com', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', } # 請求url地址 url = "http://blog.csdn.net" # 提交請求爬取資訊 response = requests.get(url,headers=headers,proxies=proxy) # 獲取響應碼 print(response.status_code)
- 瀏覽器用戶代理池資訊
user_agents = [ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11', 'Opera/9.25 (Windows NT 5.1; U; en)', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)', 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12', 'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9', 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7', 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0', ] import random agent = random.choice(user_agents) # 隨機獲取一個瀏覽器用戶資訊
END
歲月有你,惜惜相處