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 相关文章推荐
在Django中创建动态视图的教程
Jul 15 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
Python 性能优化技巧总结
Nov 01 Python
利用Python命令行传递实例化对象的方法
Nov 02 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
Python callable()函数用法实例分析
Mar 17 Python
python交互界面的退出方法
Feb 16 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
python软件都是免费的吗
Jun 18 Python
Win10下用Anaconda安装TensorFlow(图文教程)
Jun 18 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 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中strlen和mb_strlen函数的区别
2014/03/07 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
Python中的map、reduce和filter浅析
2014/04/26 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
金融专业个人求职信范文
2013/11/28 职场文书
矫正人员思想汇报
2014/01/08 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
关于美容院的活动方案
2014/08/14 职场文书
教师个人成长总结
2015/02/11 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
学生安全责任协议书
2016/03/22 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang