各位同学在使用爬虫时,有没有遇到过请求发出去很久却迟迟得不到响应结果的情况,相信很多同学都有过相似的经历,今天我们借助本文来给大家说一说应该如何解决。
一、远端服务器连接失败
举个例子,有些网站因为网络原因永远都不会访问成功,如果恰巧你的爬虫也在向一个类似的永远无法访问成功的服务器发送请求建立连接,如果没有任何防护措施,那么你的爬虫将会等待几分钟时间甚至更长,大大影响爬虫的效率,此时我们就可以借助 timeout 参数,指定超时时间让你的爬虫“冷静下来”,看代码,我使用对比的方式给大家看清楚 timeout 参数的作用。
import time
import requests
URL = 'https://www.google.com/'
Headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
try:
start_1 = time.time()
response = requests.get(url=URL, headers=Headers)
print("状态码:", response.status_code)
except Exception as err:
end_1 = time.time()
print(err)
print(f'无 timeout 等待:{end_1 - start_1}秒')
try:
start_2 = time.time()
response = requests.get(url=URL, headers=Headers, timeout=6)
print("状态码:", response.status_code)
except Exception as err:
end_2 = time.time()
print(err)
print(f'有 timeout 等待:{end_2 - start_2}秒')
有同学可能会问,timeout 设置了 6 秒,为什么结果是 10 秒。大家都知道,访问网站在宏观角度就分为发送请求(connect)和得到响应结果(read),这里的 timeout 参数如果指定一个值, 这一个值会分别作用于 connect 和 read,也就是说爬虫最大等待时间为 12 秒,当然也可以用二元组的形式给 timeout 赋值,例如timeout = (3, 6)
的形式,给 connect 最大 3 秒等待,read 最大 6 秒等待。
二、远端服务器连接缓慢
程序员朋友都知道,Github 这个网站访问起来很奇妙,你永远不知道下一次能不能打开或者下一次打开需要多久,如果你此时要用爬虫访问一个服务器非常缓慢的网站,那么超时时间也要设定好。此刻我们需要将 timeout 设定为 None,意味着一直等下去。
import requests
URL = 'https://github.com/'
Headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
response = requests.get(url=URL, headers=Headers, timeout=None)
print("状态码:", response.status_code)
以上呢就是针对于 Requests 模块的 timeout 参数的解读,大家在写爬虫的时候斟酌好 timeout,灵活使用可以大大提高爬虫的效率。