0%

python爬虫实例之retry装饰器和timeout设置

需求

爬取url序列时,难免出现部分url请求超时。我们可以设置requests模块发送请求的timeout时间,超过timeout就停止等待。设置这个timeout,就是防止requests傻等,不让它吊死在一棵树上,还有大片森林等着它呢—-
我们手动访问url时,如果出现访问超时了,我们一般会刷新网站。不抛弃不放弃,是我们冲浪的基本准则~~
python语言,也有类似的做法,使用retrying模块的retry装饰器,就可以达到刷新的效果。(即:程序抛出异常后,发送多次url请求)

怎么做

我们需要用到retry装饰器,达到重发请求的目的。首先得安装retrying模块,安装方法:pip3 install retrying

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
from retrying import retry #引用retrying模块的retry装饰器

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}

@retry(stop_max_attempt_number=3) #retry装饰器:stop_max_attempt_number这个参数表示捕获到程序异常之后,重试的次数
def _parse_url(url):
print("*"*20) #这里打印输出*,输出了多少行*,就说明retry装饰器帮助我们发送了多少次请求
response = requests.get(url,headers=headers,timeout=5) #这里设置的超时时间是5秒。如果这条请求,等了5秒还没有响应,就不等了
assert response.status_code == 200 #这里设置了断言,如果响应码不等于200,就会抛出异常
return response.content.decode()

def parse_url(url):
try: #捕获异常
html_str = _parse_url(url)
except:
html_str = None #如果抛出异常(这里的异常,指的是retry装饰器重试之后,仍然出现异常),就把html_str设置为None
return html_str

if __name__ == '__main__':
url = "http://www.baidu.com"
html_str = parse_url(url)
print(html_str)

总结

这个代码的主要思想就是,对异常的判断,分了两步:初级异常出现,retry装饰器帮我们重发请求,如果重发3次请求,异常还是存在,就进入终极异常。触发异常的根本条件是请求的响应状态码不等于200

  • 第一步,请求的响应状态码不等于200,这时触发初级异常,retry装饰器帮我们重试,最多重发3次请求(因为我设置的重试次数是3)
  • 第二步,retry装饰器重试3次之后,请求的响应状态码仍然不等于200,这时触发终极异常,将请求失败的url响应html设置为None
-------------本文结束感谢您的阅读-------------