python爬虫URL重试机制的实现方法(python2.7以及python3.5)


Posted in Python onDecember 18, 2018

应用场景:

状态不是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()

以上这篇python爬虫URL重试机制的实现方法(python2.7以及python3.5)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python利用IPython提高开发效率
Aug 10 Python
python制作企业邮箱的爆破脚本
Oct 05 Python
Python利用operator模块实现对象的多级排序详解
May 09 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
python创建文件备份的脚本
Sep 11 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
python实现按行分割文件
Jul 22 Python
深入了解Django中间件及其方法
Jul 26 Python
python的Jenkins接口调用方式
May 12 Python
Python OpenCV快速入门教程
Apr 17 Python
对python3标准库httpclient的使用详解
Dec 18 #Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 #Python
python根据url地址下载小文件的实例
Dec 18 #Python
如何用python写一个简单的词法分析器
Dec 18 #Python
详解Python requests 超时和重试的方法
Dec 18 #Python
解决新django中的path不能使用正则表达式的问题
Dec 18 #Python
python 获取url中的参数列表实例
Dec 18 #Python
You might like
如何正确理解PHP的错误信息
2006/10/09 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Linux下为不同版本python安装第三方库
2016/08/31 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
Django实现单用户登录的方法示例
2019/03/28 Python
python的依赖管理的实现
2019/05/14 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
利用python绘制正态分布曲线
2021/01/04 Python
电气专业推荐信范文
2013/11/18 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
优秀员工推荐信
2014/05/10 职场文书
大学新闻系求职信
2014/06/03 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
家属答谢词
2015/01/05 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