日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
爬蟲必備Requests的擴(kuò)展包總結(jié)

Requests-Cache的安裝與測(cè)試

Requests-Cache模塊是requests模塊的一個(gè)擴(kuò)展功能,用于為requests模塊提供持久化緩存支持。如果requests模塊向一個(gè)URL發(fā)送重復(fù)請(qǐng)求時(shí),Requests-Cache模塊將會(huì)自動(dòng)判斷當(dāng)前的網(wǎng)絡(luò)請(qǐng)求是否產(chǎn)生了緩存。如果已經(jīng)產(chǎn)生了緩存,就會(huì)從緩存中讀取數(shù)據(jù)作為響應(yīng)內(nèi)容。如果沒有緩存就會(huì)向服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求,獲取服務(wù)器所返回的響應(yīng)內(nèi)容。使用Requests-Cache模塊可以減少網(wǎng)絡(luò)資源避免重復(fù)請(qǐng)求的次數(shù),這樣可以變相地躲避一些反爬機(jī)制。

說明

無論是否使用了Anaconda,都需要單獨(dú)安裝Requests-Cache模塊,因?yàn)锳naconda中并不包含該模塊。

Python 3.9.9 (v3.9.9:ccb0e6a345, Nov 15 2021, 13:29:20) 
[Clang 6.0 (clang-600.0.57)] on darwin
>>>import requests_cache
>>>version = requests_cache.__version__
>>>print(version)
0.9.1

緩存的應(yīng)用

調(diào)用install_cache()函數(shù)實(shí)現(xiàn)Requests-Cache的請(qǐng)求,語法格式如下:

install_cache(cache_name='cache', backend=None, expire_after=None, allowable_codes=(200, ), allowable_methods=('GET', ), session_factory=,
**backend_options)

Install_cache()函數(shù)中包含了多個(gè)參數(shù),每個(gè)參數(shù)的含義如下:

  • § cache_name: 表示緩存文件的名稱,默認(rèn)為cache
  • § backend: 表示設(shè)置緩存的存儲(chǔ)機(jī)制,默認(rèn)為None,表示默認(rèn)使用sqlite進(jìn)行存儲(chǔ)
  • § expire_after: 表示設(shè)置緩存的有效時(shí)間,默認(rèn)為None,表示永久有效
  • § allowable_codes:表示設(shè)置狀態(tài)碼,默認(rèn)為200
  • § allowable_methods:表示設(shè)置請(qǐng)求方式,默認(rèn)為GET,表示只有GET請(qǐng)求才可以生產(chǎn)緩存
  • § session_factory: 表示設(shè)置緩存執(zhí)行的對(duì)象,需要實(shí)現(xiàn)CachedSession類
  • § **backend_options: 如果緩存的存儲(chǔ)方式為sqlite、mongo、redis數(shù)據(jù)庫,該參數(shù)表示設(shè)置數(shù)據(jù)庫的連接方式

在使用install_cache()函數(shù)實(shí)現(xiàn)請(qǐng)求緩存時(shí),一般情況下時(shí)不需要單獨(dú)設(shè)置任何參數(shù)的,只需要使用默認(rèn)參數(shù)即可。判斷是否存在緩存的代碼如下:

#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 創(chuàng)建時(shí)間 :1/30/22 8:32 AM
# 文件 :判斷緩存是否存在.py
# IDE :PyCharm

# 導(dǎo)入requests_cache模塊
import requests_cache

# 導(dǎo)入網(wǎng)絡(luò)請(qǐng)求模塊
import requests

# 設(shè)置緩存
requests_cache.install_cache()

# 清理緩存
requests_cache.clear()

# 定義測(cè)試地址
url = 'http://httpbin.org/get'

# 第一次發(fā)送網(wǎng)絡(luò)請(qǐng)求
r = requests.get(url)

# False表示不存在緩存
print('是否存在緩存:', r.from_cache)

# 第二次發(fā)送網(wǎng)絡(luò)請(qǐng)求
r = requests.get(url)

# True表示存在緩存
print('是否存在緩存:', r.from_cache)

程序運(yùn)行結(jié)果如下:

是否存在緩存: False
是否存在緩存: True

針對(duì)反爬措施,在多次請(qǐng)求中設(shè)置延時(shí)是不錯(cuò)的選擇。但是如果在第一次請(qǐng)求后生成了緩存,那么第二次請(qǐng)求時(shí)就無需設(shè)置延時(shí),為此Requests-Cache模塊可以使用自定義鉤子函數(shù)的方式,合理判斷是否需要設(shè)置延時(shí)操作。示例代碼如下:

#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 創(chuàng)建時(shí)間 :1/30/22 8:57 AM
# 文件 :利用鉤子函數(shù)判斷是否需要設(shè)置延時(shí).py
# IDE :PyCharm

# 導(dǎo)入Requests_Cache模塊
import requests_cache

# 導(dǎo)入時(shí)間模塊
import time

# 設(shè)置緩存
requests_cache.install_cache()

# 清理緩存
requests_cache.clear()

# 定義鉤子函數(shù)
def make_throttle_hook(timeout = 0.1):
def hook(response, *args, **kwargs):
print(response.text)
# 判斷沒有緩存時(shí)就添加延時(shí)
if not getattr(response, 'from_cache', False):
print('等待', timeout, '秒!')
# 等待指定時(shí)間
time.sleep(timeout)
else:
# 存在緩存輸出True
print('是否存在請(qǐng)求緩存!', response.from_cache)
return response
return hook

if __name__ == '__main__':
requests_cache.install_cache()
requests_cache.clear()
s = requests_cache.CachedSession()
s.hooks = {'response': make_throttle_hook(2)} # 配置鉤子函數(shù)

# 模擬發(fā)送第一次網(wǎng)絡(luò)請(qǐng)求
s.get('http://httpbin.org/get')
# 模擬發(fā)送第二次網(wǎng)絡(luò)請(qǐng)求
s.get('http://httpbin.org/get')

程序運(yùn)行結(jié)果:

  • 第一次運(yùn)行結(jié)果:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.27.1",
"X-Amzn-Trace-Id": "Root=1-61f5e91a-5c923abe41da544561b5f400"
},
"origin": "139.209.219.102",
"url": "http://httpbin.org/get"
}
  • 等待2秒
  • 第二次請(qǐng)求結(jié)果
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.27.1",
"X-Amzn-Trace-Id": "Root=1-61f5e91a-5c923abe41da544561b5f400"
},
"origin": "139.209.219.102",
"url": "http://httpbin.org/get"
}
  • 二次請(qǐng)求存在緩存
是否存在請(qǐng)求緩存! True

從以上的運(yùn)行結(jié)果看,通過配置鉤子函數(shù)可以實(shí)現(xiàn):在第一次請(qǐng)求時(shí),因?yàn)闆]有請(qǐng)求緩存所以執(zhí)行了2秒等待延時(shí);第二次請(qǐng)求時(shí)則沒有執(zhí)行2秒 延時(shí),并輸出是否存在請(qǐng)求緩存行為True。

說明

Requests-Cache模塊支持4種不同的存儲(chǔ)機(jī)制,分別為money、sqlite、mongoDB以及redid,具體說明如下:

  • § memory: 以字典的形式將緩存存儲(chǔ)在內(nèi)存當(dāng)中,程序運(yùn)行完后緩存將被銷毀
  • § sqlite: 將緩存存儲(chǔ)在sqlite數(shù)據(jù)庫中
  • § mongoDB:將緩存存儲(chǔ)在mongoDB數(shù)據(jù)庫中
  • § redis: 將緩存存儲(chǔ)在redis數(shù)據(jù)庫當(dāng)中

