python 常見(jiàn)的反爬蟲(chóng)策略
1、判斷請(qǐng)求頭來(lái)進(jìn)行反爬
這是很早期的網(wǎng)站進(jìn)行的反爬方式
User-Agent 用戶代理
referer 請(qǐng)求來(lái)自哪里
cookie 也可以用來(lái)做訪問(wèn)憑證
解決辦法:請(qǐng)求頭里面添加對(duì)應(yīng)的參數(shù)(復(fù)制瀏覽器里面的數(shù)據(jù))
2、根據(jù)用戶行為來(lái)進(jìn)行反爬
請(qǐng)求頻率過(guò)高,服務(wù)器設(shè)置規(guī)定時(shí)間之內(nèi)的請(qǐng)求閾值
解決辦法:降低請(qǐng)求頻率或者使用代理(IP代理)
網(wǎng)頁(yè)中設(shè)置一些陷阱(正常用戶訪問(wèn)不到但是爬蟲(chóng)可以訪問(wèn)到)
解決辦法:分析網(wǎng)頁(yè),避開(kāi)這些特殊陷阱
請(qǐng)求間隔太短,返回相同的數(shù)據(jù)
解決辦法:增加請(qǐng)求間隔
3、js加密
反爬方式中較為難處理的一類。
js加密的原理:服務(wù)器響應(yīng)給瀏覽器的js文件,可以動(dòng)態(tài)的生成一些加密參數(shù),瀏覽器會(huì)根據(jù)js的計(jì)算 得到這些參數(shù),在請(qǐng)求中帶入進(jìn)來(lái),如果請(qǐng)求中沒(méi)有這些參數(shù),那么服務(wù)器就任務(wù)請(qǐng)求無(wú)效。
4、字體加密
字體反爬,是一種常見(jiàn)的反爬技術(shù),網(wǎng)站采用了自定義的字體文件,在瀏覽器上正常顯示,但是爬蟲(chóng)抓取下來(lái)的數(shù)據(jù)要么就是亂碼,要么就是變成其他字符。采用自定義字體文件是CSS3的新特性,熟悉前端的同學(xué)可能知道,就是font-face屬性。
5、登錄驗(yàn)證碼
使用Python爬取網(wǎng)頁(yè)內(nèi)容時(shí)往往會(huì)遇到使用驗(yàn)證碼登陸才能訪問(wèn)其網(wǎng)站,不同網(wǎng)站的使用的驗(yàn)證碼也不同,在最開(kāi)始使用簡(jiǎn)單驗(yàn)證碼,識(shí)別數(shù)字,但是隨著反爬的不斷發(fā)展,慢慢設(shè)計(jì)出了更多復(fù)雜的驗(yàn)證碼,比如:內(nèi)容驗(yàn)證碼、滑動(dòng)驗(yàn)證碼、圖片拼接驗(yàn)證碼等等。
網(wǎng)上有很多打碼平臺(tái),通過(guò)注冊(cè)賬號(hào),調(diào)用平臺(tái)接口,進(jìn)行驗(yàn)證碼的驗(yàn)證。
6、md5相關(guān)知識(shí)
MD5,消息摘要算法,一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。MD5是最常見(jiàn)的摘要算法,速度很快,生成結(jié)果是固定的128 bit字節(jié),通常用一個(gè)32位的16進(jìn)制字符串表示。MD5的特點(diǎn):
1.不可逆:不能從密文推導(dǎo)出明文。
2.不管明文長(zhǎng)度為多少,密文的長(zhǎng)度都固定。
3.密文之間不會(huì)重復(fù)。
import hashlib print(hashlib.md5('python'.encode()).hexdigest())
字符串python加密后的結(jié)果:
23eeeb4347bdd26bfc6b7ee9a3b755dd
7、base64
Base64是網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法。Base64編碼是從二進(jìn)制到字符的過(guò)程,可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息。采用Base64編碼具有不可讀性,需要解碼后才能閱讀。
import base64 #python中base64的加密 print(base64.b64encode('python'.encode()).decode()) #python中base64的解密 print(base64.b64decode('Y2hpbmE='.encode()).decode())
結(jié)果:
cHl0aG9u
china
二、驗(yàn)證碼驗(yàn)證
自己動(dòng)手看驗(yàn)證碼(古詩(shī)詞網(wǎng))
import requests url = "gushiwen.org" session = requests.Session() text = session.get(url).text # 解析響應(yīng),找到驗(yàn)證碼的圖片地址, # 下載驗(yàn)證碼圖片,保存 with open('code.jpg', 'wb')as f: f.write('驗(yàn)證碼的url地址'.encode()) code = input('驗(yàn)證碼是: ') login_url = "login.com" data = { "username": 'xx', "password": 'xx', "code": code } requests.post(url, data=data)
使用打碼平臺(tái)(圖鑒)
新建一個(gè)captcha_api.py
import json import requests import base64 from io import BytesIO from PIL import Image from sys import version_info def base64_api(uname, pwd, img): img = img.convert('RGB') buffered = BytesIO() img.save(buffered, format="JPEG") if version_info.major >= 3: b64 = str(base64.b64encode(buffered.getvalue()), encoding='utf-8') else: b64 = str(base64.b64encode(buffered.getvalue())) data = {"username": uname, "password": pwd, "image": b64} result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text) if result['success']: return result["data"]["result"] else: return result["message"] return "" def request_captcha(uname, pwd, img_path): img_path = img_path # 待驗(yàn)證的驗(yàn)證碼路徑 img = Image.open(img_path) result = base64_api(uname, pwd, img) # 傳入賬號(hào) 密碼 和圖片 print(result)
新建use_code.py,調(diào)用接口
img_path = '圖片路徑' from captcha_api import request_captcha ret = request_captcha("賬號(hào)", "密碼", img_path)
以上就是python 常見(jiàn)的反爬蟲(chóng)策略的詳細(xì)內(nèi)容,更多關(guān)于python反爬蟲(chóng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Python編寫(xiě)一個(gè)簡(jiǎn)單的端口掃描器
端口掃描是非常實(shí)用的,不止用在信息安全方面,日常的運(yùn)維也用得到。本文將利用Python編寫(xiě)一個(gè)簡(jiǎn)單的端口掃描器,需要的可以參考一下2022-04-04Selenium及python實(shí)現(xiàn)滾動(dòng)操作多種方法
這篇文章主要介紹了Selenium及python實(shí)現(xiàn)滾動(dòng)操作多種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07python 自動(dòng)批量打開(kāi)網(wǎng)頁(yè)的示例
今天小編就為大家分享一篇python 自動(dòng)批量打開(kāi)網(wǎng)頁(yè)的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02簡(jiǎn)單實(shí)例帶你了解Python的編譯和執(zhí)行全過(guò)程
python 是一種解釋型的編程語(yǔ)言,所以不像編譯型語(yǔ)言那樣需要顯式的編譯過(guò)程。然而,在 Python 代碼執(zhí)行之前,它需要被解釋器轉(zhuǎn)換成字節(jié)碼,這個(gè)過(guò)程就是 Python 的編譯過(guò)程,還不知道的朋友快來(lái)看看吧2023-04-04Python實(shí)現(xiàn)快速大文件比較代碼解析
這篇文章主要介紹了Python實(shí)現(xiàn)快速大文件比較代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Python使用open函數(shù)的buffering設(shè)置文件緩沖方式
這篇文章主要介紹了Python使用open函數(shù)的buffering設(shè)置文件緩沖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Pandas時(shí)間序列:時(shí)期(period)及其算術(shù)運(yùn)算詳解
今天小編就為大家分享一篇Pandas時(shí)間序列:時(shí)期(period)及其算術(shù)運(yùn)算詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02