requests 加了 timeout 为啥还是会卡住?

2017-06-02 00:53:59 +08:00
 xiaoyu9527

conn = request.urlopen(image_url,timeout=300)

请问有啥优化的办法么?

爬虫爬了 24 小时卡住了。。 重启启动以后又继续爬了 所以不是被封

6918 次点击
所在节点    Python
8 条回复
fzleee
2017-06-02 03:05:33 +08:00
我有过类似经历,当然我用的是自带的 urllib。

后来跟着源代码一路排查,发现卡死在了获取 DNS 的步骤上。很不幸这个 timeout 不包括 DNS 查询时间。

urllib 直接使用 socket.getaddrinfo 获取 DNS(应该是这个函数,你可以再确认一下),写一个循环重复 1000 次,然后你发现自己的程序卡死了那么你应该遇到了和我一样的状况。

上面的那个函数触发一个系统调用去获取 DNS,所以当时我的结论是和操作系统相关的一个 bug,高并发请求导致 DNS 会卡死。(
也有可能是 DNS 服务器的问题?)

当时的服务器是 ubuntu1204,在相同 vps 服务商那里建一台全新的机器,也会有同样的问题,更换 dns 后问题得到解决。
12liuxiangyu12
2017-06-02 09:40:11 +08:00
requests 文档上有写
Note
timeout is not a time limit on the entire response download; rather, an exception is raised if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). If no timeout is specified explicitly, requests do not time out.

在最开始加一个
import socket
socket.setdefaulttimeout(时间)
就可以了
xiaoyu9527
2017-06-02 11:04:19 +08:00
@fzleee 我也感觉是 dns 的问题。因为我再次重试感觉也很顺
xiaoyu9527
2017-06-02 11:05:31 +08:00
@fzleee 我换成阿里 DNS 试试
ic3z
2017-06-03 09:05:45 +08:00
@12liuxiangyu12 那如果要下大文件怎么办呢?
xiaoyu9527
2017-06-03 11:58:43 +08:00
换了阿里 DNS 以后。 问题消失。

竟然还能出现 DNS 的卡 BUG 问题 此贴完结。
xiaoyu9527
2017-08-08 16:00:37 +08:00
@fzleee 换成了阿里 dns 后竟然还出现了这个问题。

怎么解决
12liuxiangyu12
2017-09-22 10:19:19 +08:00
@ic3z 下大文件也可以,这个超时代表一定时间没有数据传输,你大文件还是在传输的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/365351

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX