溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python之常用反爬蟲措施和解決辦法的案例分析

發(fā)布時間:2020-09-18 09:16:31 來源:億速云 閱讀:123 作者:小新 欄目:編程語言

這篇文章主要介紹Python之常用反爬蟲措施和解決辦法的案例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一、防盜鏈

這次我遇到的防盜鏈,除了前面說的Referer防盜鏈,還有Cookie防盜鏈和時間戳防盜鏈。Cookie防盜鏈常見于論壇、社區(qū)。當訪客請求一個資源的時候,他會檢查這個訪客的Cookie,如果不是他自己的用戶的Cookie,就不會給這個訪客正確的資源,也就達到了防盜的目的。時間戳防盜鏈指的是在他的url后面加上一個時間戳參數(shù),所以如果你直接請求網(wǎng)站的url是無法得到真實的頁面的,只有帶上時間戳才可以。

這次的例子是天涯社區(qū)的圖片分社區(qū):

Python之常用反爬蟲措施和解決辦法的案例分析

這里我們先打開開發(fā)者工具,然后任意選擇一張圖片,得到這個圖片的鏈接,然后用requests來下載一下這張圖片,注意帶上Referer字段,看結(jié)果如何:

import requests
url = "http://img3.laibafile.cn/p/l/305989961.jpg"
headers = {
    "Referer": "http://pp.tianya.cn/",
    "UserAgent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 
    Safari/537.36"
}
res = requests.get(url)
with open('test.jpg', 'wb') as f:
    f.write(res.content)

我們的爬蟲正常運行了,也看到生成了一個test.jpg文件,先別急著高興,打開圖片看一下:

Python之常用反爬蟲措施和解決辦法的案例分析

一口老血吐了出來,竟然還有這種套路!怎么辦呢?往下看!

解決辦法:

既然他說僅供天涯社區(qū)用戶分享,那我們也成為他的用戶不就行了嗎?二話不說就去注冊了個賬號,然后登錄,再拿到登錄后的Cookie:

__auc=90d515c116922f9f856bd84dd81; Hm_lvt_80579b57bf1b16bdf88364b13221a8bd=1551070001,1551157745; 
user=w=EW2QER&id=138991748&f=1; right=web4=n&portal=n; td_cookie=1580546065; __cid=CN; 
Hm_lvt_bc5755e0609123f78d0e816bf7dee255=1551070006,1551157767,1551162198,1551322367; time=ct=1551322445.235; 
__asc=9f30fb65169320604c71e2febf6; Hm_lpvt_bc5755e0609123f78d0e816bf7dee255=1551322450; __u_a=v2.2.4; 
sso=r=349690738&sid=&wsid=71E671BF1DF0B635E4F3E3E41B56BE69; 
temp=k=674669694&s=&t=1551323217&b=b1eaa77438e37f7f08cbeffc109df957&ct=1551323217&et=1553915217; 
temp4=rm=ef4c48449946624e9d7d473bc99fc5af; u_tip=138991748=0

注意:Cookie是有時效性的,具體多久就會失效我沒測試。緊接著把Cookie添加到代碼中,然后運行,可以看到成功把圖片下載下來了:

Python之常用反爬蟲措施和解決辦法的案例分析

搞了這么久才下了一張圖片,我們怎么可能就這么滿足呢?分析頁面可知一個頁面上有十五張圖片,然后往下拉的時候會看到"正在加載,請稍后":

Python之常用反爬蟲措施和解決辦法的案例分析

我們立馬反應(yīng)過來這是通過AJAX來加載的,于是打開開發(fā)者工具查看,可以找到如下內(nèi)容:

Python之常用反爬蟲措施和解決辦法的案例分析

可以看到每個鏈接“?”前面的部分都是基本一樣的,“l(fā)ist_”后面跟的數(shù)字表示頁數(shù),而“_=”后面這一串數(shù)字是什么呢?有經(jīng)驗的人很快就能意識到這是一個時間戳,所以我們來測試一下:

import time
import requests
t = time.time()*1000
url = "http://pp.tianya.cn/qt/list_4.shtml?_={}".format(t)
res = requests.get(url)
print(res.text)

運行之后得到了我們想要的結(jié)果?,F(xiàn)在我們已經(jīng)能用代碼構(gòu)造鏈接了,那我們怎么知道最多有多少頁呢?我們先繼續(xù)拖動滾輪下拉頁面,發(fā)現(xiàn)出現(xiàn)第5頁之后就沒有了:

Python之常用反爬蟲措施和解決辦法的案例分析

這怎么辦呢?不急,我們不是已經(jīng)能自己構(gòu)造鏈接了嘛,我們可以通過改變“l(fā)ist”后面的數(shù)字來得到更多的頁面啊。不過我自己測試的結(jié)果是最多只有15頁,之后再怎么增大數(shù)字也沒用了,應(yīng)該是服務(wù)器做了限制,最多只給15頁的數(shù)據(jù)。下圖是我把數(shù)字改為16后返回的結(jié)果:

Python之常用反爬蟲措施和解決辦法的案例分析

最后編寫程序并運行,就能把圖片下載下來了:

Python之常用反爬蟲措施和解決辦法的案例分析

完整代碼已上傳到GitHub!

二.隨機化網(wǎng)頁源碼

用display:none來隨機化網(wǎng)頁源碼,有網(wǎng)站還會隨機類和id的名字,然后再加點隨機的tr和td,這樣的話就增大了我們解析的難度。比如全網(wǎng)代理IP:

Python之常用反爬蟲措施和解決辦法的案例分析

解決辦法:

可以看到每個IP都是包含在一個class為“ip”的td里的,所以我們可以先定位到這個td,然后進行下一步解析。雖然這個td里面包含了很多的span標簽和p標簽,而且也每個標簽的位置也沒有什么規(guī)律,不過還是有辦法解析的。方法就是把這個td里的所有文字提取出來,然后把那些前后重復(fù)的部分去除掉,最后拼接到一起就可以了,代碼如下:

et = etree.HTML(html)  # html:網(wǎng)頁源碼
for n in range(1, 21):
    lst = et.xpath('//table/tbody/tr[{}]/td[1]//text()'.format(n))
    proxy = ""
    for i in range(len(lst) - 1):
        if lst[i] != lst[i + 1]:
            proxy += lst[i]
    proxy += lst[-1]
    print(proxy)

最后就能得到我們想要的數(shù)據(jù)了。不過我們得到的端口數(shù)據(jù)和網(wǎng)頁上顯示的數(shù)據(jù)是不一樣的,這是因為端口數(shù)據(jù)是經(jīng)過了JS混淆的,至于怎么破解,下次會分享出來。

以上是Python之常用反爬蟲措施和解決辦法的案例分析的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI