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的Flask框架中实现全文搜索功能
Apr 20 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
Jul 12 Python
浅谈flask中的before_request与after_request
Jan 20 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
python制作填词游戏步骤详解
May 05 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
Python 线程池用法简单示例
Oct 02 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
如何利用Python matplotlib绘制雷达图
Dec 21 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随机显示图片的简单示例
2014/02/15 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
jquery 实现的全选和反选
2009/04/15 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
python 实现IP子网计算
2021/02/18 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
自我鉴定范文300字
2013/10/01 职场文书
读书活动总结
2014/04/28 职场文书
水电维修专业推荐信
2014/09/06 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
千与千寻观后感
2015/06/04 职场文书
高中体育课教学反思
2016/02/16 职场文书
责任书格式
2019/04/18 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
python如何进行基准测试
2021/04/26 Python
vue实现滑动解锁功能
2022/03/03 Vue.js
Python+DeOldify实现老照片上色功能
2022/06/21 Python