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 encode和decode的妙用
Sep 02 Python
讲解Python中if语句的嵌套用法
May 14 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
python调用API实现智能回复机器人
Apr 10 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
Python函数参数分类原理详解
May 28 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
python如何实现word批量转HTML
Sep 30 Python
python中的plt.cm.Paired用法说明
May 31 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应用程序来获取Web服务器的状态信息
2006/10/09 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
微信access_token的获取开发示例
2015/04/16 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
Python中非常实用的一些功能和函数分享
2015/02/14 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
学习十八大报告感言
2014/02/28 职场文书
公司管理建议书范文
2014/03/12 职场文书
中学校庆方案
2014/03/17 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python