使用Requests-Cache模塊指定緩存不同的存儲(chǔ)機(jī)制時(shí),只需要為install_cache()函數(shù)中backend參數(shù)賦值即可,設(shè)置方式如下:

# 導(dǎo)入Requests_Cache模塊
import requests_cache

# 設(shè)置緩存為內(nèi)存的存儲(chǔ)機(jī)制
requests_cache.install_cache(backend='memory')

# 設(shè)置緩存為sqlite數(shù)據(jù)庫的存儲(chǔ)機(jī)制
requests_cache.install_cache(backend='sqlite')

# 設(shè)置緩存為mongoDB數(shù)據(jù)庫的存儲(chǔ)機(jī)制
requests_cache.install_cache(backend='mongoDB')

# 設(shè)置緩存為redis數(shù)據(jù)庫的存儲(chǔ)機(jī)制
requests_cache.install_cache(backend='redis')

設(shè)置存儲(chǔ)機(jī)制為mongoDB與redis數(shù)據(jù)庫時(shí),需要提取安裝對(duì)應(yīng)的操作模塊與數(shù)據(jù)庫。安裝模塊的命令如下:

pip install pymongo
pip install redis

強(qiáng)大的Requests-HTML模塊

Requests-HTML 模塊是requets模塊的親兄弟,是同一個(gè)開發(fā)者所開發(fā)的。Requests-HTML模塊不僅包含了requests模塊中的所有功能,還增加了對(duì)JavaScript的支持、數(shù)據(jù)提取以及模擬真實(shí)瀏覽器等功能。

使用Requests-HTML模塊實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求

(1) get()請(qǐng)求

通過'pip install requests-html'命令進(jìn)行模塊的安裝,然后導(dǎo)入Requests-HTML模塊中的HTMLSession類,接著需要?jiǎng)?chuàng)建HTML會(huì)話對(duì)象,通過會(huì)話實(shí)例進(jìn)行網(wǎng)絡(luò)請(qǐng)求的發(fā)送,示例代碼如下:

#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 創(chuàng)建時(shí)間 :1/30/22 3:48 PM
# 文件 :使用Requests-HTML模塊實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求.py
# IDE :PyCharm

# 導(dǎo)入HTMLSession類
from requests_html import HTMLSession

# 創(chuàng)建HTML會(huì)話對(duì)象
session = HTMLSession()

# 定義請(qǐng)求地址
url = 'http://news.youth.cn/'

# 發(fā)送網(wǎng)絡(luò)請(qǐng)求
r = session.get(url)

# 打印網(wǎng)絡(luò)請(qǐng)求的URL地址
print(r.html)

程序運(yùn)行結(jié)果如下:

(2) post()請(qǐng)求

在實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求時(shí),POST請(qǐng)求也是一種比較常見的請(qǐng)求方式,使用Requests-HTML實(shí)現(xiàn)POST請(qǐng)求與requests的實(shí)現(xiàn)方法類似都需要單獨(dú)設(shè)置表單參數(shù)data,不過它也是需要通過會(huì)話實(shí)例進(jìn)行網(wǎng)絡(luò)請(qǐng)求的發(fā)送,示例代碼如下:

#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 創(chuàng)建時(shí)間 :1/30/22 4:44 PM
# 文件 :post()請(qǐng)求.py
# IDE :PyCharm

# 導(dǎo)入HTMLSession類
from requests_html import HTMLSession

# 創(chuàng)建HTML會(huì)話對(duì)象
session = HTMLSession()

# 模擬表單登錄的數(shù)據(jù)
data = {'user':'admin', 'password':123456}

# 發(fā)送POST請(qǐng)求
r = session.post('http://httpbin.org/post', data = data)
# 判斷請(qǐng)求是否成功
if r.status_code == 200:
print(r.text)

程序運(yùn)行結(jié)果如下:

