python爬蟲(chóng)URL重試機(jī)制的實(shí)現(xiàn)方法(python2.7以及python3.5)
應(yīng)用場(chǎng)景:
狀態(tài)不是200的URL重試多次
代碼比較簡(jiǎn)單還有部分注釋
python2.7實(shí)現(xiàn):
# -*-coding:utf-8-*-
"""
ayou
"""
import requests
def url_retry(url,num_retries=3):
print("access!")
try:
request = requests.get(url,timeout=60)
#raise_for_status(),如果不是200會(huì)拋出HTTPError錯(cuò)誤
request.raise_for_status()
html = request.content
except requests.HTTPError as e:
html=None
if num_retries>0:
#如果不是200就重試,每次遞減重試次數(shù)
return url_retry(url,num_retries-1)
#如果url不存在會(huì)拋出ConnectionError錯(cuò)誤,這個(gè)情況不做重試
except requests.exceptions.ConnectionError as e:
return
return html
url_retry("http://httpbin.org/status/404")
python3.5實(shí)現(xiàn):
# -*-coding:utf-8-*-
"""
ayou
"""
import asyncio
import aiohttp
async def print_page(url,num_retries=3):
async with aiohttp.ClientSession() as session:
try:
async with session.get(url,timeout=60) as response:
print("access!")
#raise_for_status(),如果不是200會(huì)拋出HttpProcessingError錯(cuò)誤
response.raise_for_status()
body = await response.text()
except aiohttp.errors.HttpProcessingError as e:
body = None
if num_retries > 0:
#如果不是200就重試,每次遞減重試次數(shù)
return await print_page(url, num_retries - 1)
#不存在URL會(huì)拋出ClientResponseError錯(cuò)誤
except aiohttp.errors.ClientResponseError as e:
return e
session.close()
print(body)
return body
def main():
#這是一個(gè)不存在URL
# url = 'http://httpbin.org/status/404111'
#這是一個(gè)404的URL
url = 'http://httpbin.org/status/404'
loop = asyncio.get_event_loop()
loop.run_until_complete(print_page(url))
loop.close()
if __name__ == '__main__':
main()
爬蟲(chóng)URL重試機(jī)制封裝成修飾器(python2.7以及python3.5以上)
python2.7版本:
# -*-coding:utf-8-*-
"""
ayou
"""
import requests
#定義一個(gè)重試修飾器,默認(rèn)重試一次
def retry(num_retries=1):
#用來(lái)接收函數(shù)
def wrapper(func):
#用來(lái)接收函數(shù)的參數(shù)
def wrapper(*args,**kwargs):
#為了方便看拋出什么錯(cuò)誤定義一個(gè)錯(cuò)誤變量
last_exception =None
#循環(huán)執(zhí)行包裝的函數(shù)
for _ in range(num_retries):
try:
#如果沒(méi)有錯(cuò)誤就返回包裝的函數(shù),這樣跳出循環(huán)
return func(*args, **kwargs)
except Exception as e:
#捕捉到錯(cuò)誤不要return,不然就不會(huì)循環(huán)了
last_exception = e
#如果要看拋出錯(cuò)誤就可以拋出
# raise last_exception
return wrapper
return wrapper
if __name__=="__main__":
@retry(5)
def url_retry(url):
request = requests.get(url, timeout=60)
print("access!")
request.raise_for_status()
html = request.content
print(html)
return html
url_retry("http://httpbin.org/status/404")
# url_retry("http://httpbin.org/status/404111")
# url_retry("http://www.baidu.com")
python3.5以上版本:
# -*-coding:utf-8-*-
"""
ayou
"""
import aiohttp,asyncio
#定義一個(gè)重試修飾器,默認(rèn)重試一次
def retry(num_retries=1):
#用來(lái)接收函數(shù)
def wrapper(func):
#用來(lái)接收函數(shù)的參數(shù)
def wrapper(*args,**kwargs):
#為了方便看拋出什么錯(cuò)誤定義一個(gè)錯(cuò)誤變量
last_exception =None
#循環(huán)執(zhí)行包裝的函數(shù)
for _ in range(num_retries):
try:
#如果沒(méi)有錯(cuò)誤就返回包裝的函數(shù),這樣跳出循環(huán)
return func(*args, **kwargs)
except Exception as e:
#捕捉到錯(cuò)誤不要return,不然就不會(huì)循環(huán)了
last_exception = e
#如果要看拋出錯(cuò)誤就可以拋出
# raise last_exception
return wrapper
return wrapper
async def print_page(url):
async with aiohttp.ClientSession() as session:
async with session.get(url,timeout=60) as response:
print("access!")
#raise_for_status(),如果不是200會(huì)拋出HttpProcessingError錯(cuò)誤
response.raise_for_status()
body = await response.text()
session.close()
print(body)
return body
@retry(5)
def loop_get():
# url = "http://www.baidu.com"
# url = 'http://httpbin.org/status/404111'
url = 'http://httpbin.org/status/404'
loop = asyncio.get_event_loop()
loop.run_until_complete(print_page(url))
loop.close()
if __name__ == '__main__':
loop_get()
以上這篇python爬蟲(chóng)URL重試機(jī)制的實(shí)現(xiàn)方法(python2.7以及python3.5)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?查找算法之二分查找線性查找與哈希查找實(shí)例探究
這篇文章主要為大家介紹了Python查找算法探究之二分查找、線性查找與哈希查找的實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python使用PIL庫(kù)將PNG圖片轉(zhuǎn)換為ICO圖標(biāo)的示例代碼
在軟件開(kāi)發(fā)和網(wǎng)站設(shè)計(jì)中,ICO圖標(biāo)是一種常用的圖像格式,特別適用于應(yīng)用程序圖標(biāo)、網(wǎng)頁(yè)收藏夾圖標(biāo)等場(chǎng)景,本文將介紹如何使用Python的PIL庫(kù)將PNG圖片轉(zhuǎn)換為ICO格式的圖標(biāo)文件,需要的朋友可以參考下2025-03-03
Python?+?Selenium?實(shí)現(xiàn)模擬登錄jd實(shí)例分享
這篇文章主要介紹了Python?+?Selenium?實(shí)現(xiàn)模擬登錄jd實(shí)例分享的相關(guān)資料,需要的朋友可以參考下2023-06-06
對(duì)python中矩陣相加函數(shù)sum()的使用詳解
今天小編就為大家分享一篇對(duì)python中矩陣相加函數(shù)sum()的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Python實(shí)現(xiàn)搜索算法的實(shí)例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)搜索算法,文中通過(guò)實(shí)例代碼給大家分享高級(jí)搜索算法的想法,分為線性搜索和插值搜索,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
keras中模型訓(xùn)練class_weight,sample_weight區(qū)別說(shuō)明
這篇文章主要介紹了keras中模型訓(xùn)練class_weight,sample_weight區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05

