前言 有時候我們些代碼是總發此疑惑? 為什麼別人採集 xx 網站的時候能成功,而我卻總是不返回給數據 出現這種原因時往往是我們沒有給夠偽裝, 被識別了出來~ 就像人,你出門肯定是要穿衣服的對不,如果你不穿! 走在外面,肯定是最顯眼的一個,不抓你抓誰 還有一種就是明明我之前運行成功了,為什麼我現在再次 ...
前言
有時候我們些代碼是總發此疑惑?
為什麼別人採集 xx 網站的時候能成功,而我卻總是不返回給數據
出現這種原因時往往是我們沒有給夠偽裝, 被識別了出來~
就像人,你出門肯定是要穿衣服的對不,如果你不穿!
走在外面,肯定是最顯眼的一個,不抓你抓誰
還有一種就是明明我之前運行成功了,為什麼我現在再次運行時就不行了呢~
而且還甩一句話給我 “系統檢測到您頻繁訪問,請稍後再來”
對於這種情況,我也有一個比喻:
小說里往往會有這樣的霸總,能一夜七次或一次七天,咳咳
總而言之就是對方受不了,發現你不是它的良人,並把你加入了黑名單~
好啦!現在咋們正經的來介紹一下麵對此種情況該如何處理~
要會偽裝,要想想看,人是怎麼訪問網站的
這次我們來說說偽裝 Header ,當你要去爬取某個網站的數據的時候
你要想想看,如果是別人爬取你的數據,你會做什麼操作
你是不是也不想,讓別人隨隨便便就瘋狂請求你的伺服器
你是不是也會,採取一定的措施
比如,我有一個網站,你分析到了我的地址
當你想要通過 python 來爬取的時候...
這邊我來寫一個簡單的可以被請求的例子
from flask import Flask app = Flask(__name__) @app.route('/getInfo') def hello_world(): return "這裡假裝有很多數據" if __name__ == "__main__": app.run(debug=True)
ok ,假設你現在分析到了我的地址了,
也就是可以通過 /getInfo 就可以獲取到小帥b網站上的數據了
你感覺很爽,就開始請求了
url = 'http://127.0.0.1:5000/getInfo' response = requests.get(url) print(response.text)
沒錯,這個時候你確實獲取到數據了
但是!我覺得有點不對勁了,想看看請求的 header 信息
@app.route('/getInfo') def hello_world(): print(request.headers) return "這裡假裝有很多數據" if __name__ == "__main__": app.run(debug=True)
結果看到的 headers 信息是這樣的
Host: 127.0.0.1:5000 User-Agent: python-requests/2.21.0 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive
哇靠
User-Agent: python-requests/2.21.0
居然使用 python 的庫來請求,你說我不封你封誰呢?
所以我這個時候進行判斷,就獲取不到數據了
@app.route('/getInfo') def hello_world(): if(str(request.headers.get('User-Agent')).startswith('python')): return "小子,使用爬蟲是吧?滾你的" else: return "這裡假裝有很多數據" if __name__ == "__main__": app.run(debug=True)
你這個時候的請求
if __name__ == '__main__': url = 'http://127.0.0.1:5000/getInfo' response = requests.get(url) print(response.text)
得到的結果就是
“系統檢測到您頻繁訪問,請稍後再來”
你已經在我面前暴露了,想重新再來,那麼怎麼辦呢?
偽裝自己唄,python 不可以訪問
瀏覽器可以訪問呀,所以你可以修改你的請求頭
先在瀏覽器訪問,然後在抓取數據的時候獲取到 Header 數據
當然你也可以使用 Chrome 的控制面板獲取 Header
有了 Header 信息之後,就可以使用 requests模塊輕鬆獲取
恩,現在的你學會假裝自己是瀏覽器了
if __name__ == '__main__': headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' } url = 'http://127.0.0.1:5000/getInfo' response = requests.get(url,headers=headers) print(response.text)
再獲取一次可以發現,返回的是
這裡假裝有很多數據
ok,你又獲取到數據了
好啦,這篇文章就到這裡啦~對你有幫助就點贊收藏一下吧!