{
"args": {},
"data": "",
"files": {},
# 表單數(shù)據(jù)
"form": {
"password": "123456",
"user": "admin"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "26",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
# User-Agent對(duì)應(yīng)的值
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8",
"X-Amzn-Trace-Id": "Root=1-61f6509d-56a381b4543229480fe07e56"
},
"json": null,
"origin": "139.209.219.102",
"url": "http://httpbin.org/post"
}

從以上的運(yùn)行結(jié)果中,不僅可以看到form所對(duì)應(yīng)的表單內(nèi)容,還可以看到User-Agent所對(duì)應(yīng)的值,并不是像requests模塊發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí)返回的默認(rèn)值(python-requests/2.27.1),而是一個(gè)真實(shí)的瀏覽器請(qǐng)求頭信息,這與requests模塊所發(fā)送的網(wǎng)絡(luò)請(qǐng)求有著細(xì)小的改進(jìn)。

(3) 修改請(qǐng)求頭信息

說到請(qǐng)求頭信息,Requests-HTML模塊是可通過指定headers參數(shù)來對(duì)默認(rèn)的瀏覽器請(qǐng)求頭信息進(jìn)行修改的,修改請(qǐng)求頭信息的關(guān)鍵代碼如下:

ua = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.76'
}
r = session.post('http://httpbin.org/post', data = data, headers = ua)

§ Requests-HTML模塊中添加了UserAgent類,使用該類可以實(shí)現(xiàn)隨機(jī)生成請(qǐng)求頭。示例代碼如下:

#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 創(chuàng)建時(shí)間 :1/30/22 9:06 PM
# 文件 :生成隨機(jī)請(qǐng)求頭信息.py
# IDE :PyCharm

# 導(dǎo)入HTMLSession類
from requests_html import HTMLSession, UserAgent

# 創(chuàng)建HTML會(huì)話對(duì)象
session = HTMLSession()

# 創(chuàng)建隨機(jī)請(qǐng)求頭
ua =UserAgent().random
r = session.get('http://httpbin.org/get', headers = {'user-agent': ua})

# 判斷請(qǐng)求是否成功
if r.status_code == 200:
# 以文本形式打印返回結(jié)果
print(r.text)

程序運(yùn)行結(jié)果如下:

{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
# 請(qǐng)求頭信息
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6",
"X-Amzn-Trace-Id": "Root=1-61f69454-0b37eb40198f0f4b237fc7e8"
},
"origin": "139.209.219.102",
"url": "http://httpbin.org/get"
}
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
# 請(qǐng)求頭信息
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17",
"X-Amzn-Trace-Id": "Root=1-61f693aa-0d20428a3a73766723017536"
},
"origin": "139.209.219.102",
"url": "http://httpbin.org/get"
}

備注:

以上運(yùn)行是在Anaconda的Jupiter notebook 下運(yùn)行。Pycharm 報(bào)錯(cuò),應(yīng)該是解釋器的問題。

數(shù)據(jù)的提取

以往使用requests模塊實(shí)現(xiàn)爬蟲程序時(shí),還需要為其配置一個(gè)解析HTML代碼的搭檔。Requests-HTML模塊對(duì)此進(jìn)行了一個(gè)比較大的升級(jí),不僅支持CSS選擇器還支持XPath的節(jié)點(diǎn)提取方式。

CSS選擇器

CSS選擇器中需要使用HTML的find()方法,該方法中包含5個(gè)參數(shù),其語法格式與參數(shù)含義如下:

find(selector:str='*', containing:_Containing=None, clean:bool=False,first:bool=False,_encoding:str=None)
  • § selector: 使用CSS選擇器定位網(wǎng)頁元素
  • § containing:通過指定文本獲取網(wǎng)頁元素
  • § clean:是否清除HTML中的

當(dāng)前名稱:爬蟲必備Requests的擴(kuò)展包總結(jié)
鏈接分享:http://www.dlmjj.cn/article/djiigdp.html