python爬虫URL重试机制的实现方法(python2.7以及python3.5)
作者:ZJL-阿友 发布时间:2023-08-06 07:51:43
标签:python,爬虫,重试,机制
应用场景:
状态不是200的URL重试多次
代码比较简单还有部分注释
python2.7实现:
# -*-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会抛出HTTPError错误
request.raise_for_status()
html = request.content
except requests.HTTPError as e:
html=None
if num_retries>0:
#如果不是200就重试,每次递减重试次数
return url_retry(url,num_retries-1)
#如果url不存在会抛出ConnectionError错误,这个情况不做重试
except requests.exceptions.ConnectionError as e:
return
return html
url_retry("http://httpbin.org/status/404")
python3.5实现:
# -*-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会抛出HttpProcessingError错误
response.raise_for_status()
body = await response.text()
except aiohttp.errors.HttpProcessingError as e:
body = None
if num_retries > 0:
#如果不是200就重试,每次递减重试次数
return await print_page(url, num_retries - 1)
#不存在URL会抛出ClientResponseError错误
except aiohttp.errors.ClientResponseError as e:
return e
session.close()
print(body)
return body
def main():
#这是一个不存在URL
# url = 'http://httpbin.org/status/404111'
#这是一个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()
爬虫URL重试机制封装成修饰器(python2.7以及python3.5以上)
python2.7版本:
# -*-coding:utf-8-*-
"""
ayou
"""
import requests
#定义一个重试修饰器,默认重试一次
def retry(num_retries=1):
#用来接收函数
def wrapper(func):
#用来接收函数的参数
def wrapper(*args,**kwargs):
#为了方便看抛出什么错误定义一个错误变量
last_exception =None
#循环执行包装的函数
for _ in range(num_retries):
try:
#如果没有错误就返回包装的函数,这样跳出循环
return func(*args, **kwargs)
except Exception as e:
#捕捉到错误不要return,不然就不会循环了
last_exception = e
#如果要看抛出错误就可以抛出
# 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
#定义一个重试修饰器,默认重试一次
def retry(num_retries=1):
#用来接收函数
def wrapper(func):
#用来接收函数的参数
def wrapper(*args,**kwargs):
#为了方便看抛出什么错误定义一个错误变量
last_exception =None
#循环执行包装的函数
for _ in range(num_retries):
try:
#如果没有错误就返回包装的函数,这样跳出循环
return func(*args, **kwargs)
except Exception as e:
#捕捉到错误不要return,不然就不会循环了
last_exception = e
#如果要看抛出错误就可以抛出
# 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会抛出HttpProcessingError错误
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()
来源:https://blog.csdn.net/u013055678/article/details/54290481
0
投稿
猜你喜欢
- 为方便维护和实现开放性,我把调查的好几个主题都放到同一个数据库的同一个表名当中去了但问题是在查询其中一个调查主题时,往往还会显示不相关主题的
- 在oracle数据库的开发中,常因为时间的问题大费周章,所以特地将ORACLE数据的日期函数收藏致此。乃供他日所查也。 add_months
- 线程Threading用于提供线程相关的操作。线程是应用程序中工作的最小单元,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程
- 这篇论坛文章(赛迪网技术社区)着重介绍了有关SQL注入防御的防御策略及实施步骤,详细内容请参考下文:从去年下半年开始,很多网站被损害,他们在
- 本文实例为大家分享了python实现udp传输图片的具体代码,供大家参考,具体内容如下首先要了解UDP的工作模式对于服务器,首先绑定IP和端
- 熟悉 C 语言的小伙伴一定对 goto 语句不陌生,它可以在代码之间随意的跳来跳去,但是好多老鸟都告诫大家,不要使用 goto,因为 got
- 写程序的人在编写由asp页面生成静态页面html的时候,如果同时生成大量页面,一定遇到过浏览器下方的进度条上显示着3%,6%,10%等缓慢增
- 1069错误(由于登录失败而无法启动服务)解决方法在本版面出现这个问题的频率也算是很高的了,新手通常会比较多遇到这个问题原因很简单,安装SQ
- 本文实例为大家分享了python实现维吉尼亚加密法的具体代码,供大家参考,具体内容如下Vigenere加密/解密时,把英文字母映射为0-25
- 本文实例讲述了PHP使用星号隐藏用户名,手机和邮箱的实现方法。分享给大家供大家参考,具体如下:PHP使用星号替代用户名手机和邮箱这个在许多的
- Opera, 作为 A-Grade 浏览器,在现在的前端开发中务必支持。它很优秀,很不幸,bug是每个浏览器都不可避免的问题,Opera亦难
- 任何熟悉SQL和关系数据库的人都遇见过大量的连接类型。最简单的说,连接(join)会把两个表的内容组合到一个虚拟表或者recordset内。
- 近日,有朋友一直打听flash连结服务器相关的知识,搞得我忧心重重,重点是自己也忘记了,大部分Flash的相关开发都是两年前的事,而且fla
- 设计师在抱怨开发人员不尊重Web标准,后台开发人员在抱怨为什么不可以增加一个空格。PM在抱怨为什么项目总是因为那些看似简单的问题而延期……如
- Dreamweaver MX 2004新增加了表格宽度辅助线功能,让我们在编辑网页表格的时候能清楚地看到表格中各单元的宽度以及变化,很直观。
- 本文实例讲述了PHP+Mysql基于事务处理实现转账功能的方法。分享给大家供大家参考。具体如下:<?php header(
- 在了解XHTML代码规范后,我们就要进行CSS布局。首先先介绍一些CSS的入门知识。如果你已经很熟悉了,可以跳过这一节。CSS是Cascad
- 1)用这个方法,把虚拟主机的默认页只设置成一个比如index.asp 在index.asp的最上面加入以下代码:<%if R
- python将字典内容写入json文件的方法:我们可以先使用json.dumps()函数将字典转换为字符串;然后再将内容写入json即可。j
- 1.运行效果如图所示2.实现代码如下<!DOCTYPE html><html><head> <me