反爬與反反爬


很多網站都有反爬機制,自從有了爬蟲,反爬與反反爬的斗爭就沒停過,而且都在不斷升級。

下面介紹一些常見的反爬與反反爬機制。

 

基於headers的反爬

基於用戶請求的headers反爬是最常見的反爬機制。

在請求頭headers中,包含很多鍵值對,服務器會根據這些鍵值對進行反爬。

1. User-Agent:請求使用的終端,正常為瀏覽器,如果使用爬蟲,就會顯示如python

反反爬策略:偽裝瀏覽器

即在爬蟲中添加headers,並在headers中添加瀏覽器

並且可通過頻繁更換user-agent實現反爬

header={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}

2. referer:防盜鏈

盜鏈:其他站點通過超鏈接等連接到我們的站點竊取我們的資源的行為稱為盜鏈

referer請求頭:代表當前訪問是從哪個網頁過來的

如我們的網站上有一個很好的圖片,別人可以通過查看我們的鏈接直接用到他的網站上,此時我們如果設置referer,他就無法直接使用

具體解釋請自行百度。

反反爬策略:在headers中添加防盜鏈,通過抓包查看具體值

request.add_header('Referer', 'http://www.abwuliu.com/login.html')

 

基於用戶行為的反爬

檢測用戶的行為是否正常,如訪問頻率

1. 拉黑IP:檢測同一IP的訪問頻率,如果訪問過快,就封IP

反反爬策略:

a. 減緩訪問頻率

b. 使用代理訪問,正向代理,我會在其他博客詳細介紹

c. 使用特殊IP,如學習的公網IP,但有些不行的

d. 利用服務器的反向代理進行爬取,前提是知道web服務器的反向代理

2. 拉黑賬號:如果同一賬號短時間內多次執行某操作,就封賬戶

反反爬策略:

a. 減緩訪問頻率

b. 執行幾次操作后,退出,重新登錄

c. 建立 cookie 池,切換登錄

 

基於動態頁面的反爬

使用動態網頁,動態生成數據,或者動態加載,無法從源碼直接查看數據

1. ajax:在后台與服務器交換數據,在不更新整個頁面的情況下,實現頁面局部更新,是一種異步加載的方法,用js和xml實現。

xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();

反反爬策略:

a. 通過抓包觀察ajax的請求方式,模擬該請求方式進行網頁爬取

如豆瓣電影排行榜,初始頁面有一些電影,當下滑到底部時,頁面會自動加載更多的電影

分析:

右下角 XMLHttpRequest 請求,說明是ajax。

左上角是請求url:https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=40&limit=20

通過start和limit兩個參數訪問頁面

這種情況是比較簡單的,但通常會有更高級的異步加載,如數據加密。

 

b. 模擬瀏覽器:selenium,模擬人來直接操縱瀏覽器。

通常還可以用phantomJS作為輔助工具,phantomJS其實是個沒有界面的瀏覽器。

這個工具可以設置環境變量,在程序里直接調用,具體請百度。

 

基於驗證碼的反爬

反反爬策略:

a. 半自動識別:爬取驗證碼圖片,在本地查看,並輸入,其他同普通爬蟲,無法解決大規模爬蟲問題

b. 通過第三方平台識別驗證碼:如雲打碼http://www.yundama.com/demo.html

c. 圖像識別

 

基於加密的反爬

大多是通過js來對數據進行加密

反反爬策略:

a. 找到對應的js代碼,自己實現其加密算法

b. 用PyV8,execjs等庫執行js代碼

c. selenimu模擬瀏覽器

 

還有一些經常遇到的爬蟲的挑戰。

基於post的爬蟲

需要提交一些參數給服務器

data={'x':'aaa','y':'123','code':'','error_num':0}
dataEncode=urllib.urlencode(data)
request=urllib2.Request(url,dataEncode,header)

 

基於登錄的爬蟲

1. 提交用戶名密碼,同post,但是很多網站在登錄時會隱形的添加一些參數,如除了用戶名密碼外,還提交一個隨機數,或者隱形的變換你提交的參數,如你提交的是123,自動轉換成a123,等等諸多手段,需要通過抓包來查看真實提交的參數

2. 利用cookie進行登錄,我會在其他博客詳細介紹

cj=cookielib.CookieJar()
pro=urllib2.HTTPCookieProcessor(cj)
opener=urllib2.build_opener(pro)
urllib2.install_opener(opener)
request=urllib2.Request(url,dataEncode,header)

3. 跳轉url

登錄url和接收數據的url不是同一個url

login_url = "http://passport.jd.com/uc/login"
post_url = "http://passport.jd.com/uc/loginService"

而且還有多個url跳轉,post-get跳轉,需要借助抓包仔細觀察。

4. 經常變換登錄方式

 

總結

道高一尺,魔高一丈,反爬技術在不斷升級,但總有對應的反反爬機制,然而萬變不離其宗,基礎道理與方法都一致,解決具體問題時稍加研究即可。

 

 

 

參考資料:

https://blog.csdn.net/dreamli1314/article/details/78848356  通過referer請求頭實現防盜鏈

https://www.csdn.net/gather_28/MtjaQg4sMDc5LWJsb2cO0O0O.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM