conn = request.urlopen(image_url,timeout=300)
请问有啥优化的办法么?
爬虫爬了 24 小时卡住了。。 重启启动以后又继续爬了 所以不是被封
1
fzleee 2017-06-02 03:05:33 +08:00 via iPhone 2
我有过类似经历,当然我用的是自带的 urllib。
后来跟着源代码一路排查,发现卡死在了获取 DNS 的步骤上。很不幸这个 timeout 不包括 DNS 查询时间。 urllib 直接使用 socket.getaddrinfo 获取 DNS(应该是这个函数,你可以再确认一下),写一个循环重复 1000 次,然后你发现自己的程序卡死了那么你应该遇到了和我一样的状况。 上面的那个函数触发一个系统调用去获取 DNS,所以当时我的结论是和操作系统相关的一个 bug,高并发请求导致 DNS 会卡死。( 也有可能是 DNS 服务器的问题?) 当时的服务器是 ubuntu1204,在相同 vps 服务商那里建一台全新的机器,也会有同样的问题,更换 dns 后问题得到解决。 |
2
12liuxiangyu12 2017-06-02 09:40:11 +08:00 1
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(时间) 就可以了 |
3
xiaoyu9527 OP @fzleee 我也感觉是 dns 的问题。因为我再次重试感觉也很顺
|
4
xiaoyu9527 OP @fzleee 我换成阿里 DNS 试试
|
5
ic3z 2017-06-03 09:05:45 +08:00 via Android
@12liuxiangyu12 那如果要下大文件怎么办呢?
|
6
xiaoyu9527 OP 换了阿里 DNS 以后。 问题消失。
竟然还能出现 DNS 的卡 BUG 问题 此贴完结。 |
7
xiaoyu9527 OP |
8
12liuxiangyu12 2017-09-22 10:19:19 +08:00
@ic3z 下大文件也可以,这个超时代表一定时间没有数据传输,你大文件还是在传输的
|