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 isinstance判断对象类型
Sep 06 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
python读取excel表格生成erlang数据
Aug 26 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
如何通过命令行进入python
Jul 06 Python
python实现学生信息管理系统源码
Feb 22 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 正则匹配函数体
2009/08/25 PHP
php实现rc4加密算法代码
2012/04/25 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
使用Python写一个小游戏
2018/04/02 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python不同版本的_new_不同点总结
2020/12/09 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
魅力教师事迹材料
2014/01/10 职场文书
2014年三万活动总结
2014/04/26 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
个人工作表现自我评价
2015/03/06 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle
Java数据结构之堆(优先队列)
2022/05/20 Java/Android