Python 爬虫浏览器伪装技术
瀏覽器偽裝技術(shù)實(shí)戰(zhàn)
1 網(wǎng)站常見(jiàn)的反爬蟲(chóng)和應(yīng)對(duì)方法
- 一般網(wǎng)站從三個(gè)方面反爬蟲(chóng):用戶請(qǐng)求的Headers,用戶行為,網(wǎng)站目錄和數(shù)據(jù)加載方式。
- 前兩種比較容易遇到,大多數(shù)網(wǎng)站都從這些角度來(lái)反爬蟲(chóng)。第三種一些應(yīng)用ajax的網(wǎng)站會(huì)采用,這樣增大了爬取的難度。
① 通過(guò)Headers反爬蟲(chóng)
-
從用戶請(qǐng)求的Headers反爬蟲(chóng)是最常見(jiàn)的反爬蟲(chóng)策略。
-
很多網(wǎng)站都會(huì)對(duì)Headers的User-Agent進(jìn)行檢測(cè),還有一部分網(wǎng)站會(huì)對(duì)Referer進(jìn)行檢測(cè)(一些資源網(wǎng)站的防盜鏈就是檢測(cè)Referer)。
-
對(duì)于檢測(cè)Headers的反爬蟲(chóng),在爬蟲(chóng)中修改或者添加Headers就能很好的繞過(guò)。
-
將瀏覽器的User-Agent復(fù)制到爬蟲(chóng)的Headers中;或者將Referer值修改為目標(biāo)網(wǎng)站域名。
② 基于用戶行為反爬蟲(chóng)
- 還有一部分網(wǎng)站是通過(guò)檢測(cè)用戶行為,例如同一IP短時(shí)間內(nèi)多次訪問(wèn)同一頁(yè)面,或者同一賬戶短時(shí)間內(nèi)多次進(jìn)行相同操作。
- 大多數(shù)網(wǎng)站都是前一種情況,對(duì)于這種情況,使用IP代理就可以解決。
- 對(duì)于第二種情況,可以在每次請(qǐng)求后隨機(jī)間隔幾秒再進(jìn)行下一次請(qǐng)求。
- 有些有邏輯漏洞的網(wǎng)站,可以通過(guò)請(qǐng)求幾次,退出登錄,重新登錄,繼續(xù)請(qǐng)求來(lái)繞過(guò)同一賬號(hào)短時(shí)間內(nèi)不能多次進(jìn)行相同請(qǐng)求的限制。
③ 動(dòng)態(tài)頁(yè)面的反爬蟲(chóng)
-
大多網(wǎng)站界面都是靜態(tài)頁(yè)面(即在瀏覽器中查看源代碼可見(jiàn)),但是還有一部分網(wǎng)站中的數(shù)據(jù)是后期通過(guò)ajax請(qǐng)求(或其他方式如推送技術(shù))得到。
-
解決辦法:首先用Firebug或者Fiddler對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行分析。找到ajax的請(qǐng)求url,通過(guò)Python模擬請(qǐng)求得到需要的數(shù)據(jù)。
-
但是還有些網(wǎng)站把a(bǔ)jax請(qǐng)求的所有參數(shù)全部加密了,針對(duì)于這方式我們后面會(huì)給大家講解動(dòng)態(tài)渲染頁(yè)面信息爬取。
2 請(qǐng)求頭Headers介紹
1)請(qǐng)求(客戶端->服務(wù)端[request])
GET(請(qǐng)求的方式) /newcoder/hello.html(請(qǐng)求的目標(biāo)資源) HTTP/1.1(請(qǐng)求采用的協(xié)議和版本號(hào))Accept: */*(客戶端能接收的資源類(lèi)型)Accept-Language: en-us(客戶端接收的語(yǔ)言類(lèi)型)Connection: Keep-Alive(維護(hù)客戶端和服務(wù)端的連接關(guān)系)Host: localhost:8080(連接的目標(biāo)主機(jī)和端口號(hào))Referer: http://localhost/links.asp(告訴服務(wù)器我來(lái)自于哪里)User-Agent: Mozilla/4.0(客戶端版本號(hào)的名字)Accept-Encoding: gzip, deflate(客戶端能接收的壓縮數(shù)據(jù)的類(lèi)型)If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(緩存時(shí)間)Cookie(客戶端暫存服務(wù)端的信息)Date: Tue, 11 Jul 2000 18:23:51 GMT(客戶端請(qǐng)求服務(wù)端的時(shí)間)2)響應(yīng)(服務(wù)端->客戶端[response])
HTTP/1.1(響應(yīng)采用的協(xié)議和版本號(hào)) 200(狀態(tài)碼) OK(描述信息)Location: http://www.baidu.com(服務(wù)端需要客戶端訪問(wèn)的頁(yè)面路徑)Server:apache tomcat(服務(wù)端的Web服務(wù)端名)Content-Encoding: gzip(服務(wù)端能夠發(fā)送壓縮編碼類(lèi)型)Content-Length: 80(服務(wù)端發(fā)送的壓縮數(shù)據(jù)的長(zhǎng)度)Content-Language: zh-cn(服務(wù)端發(fā)送的語(yǔ)言類(lèi)型)Content-Type: text/html; charset=GB2312(服務(wù)端發(fā)送的類(lèi)型及采用的編碼方式)Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服務(wù)端對(duì)該資源最后修改的時(shí)間)Refresh: 1;url=http://www.it315.org(服務(wù)端要求客戶端1秒鐘后,刷新,然后訪問(wèn)指定的頁(yè)面路徑)Content-Disposition: attachment; filename=aaa.zip(服務(wù)端要求客戶端以下載文件的方式打開(kāi)該文件)Transfer-Encoding: chunked(分塊傳遞數(shù)據(jù)到客戶端)Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服務(wù)端發(fā)送到客戶端的暫存數(shù)據(jù))Expires: -1//3種(服務(wù)端禁止客戶端緩存頁(yè)面數(shù)據(jù))Cache-Control: no-cache(服務(wù)端禁止客戶端緩存頁(yè)面數(shù)據(jù))Pragma: no-cache(服務(wù)端禁止客戶端緩存頁(yè)面數(shù)據(jù))Connection: close(1.0)/(1.1)Keep-Alive(維護(hù)客戶端和服務(wù)端的連接關(guān)系)Date: Tue, 11 Jul 2000 18:23:51 GMT(服務(wù)端響應(yīng)客戶端的時(shí)間)3 在requests中設(shè)置請(qǐng)求頭Headers
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' 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', } # 請(qǐng)求url地址 url = "http://blog.csdn.net"# 提交請(qǐng)求爬取信息 response = requests.get(url,headers=headers,proxies=proxy)# 獲取響應(yīng)碼 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) # 隨機(jī)獲取一個(gè)瀏覽器用戶信息總結(jié)
以上是生活随笔為你收集整理的Python 爬虫浏览器伪装技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python:直接插入和简单选择排序
- 下一篇: Python 内存分配时的小秘密