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实现统计英文单词个数及字符串分割代码
May 28 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
Python中is和==的区别详解
Nov 15 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
Python操作注册表详细步骤介绍
Feb 05 Python
Python threading.local代码实例及原理解析
Mar 16 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
Python3获取cookie常用三种方案
Oct 05 Python
python中复数的共轭复数知识点总结
Dec 06 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动态图像的创建
2006/10/09 PHP
php 表单验证实现代码
2009/03/10 PHP
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
深入理解PHP中的count函数
2016/05/31 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
Prototype Date对象 学习
2009/07/12 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
js模拟微博发布消息
2017/02/23 Javascript
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
新学期红领巾广播稿
2014/01/14 职场文书
校本教研活动总结
2014/07/01 职场文书
元旦晚会开场白
2015/05/29 职场文书
2019求职信大礼包
2019/05/15 职场文书
创业计划书之家政服务
2019/09/18 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript