解決Python httpx 運(yùn)行過(guò)程中無(wú)限阻塞的問(wèn)題
Python httpx 運(yùn)行過(guò)程中無(wú)限阻塞
requests 模塊只支持 http1,在遇到 http2 的數(shù)據(jù)接口的時(shí)候(某乎的搜索接口),需要采用支持http2 請(qǐng)求的模塊(如 httpx、hyper)。
本文是針對(duì) httpx 在請(qǐng)求數(shù)據(jù)時(shí),出現(xiàn)無(wú)限阻塞問(wèn)題的一些處理方法。
httpx 的 timeout 有 bug,會(huì)導(dǎo)致腳本在運(yùn)行一段時(shí)間后,出現(xiàn)線(xiàn)程阻塞卡死的問(wèn)題(無(wú)限 timeout)。
1.通過(guò) pm2 部署腳本
另外啟動(dòng)一個(gè)腳本,定時(shí)對(duì)該腳本進(jìn)行重啟操作。
舉個(gè)栗子:
import time
import os
while True:
? ? time.sleep(60 * 60) # 一小時(shí)重啟一次
? ? os.system('pm2 restart test') ?這個(gè)方法有個(gè)不好的地方,在請(qǐng)求過(guò)程中,可能需要翻很多頁(yè),如果不斷重啟腳本,可能導(dǎo)致無(wú)法翻到最后一頁(yè)。
2.通過(guò)裝飾器給函數(shù)設(shè)置一個(gè)最大執(zhí)行超時(shí)時(shí)間
當(dāng)函數(shù)執(zhí)行時(shí)間超過(guò)某個(gè)時(shí)間就拋出 TimeOut 異常
from func_timeout import func_set_timeout
import func_timeout
import time
@func_set_timeout(5) ?# 函數(shù)最大執(zhí)行時(shí)間 5s
def test():
? ? time.sleep(20)
def run():
? ? try:
? ? ? ? test()
? ? ? ? print('test 函數(shù)執(zhí)行完成')
? ? except func_timeout.exceptions.FunctionTimedOut:
? ? ? ? print('test 函數(shù)執(zhí)行超時(shí)')
run()如上面例子那樣,在 httpx.Client 所在函數(shù)設(shè)置一個(gè)額外等待時(shí)間,當(dāng)該函數(shù)執(zhí)行時(shí)間超過(guò)某個(gè)時(shí)間,就強(qiáng)制拋出 timeout 異常,避免程序無(wú)限阻塞。
python爬蟲(chóng)httpx的用法
安裝命令:pip install httpx
請(qǐng)求方式
GET
import httpx
?
headers = {'user-agent': 'my-app/1.0.0'}
params = {'key1': 'value1', 'key2': 'value2'}
url = 'https://httpbin.org/get'
r = httpx.get(url, headers=headers, params=params)POST
r = httpx.post('https://httpbin.org/post', data={'key': 'value'})?PUT
r = httpx.put('https://httpbin.org/put', data={'key': 'value'})DELETE
r = httpx.delete('https://httpbin.org/delete')?以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn)
這篇文章主要介紹了Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
python海龜繪圖之畫(huà)國(guó)旗實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于python海龜繪圖之畫(huà)國(guó)旗的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Pandas多個(gè)條件(AND,OR,NOT)中提取行
本文主要介紹了Pandas多個(gè)條件(AND,OR,NOT)中提取行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python實(shí)現(xiàn)url長(zhǎng)短鏈接的轉(zhuǎn)換
短鏈接,通俗來(lái)說(shuō),就是將長(zhǎng)的URL網(wǎng)址,通過(guò)程序計(jì)算等方式,轉(zhuǎn)換為簡(jiǎn)短的網(wǎng)址字符串。本文將用Python語(yǔ)言實(shí)現(xiàn)這一效果,需要的可以參考一下2022-11-11
Jupyter notebook如何實(shí)現(xiàn)指定瀏覽器打開(kāi)
這篇文章主要介紹了Jupyter notebook如何實(shí)現(xiàn)指定瀏覽器打開(kāi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Python實(shí)現(xiàn)讀取.nc數(shù)據(jù)并提取指定時(shí)間與經(jīng)緯度維度對(duì)應(yīng)的變量數(shù)值
這篇文章主要為大家詳細(xì)介紹了如何使用Python語(yǔ)言的netCDF4庫(kù)實(shí)現(xiàn)讀取.nc格式的數(shù)據(jù)文件,并提取指定維(時(shí)間、經(jīng)度與緯度)下的變量數(shù)據(jù),需要的可以了解下2024-02-02

