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中利用await关键字如何等待Future对象完成详解
Sep 07 Python
Python使用asyncio包处理并发详解
Sep 09 Python
python实现k-means聚类算法
Feb 23 Python
使用Django和Python创建Json response的方法
Mar 26 Python
python pygame实现五子棋小游戏
Oct 26 Python
python取余运算符知识点详解
Jun 27 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
python创建n行m列数组示例
Dec 02 Python
Python Pillow.Image 图像保存和参数选择方式
Jan 09 Python
Python如何访问字符串中的值
Feb 09 Python
python开发入门——列表生成式
Sep 03 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
PHP4之COOKIE支持详解
2006/10/09 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
用javascript连接access数据库的方法
2006/11/17 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
在Python中移动目录结构的方法
2016/01/31 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
python实现车牌识别的示例代码
2019/08/05 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
个人能力自我鉴赏
2014/01/25 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书