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之禅》中对于Python编程过程中的一些建议
Apr 03 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
Python读取word文本操作详解
Jan 22 Python
python3爬取淘宝信息代码分析
Feb 10 Python
selenium+python 对输入框的输入处理方法
Oct 11 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
Python实现图片识别加翻译功能
Dec 26 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 Python
Python 创建TCP服务器的方法
Jul 28 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
解决GD中文乱码问题
2007/02/14 PHP
php实现网站插件机制的方法
2009/11/10 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
js点击事件链接的问题解决
2014/04/25 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
Python常用的日期时间处理方法示例
2015/02/08 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Python常用模块sys,os,time,random功能与用法实例分析
2020/01/07 Python
Python类成员继承重写的实现
2020/09/16 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
出纳的岗位职责
2013/11/09 职场文书
往来会计岗位职责
2013/12/19 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
幼儿教育感言
2014/02/05 职场文书
离婚协议书样本
2015/01/26 职场文书
计算机专业自荐信
2015/03/05 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
2016年元旦致辞
2015/08/01 职场文书