python爬虫多次请求超时的几种重试方法(6种)


Posted in Python onDecember 01, 2020

第一种方法

headers = Dict()
url = 'https://www.baidu.com'
try:
 proxies = None
 response = requests.get(url, headers=headers, verify=False, proxies=None, timeout=3)
except:
 # logdebug('requests failed one time')
 try:
  proxies = None
  response = requests.get(url, headers=headers, verify=False, proxies=None, timeout=3)
 except:
  # logdebug('requests failed two time')
  print('requests failed two time')

总结 :代码比较冗余,重试try的次数越多,代码行数越多,但是打印日志比较方便

第二种方法

def requestDemo(url,):
 headers = Dict()
 trytimes = 3 # 重试的次数
 for i in range(trytimes):
 try:
  proxies = None
  response = requests.get(url, headers=headers, verify=False, proxies=None, timeout=3)
  # 注意此处也可能是302等状态码
  if response.status_code == 200:
  break
 except:
  # logdebug(f'requests failed {i}time')
   print(f'requests failed {i} time')

总结 :遍历代码明显比第一个简化了很多,打印日志也方便

第三种方法

def requestDemo(url, times=1):
 headers = Dict()
 try:
  proxies = None
  response = requests.get(url, headers=headers, verify=False, proxies=None, timeout=3)
  html = response.text()
  # todo 此处处理代码正常逻辑
  pass
  return html
 except:
  # logdebug(f'requests failed {i}time')
  trytimes = 3 # 重试的次数
  if times < trytimes:
  times += 1
   return requestDemo(url, times)
  return 'out of maxtimes'

总结 :迭代 显得比较高大上,中间处理代码时有其它错误照样可以进行重试; 缺点 不太好理解,容易出错,另外try包含的内容过多时,对代码运行速度不利。

第四种方法

@retry(3) # 重试的次数 3
def requestDemo(url):
 headers = Dict()
 proxies = None
 response = requests.get(url, headers=headers, verify=False, proxies=None, timeout=3)
 html = response.text()
 # todo 此处处理代码正常逻辑
 pass
 return html
 
def retry(times):
 def wrapper(func):
  def inner_wrapper(*args, **kwargs):
   i = 0
   while i < times:
    try:
     print(i)
     return func(*args, **kwargs)
    except:
     # 此处打印日志 func.__name__ 为say函数
     print("logdebug: {}()".format(func.__name__))
     i += 1
  return inner_wrapper
 return wrapper

总结 :装饰器优点 多种函数复用,使用十分方便

第五种方法

#!/usr/bin/python
# -*-coding='utf-8' -*-
import requests
import time
import json
from lxml import etree
import warnings
warnings.filterwarnings("ignore")

def get_xiaomi():
 try:
  # for n in range(5): # 重试5次
  #  print("第"+str(n)+"次")
  for a in range(5): # 重试5次
   print(a)
   url = "https://www.mi.com/"
   headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
    "Connection": "keep-alive",
    # "Cookie": "xmuuid=XMGUEST-D80D9CE0-910B-11EA-8EE0-3131E8FF9940; Hm_lvt_c3e3e8b3ea48955284516b186acf0f4e=1588929065; XM_agreement=0; pageid=81190ccc4d52f577; lastsource=www.baidu.com; mstuid=1588929065187_5718; log_code=81190ccc4d52f577-e0f893c4337cbe4d|https%3A%2F%2Fwww.mi.com%2F; Hm_lpvt_c3e3e8b3ea48955284516b186acf0f4e=1588929099; mstz=||1156285732.7|||; xm_vistor=1588929065187_5718_1588929065187-1588929100964",
    "Host": "www.mi.com",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36"
   }
   response = requests.get(url,headers=headers,timeout=10,verify=False)
   html = etree.HTML(response.text)
   # print(html)
   result = etree.tostring(html)
   # print(result)
   print(result.decode("utf-8"))
   title = html.xpath('//head/title/text()')[0]
   print("title==",title)
   if "左左" in title:
   # print(response.status_code)
   # if response.status_code ==200:
    break
  return title

 except:
  result = "异常"
  return result

if __name__ == '__main__':
 print(get_xiaomi())

第六种方法

Python重试模块retrying

# 设置最大重试次数
@retry(stop_max_attempt_number=5)
def get_proxies(self):
 r = requests.get('代理地址')
 print('正在获取')
 raise Exception("异常")
 print('获取到最新代理 = %s' % r.text)
 params = dict()
 if r and r.status_code == 200:
  proxy = str(r.content, encoding='utf-8')
  params['http'] = 'http://' + proxy
  params['https'] = 'https://' + proxy
# 设置方法的最大延迟时间,默认为100毫秒(是执行这个方法重试的总时间)
@retry(stop_max_attempt_number=5,stop_max_delay=50)
# 通过设置为50,我们会发现,任务并没有执行5次才结束!

# 添加每次方法执行之间的等待时间
@retry(stop_max_attempt_number=5,wait_fixed=2000)
# 随机的等待时间
@retry(stop_max_attempt_number=5,wait_random_min=100,wait_random_max=2000)
# 每调用一次增加固定时长
@retry(stop_max_attempt_number=5,wait_incrementing_increment=1000)

# 根据异常重试,先看个简单的例子
def retry_if_io_error(exception):
 return isinstance(exception, IOError)

@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
 with open("file", "r") as f:
  return f.read()

read_a_file函数如果抛出了异常,会去retry_on_exception指向的函数去判断返回的是True还是False,如果是True则运行指定的重试次数后,抛出异常,False的话直接抛出异常。

当时自己测试的时候网上一大堆抄来抄去的,意思是retry_on_exception指定一个函数,函数返回指定异常,会重试,不是异常会退出。真坑人啊!

来看看获取代理的应用(仅仅是为了测试retrying模块)

到此这篇关于python爬虫多次请求超时的几种重试方法的文章就介绍到这了,更多相关python爬虫多次请求超时内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中的装饰器详解
Apr 13 Python
Python之py2exe打包工具详解
Jun 14 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
Python接口自动化测试的实现
Aug 28 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
python实现简单猜单词游戏
Dec 24 Python
python快速安装OpenCV的步骤记录
Feb 22 Python
python xlwt模块的使用解析
Apr 13 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 07 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 #Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 #Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 #Python
使用python爬取抖音app视频的实例代码
Dec 01 #Python
基于Python实现粒子滤波效果
Dec 01 #Python
Django集成MongoDB实现过程解析
Dec 01 #Python
基于Django快速集成Echarts代码示例
Dec 01 #Python
You might like
php切割页面div内容的实现代码分享
2012/07/31 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
python图像常规操作
2017/11/11 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
老生常谈python中的重载
2018/11/11 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
临床医学应届生求职信
2013/11/06 职场文书
学校司机岗位职责
2013/11/14 职场文书
村庄绿化方案
2014/05/07 职场文书
大专学生求职自荐信
2014/07/06 职场文书
远程培训的心得体会
2014/09/01 职场文书
办理护照工作证明
2014/10/10 职场文书
三峡大坝导游词
2015/01/31 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
python中redis包操作数据库的教程
2022/04/19 Python