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 字符串格式化代码
Mar 17 Python
Python运算符重载用法实例分析
Jun 01 Python
python 实时遍历日志文件
Apr 12 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
有关Python的22个编程技巧
Aug 29 Python
python创建文件备份的脚本
Sep 11 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
自学python的建议和周期预算
Jan 30 Python
Python基于OpenCV实现人脸检测并保存
Jul 23 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
详解python tkinter 图片插入问题
Sep 03 Python
Python 处理表格进行成绩排序的操作代码
Jul 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+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
3种php生成唯一id的方法
2015/11/23 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
python的几种开发工具介绍
2007/03/07 Python
Python制作数据导入导出工具
2015/07/31 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
python实现教务管理系统
2018/03/12 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python @classmethod 的使用场合详解
2019/08/23 Python
python实现超市商品销售管理系统
2019/11/22 Python
python 实现客户端与服务端的通信
2020/12/23 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
考试不及格检讨书
2014/01/09 职场文书
新年主持词
2014/03/27 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
农村门前三包责任书
2014/07/25 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
活动宣传稿范文
2015/07/23 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang