中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么使用python反爬蟲技術限制連續請求時間

發布時間:2022-06-10 15:42:05 來源:億速云 閱讀:305 作者:iii 欄目:開發技術

這篇文章主要介紹了怎么使用python反爬蟲技術限制連續請求時間的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么使用python反爬蟲技術限制連續請求時間文章都會有所收獲,下面我們一起來看看吧。

用勾子函數根據緩存行為設置訪問時間

import requests_cacheimport timerequests_cache.install_cache()  
#默認按照瀏覽器的緩存進行
requests_cache.clear()
    def make_throttle_hook(timeout=0.1):    
    def hook(response, *args, **kwargs):        
print(response.text)          
# 判斷沒有緩存時就添加延時       
    if not getattr(response, 'from_cache', False):               
    print(f'Wait {timeout} s!')               
         time.sleep(timeout)       
         else:               
    print(f'exists cache: {response.from_cache}')       
         return response   
         return hookif __name__ == '__main__':    
    requests_cache.install_cache()    
    requests_cache.clear()   
    session = requests_cache.CachedSession() 
# 創建緩存會話    
session.hooks = {'response': make_throttle_hook(2)} 
# 配置鉤子函數    
    print('first requests'.center(50,'*'))    
    session.get('http://httpbin.org/get')   
    print('second requests'.center(50,'*'))    
    session.get('http://httpbin.org/get')

有關requests_cache的更多用法,參考下面requests_cache說明

爬蟲相關庫

1. 爬蟲常用的測試網站:httpbin.org

httpbin.org 這個網站能測試 HTTP 請求和響應的各種信息,比如 cookie、ip、headers 和登錄驗證等,且支持 GET、POST 等多種方法,對 web 開發和測試很有幫助。它用 Python + Flask 編寫,是一個開源項目。

2. requests-cache

requests-cache,是 requests 庫的一個擴展包,利用它可以非常方便地實現請求的緩存,直接得到對應的爬取結果。

作用和使用場景

1.在爬取過程中,它可以根據瀏覽器的緩存機制來選擇緩存內容。從請求行為上看與瀏覽器更加相似,起到反反爬的效果。

2.另外,還可以自定義緩存機制,在爬蟲項目中,優化性能。

requests-cache庫只能對requests的請求實現緩存功能,而且requests要以session方式進行請求。單獨的requests.get、requests.post 不能被緩存。 

requests

使用方法

安裝: 

$ pip install requests-cache

與普通的代碼比較

在爬取一個域名下的多個url時,使用requests.session.get或requests.session.post會比單純的requests.get、requests.post更高效。因為它只建立了一個會話,并在上面做多次請求。同時還支持登錄信息cookie等的傳遞。

下面比較一下緩存代碼的寫法 沒有緩存的代碼:

普通的requests session爬取

import requests
import time
start = time.time()
session = requests.Session()
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i + 1} requests')
end = time.time()
print('Cost time', end - start)

該代碼是訪問了httpbin.org網站,該網站會解析delay/1,在1秒后返回。

有緩存的代碼:

帶緩存的requests session爬取

import requests_cache #pip install requests_cache
import time
start = time.time()
session = requests_cache.CachedSession('demo_cache')
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i + 1} requests')
end = time.time()
print('Cost time', end - start)

為原有代碼微創式添加緩存功能

只需要添加一句requests_cache.install_cache('demo_cache')即可。

微創式添加緩存功能

import requests_cache #pip install requests_cache
requests_cache.install_cache('demo_cache')#demo_cache.sqlite 做緩存
import requests
import time
start = time.time()
session = requests.Session()
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i + 1} requests')
end = time.time()
print('Cost time', end - start)

緩存的清空和識別

如果需要清空緩存,可以調用:requests_cache.clear() # 清空緩存代碼

通過res.from_cache可以判斷該值是否是緩存值:

import requests_cache
import requests
requests_cache.install_cache() # 設置緩存
requests_cache.clear() # 清空緩存
url = 'http://httpbin.org/get'
res = requests.get(url)
print(f'cache exists: {res.from_cache}')
# cache exists: False # 不存在緩存
res = requests.get(url)
print(f'exists cache: {res.from_cache}')
# exists cache: True # 存在緩存

自定義設置緩存的形式

requests_cache.install_cache默認的方式是與瀏覽器的緩存行為一致的。如果要自定義可以先了解該函數的參數:

requests_cache.install_cache定義

requests_cache.install_cache(    
    cache_name='cache',    
    backend=None,    
    expire_after=None,    
    allowable_codes=(200,),    
    allowable_methods=('GET',),    
    filter_fn=<
function <lambda> at 0x11c927f80>,    
        session_factory=<
        class 'requests_cache.core.CachedSession'>,   
        **backend_options,)

該參數說明如下: - cache_name:緩存文件名稱。

  • backend:設置緩存的存儲機制,默認使用sqlite進行存儲。
    支持四種不同的存儲機制,分別為memory、sqlite、mongoDBredis。在設置存儲機制為mongoDB、redis時需要提前安裝對應的模塊。pip install pymongo; pip install redies。 

  • memory:以字典的形式將緩存存儲在內存當中,程序運行完以后緩存將被銷毀 

  • sqlite:將緩存存儲在sqlite數據庫中 

  • mongoDB:將緩存存儲在mongoDB數據庫中 

  • redis:將緩存存儲在redis中 

  • expire_after:設置緩存的有效時間,默認永久有效。 

  • allowable_codes:設置狀態碼。 

  • allowable_methods:設置請求方式,默認get,表示只有get請求才可以生成緩存。 

  • session_factory:設置緩存執行的對象,需要實現CachedSession類。 

  • **backend_options:如果緩存的存儲方式為sqlit、mongo、redis數據庫,該參數表示設置數據庫的連接方式。

自定義設置緩存的例子1:設置緩存文件類型

設置緩存文件類型的代碼如下:

#設置緩存:任選其一
requests_cache.install_cache('demo_cache')#demo_cache.sqlite 做緩存
#demo_cache文件夾做緩存,刪除及表示清空緩存
requests_cache.install_cache('demo_cache', backend='filesystem')
#緩存文件夾便會使用系統的臨時目錄,而不會在代碼區創建緩存文件夾。
requests_cache.install_cache('demo_cache', backend='filesystem', use_temp=True)
#緩存文件夾便會使用系統的專用緩存文件夾,而不會在代碼區創建緩存文件夾
requests_cache.install_cache('demo_cache', backend='filesystem', use_cache_dir=True)
#Redis  ,需要安裝redis-py  pip install redies
backend = requests_cache.RedisCache(host='localhost', port=6379)
requests_cache.install_cache('demo_cache', backend=backend)

其他不同格式:

MongoDB 安裝pymongo pip install pymongo;

調用requests_cache.MongoCache 保存為&rsquo;mongodb&rsquo;

gridfs 安裝pymongo

調用requests_cache.GridFSCache 保存為&rsquo;gridfs&rsquo;

DynamoDB boto3 調用requests_cache.DynamoDbCache 保存為&rsquo;dynamodb&rsquo; 

Memory 以字典的形式將緩存存儲在內存當中,程序運行完以后緩存將被銷毀 調用requests_cache.BaseCache 保存為&rsquo;memory&rsquo;

自定義設置緩存的例子2:設置緩存保存內容

具體例子代碼如下:

import time
import requests
import requests_cache
#只緩存post
requests_cache.install_cache('demo_cache2', allowable_methods=['POST'])
#只緩存200返回值的請求
requests_cache.install_cache('demo_cache2', allowable_codes=(200,))

只緩存200返回值的請求

設置緩存的過期時間:

#site1.com 的內容就會緩存 30 秒,site2.com/static 的內容就永遠不會過期
urls_expire_after = {'*.site1.com': 30, 'site2.com/static': -1}
requests_cache.install_cache(
    'demo_cache2', urls_expire_after=urls_expire_after)

在響應頭中,瀏覽器會根據cache_control參數來確定是否保存緩存,在設置requests_cache緩存時,可以對cache_control參數設置,使其保存瀏覽器不需要保存的內容。

# 保存頭中,cache_control設為不保存的請求
requests_cache.install_cache('demo_cache3', cache_control=True)
start = time.time()
session = requests.Session()
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i + 1} requests')
end = time.time()
print('Cost time for get', end - start)
start = time.time()
for i in range(10):
    session.post('http://httpbin.org/delay/1')
    print(f'Finished {i + 1} requests')
end = time.time()
print('Cost time for post', end - start)

在 Request Headers 里面加上了 Cache-Control 為 no-store,這樣的話,即使我們聲明了緩存那也不會生效

session.get('http://httpbin.org/delay/1',               
    headers={                   
    'Cache-Control': 'no-store'               
    }
)

關于“怎么使用python反爬蟲技術限制連續請求時間”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么使用python反爬蟲技術限制連續請求時間”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

华池县| 新和县| 璧山县| 连南| 南江县| 荥阳市| 通化县| 晋中市| 湘阴县| 营口市| 从化市| 碌曲县| 库伦旗| 河南省| 桂平市| 牟定县| 崇信县| 塔城市| 灵武市| 遵化市| 罗城| 平利县| 江孜县| 越西县| 普兰县| 博罗县| 涡阳县| 西青区| 正安县| 霍林郭勒市| 班戈县| 林州市| 银川市| 广饶县| 中宁县| 太仓市| 镇巴县| 长岭县| 吉木萨尔县| 象州县| 彝良县|