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 20 Python
详解python中的json的基本使用方法
Dec 21 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
机器学习的框架偏向于Python的13个原因
Dec 07 Python
书单|人生苦短,你还不用python!
Dec 29 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
python实现逐个读取txt字符并修改
Dec 24 Python
python实现自动化上线脚本的示例
Jul 01 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 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+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
php批量修改表结构实例
2017/05/24 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
Vue中使用sass实现换肤功能
2018/09/07 Javascript
微信小程序实现留言板
2018/10/31 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
Python生成数字图片代码分享
2017/10/31 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
岗位职责说明书
2014/05/07 职场文书
职务说明书范文
2014/05/07 职场文书
党员服务承诺书
2014/05/28 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
python内置模块之上下文管理contextlib
2022/06/14 Python