版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第python反反爬蟲技術(shù)限制連續(xù)請求時間處理目錄前言用勾子函數(shù)根據(jù)緩存行為設(shè)置訪問時間爬蟲相關(guān)庫1.爬蟲常用的測試網(wǎng)站:2.requests-cache為原有代碼微創(chuàng)式添加緩存功能緩存的清空和識別自定義設(shè)置緩存的形式自定義設(shè)置緩存的例子1:設(shè)置緩存文件類型自定義設(shè)置緩存的例子2:設(shè)置緩存保存內(nèi)容
前言
一般的反爬措施是在多次請求之間增加隨機的間隔時間,即設(shè)置一定的延時。但如果請求后存在緩存,就可以省略設(shè)置延遲,這樣一定程度地縮短了爬蟲程序的耗時。
下面利用requests_cache實現(xiàn)模擬瀏覽器緩存行為來訪問網(wǎng)站,具體邏輯如下:存在緩存,就直接走,不存在緩存,就停一下再走
示例代碼
用勾子函數(shù)根據(jù)緩存行為設(shè)置訪問時間
importrequests_cacheimporttimerequests_cache.install_cache()
#默認按照瀏覽器的緩存進行
requests_cache.clear()
defmake_throttle_hook(timeout=0.1):
defhook(response,*args,**kwargs):
print(response.text)
#判斷沒有緩存時就添加延時
ifnotgetattr(response,'from_cache',False):
print(f'Wait{timeout}s!')
time.sleep(timeout)
else:
print(f'existscache:{response.from_cache}')
returnresponse
returnhookif__name__=='__main__':
requests_cache.install_cache()
requests_cache.clear()
session=requests_cache.CachedSession()
#創(chuàng)建緩存會話
session.hooks={'response':make_throttle_hook(2)}
#配置鉤子函數(shù)
print('firstrequests'.center(50,'*'))
session.get('/get')
print('secondrequests'.center(50,'*'))
session.get('/get')
有關(guān)requests_cache的更多用法,參考下面requests_cache說明
爬蟲相關(guān)庫
1.爬蟲常用的測試網(wǎng)站:
這個網(wǎng)站能測試HTTP請求和響應(yīng)的各種信息,比如cookie、ip、headers和登錄驗證等,且支持GET、POST等多種方法,對web開發(fā)和測試很有幫助。它用Python+Flask編寫,是一個開源項目。
2.requests-cache
requests-cache,是requests庫的一個擴展包,利用它可以非常方便地實現(xiàn)請求的緩存,直接得到對應(yīng)的爬取結(jié)果。
作用和使用場景
1.在爬取過程中,它可以根據(jù)瀏覽器的緩存機制來選擇緩存內(nèi)容。從請求行為上看與瀏覽器更加相似,起到反反爬的效果。
2.另外,還可以自定義緩存機制,在爬蟲項目中,優(yōu)化性能。
requests-cache庫只能對requests的請求實現(xiàn)緩存功能,而且requests要以session方式進行請求。單獨的requests.get、requests.post不能被緩存。
requests
使用方法
安裝:
$pipinstallrequests-cache
與普通的代碼比較
在爬取一個域名下的多個url時,使用requests.session.get或requests.session.post會比單純的requests.get、requests.post更高效。因為它只建立了一個會話,并在上面做多次請求。同時還支持登錄信息cookie等的傳遞。
下面比較一下緩存代碼的寫法沒有緩存的代碼:
普通的requestssession爬取
importrequests
importtime
start=time.time()
session=requests.Session()
foriinrange(10):
session.get('/delay/1')
print(f'Finished{i+1}requests')
end=time.time()
print('Costtime',end-start)
該代碼是訪問了網(wǎng)站,該網(wǎng)站會解析delay/1,在1秒后返回。
有緩存的代碼:
帶緩存的requestssession爬取
importrequests_cache#pipinstallrequests_cache
importtime
start=time.time()
session=requests_cache.CachedSession('demo_cache')
foriinrange(10):
session.get('/delay/1')
print(f'Finished{i+1}requests')
end=time.time()
print('Costtime',end-start)
為原有代碼微創(chuàng)式添加緩存功能
只需要添加一句requests_cache.install_cache(demo_cache)即可。
微創(chuàng)式添加緩存功能
importrequests_cache#pipinstallrequests_cache
requests_cache.install_cache('demo_cache')#demo_cache.sqlite做緩存
importrequests
importtime
start=time.time()
session=requests.Session()
foriinrange(10):
session.get('/delay/1')
print(f'Finished{i+1}requests')
end=time.time()
print('Costtime',end-start)
緩存的清空和識別
如果需要清空緩存,可以調(diào)用:requests_cache.clear()#清空緩存代碼
通過res.from_cache可以判斷該值是否是緩存值:
importrequests_cache
importrequests
requests_cache.install_cache()#設(shè)置緩存
requests_cache.clear()#清空緩存
url='/get'
res=requests.get(url)
print(f'cacheexists:{res.from_cache}')
#cacheexists:False#不存在緩存
res=requests.get(url)
print(f'existscache:{res.from_cache}')
#existscache:True#存在緩存
自定義設(shè)置緩存的形式
requests_cache.install_cache默認的方式是與瀏覽器的緩存行為一致的。如果要自定義可以先了解該函數(shù)的參數(shù):
requests_cache.install_cache定義
requests_cache.install_cache(
cache_name='cache',
backend=None,
expire_after=None,
allowable_codes=(200,),
allowable_methods=('GET',),
filter_fn=
functionlambdaat0x11c927f80,
session_factory=
class'requests_cache.core.CachedSession',
**backend_options,)
該參數(shù)說明如下:-cache_name:緩存文件名稱。
backend:設(shè)置緩存的存儲機制,默認使用sqlite進行存儲。
支持四種不同的存儲機制,分別為memory、sqlite、mongoDB、redis。在設(shè)置存儲機制為mongoDB、redis時需要提前安裝對應(yīng)的模塊。pipinstallpymongo;pipinstallredies。memory:以字典的形式將緩存存儲在內(nèi)存當中,程序運行完以后緩存將被銷毀sqlite:將緩存存儲在sqlite數(shù)據(jù)庫中mongoDB:將緩存存儲在mongoDB數(shù)據(jù)庫中redis:將緩存存儲在redis中expire_after:設(shè)置緩存的有效時間,默認永久有效。allowable_codes:設(shè)置狀態(tài)碼。allowable_methods:設(shè)置請求方式,默認get,表示只有g(shù)et請求才可以生成緩存。session_factory:設(shè)置緩存執(zhí)行的對象,需要實現(xiàn)CachedSession類。**backend_options:如果緩存的存儲方式為sqlit、mongo、redis數(shù)據(jù)庫,該參數(shù)表示設(shè)置數(shù)據(jù)庫的連接方式。
自定義設(shè)置緩存的例子1:設(shè)置緩存文件類型
設(shè)置緩存文件類型的代碼如下:
#設(shè)置緩存:任選其一
requests_cache.install_cache('demo_cache')#demo_cache.sqlite做緩存
#demo_cache文件夾做緩存,刪除及表示清空緩存
requests_cache.install_cache('demo_cache',backend='filesystem')
#緩存文件夾便會使用系統(tǒng)的臨時目錄,而不會在代碼區(qū)創(chuàng)建緩存文件夾。
requests_cache.install_cache('demo_cache',backend='filesystem',use_temp=True)
#緩存文件夾便會使用系統(tǒng)的專用緩存文件夾,而不會在代碼區(qū)創(chuàng)建緩存文件夾
requests_cache.install_cache('demo_cache',backend='filesystem',use_cache_dir=True)
#Redis,需要安裝redis-pypipinstallredies
backend=requests_cache.RedisCache(host='localhost',port=6379)
requests_cache.install_cache('demo_cache',backend=backend)
其他不同格式:
MongoDB安裝pymongopipinstallpymongo;
調(diào)用requests_cache.MongoCache保存為mongodb
gridfs安裝pymongo
調(diào)用requests_cache.GridFSCache保存為gridfs
DynamoDBboto3調(diào)用requests_cache.DynamoDbCache保存為dynamodb
Memory以字典的形式將緩存存儲在內(nèi)存當中,程序運行完以后緩存將被銷毀調(diào)用requests_cache.BaseCache保存為memory
自定義設(shè)置緩存的例子2:設(shè)置緩存保存內(nèi)容
具體例子代碼如下:
importtime
importrequests
importrequests_cache
#只緩存post
requests_cache.install_cache('demo_cache2',allowable_methods=['POST'])
#只緩存200返回值的請求
requests_cache.install_cache('demo_cache2',allowable_codes=(200,))
只緩存200返回值的請求
設(shè)置緩存的過期時間:
#的內(nèi)容就會緩存30秒,/static的內(nèi)容就永遠不會過期
urls_expire_after={'*.':30,'/static':-1}
requests_cache.install_cache(
'demo_cache2',urls_expire_after=urls_expire_after)
在響應(yīng)頭中,瀏覽器會根據(jù)cache_control參數(shù)來確定是否保存緩存,在設(shè)置requests_cache緩存時,可以對cache_control參數(shù)設(shè)置,使其保存瀏覽器不需要保存的內(nèi)容。
#保存頭中,cache_control設(shè)為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨潭事業(yè)編招聘2022年考試模擬試題及答案解析42
- 銅仁2025年貴州銅仁市沿河縣消防救援大隊招錄政府專職消防員24人筆試歷年參考題庫附帶答案詳解
- 衢州2025年浙江衢州常山縣衛(wèi)健系統(tǒng)事業(yè)單位招考編外工作人員39人筆試歷年參考題庫附帶答案詳解
- 綿陽四川綿陽市公安局招聘警務(wù)輔助人員76人筆試歷年參考題庫附帶答案詳解
- 濰坊2025年山東濰坊濱海區(qū)招聘城市社區(qū)專職工作人員79人筆試歷年參考題庫附帶答案詳解
- 河北2025年河北工藝美術(shù)職業(yè)學(xué)院選聘5人筆試歷年參考題庫附帶答案詳解
- 撫州2025年江西撫州市教育體育局直屬學(xué)校選調(diào)教師47人筆試歷年參考題庫附帶答案詳解
- 廣西2025年廣西輻射環(huán)境監(jiān)督管理站招聘筆試歷年參考題庫附帶答案詳解
- 山東2025年山東省文物考古研究院招聘2人筆試歷年參考題庫附帶答案詳解
- 寧德2025年福建寧德市公安局招聘輔警39人筆試歷年參考題庫附帶答案詳解
- 藥物警戒基礎(chǔ)知識全員培訓(xùn)
- 骨密度檢測的臨床意義
- 鉆探原始班報表試行版
- 腸菌移植治療炎癥性腸病專家共識(2025)解讀
- T/CPPC 1032-2021建筑生產(chǎn)資源分供商評價規(guī)范
- 機耕合同協(xié)議書范本簡單
- 送車免責(zé)合同協(xié)議書模板
- 外科學(xué)重癥監(jiān)測治療與復(fù)蘇
- 瓊脂糖-纖維素復(fù)合分離介質(zhì)
- 早產(chǎn)兒家庭參與式護理
- 2025年招商引資項目可行性研究報告范文
評論
0/150
提交評論