我有~80 000个网址,我想得到它们的响应状态代码。请注意,我希望尽快得到它。我使用HEAD
python电池尝试了GET
和requests
请求,但这对我的目标来说太慢了。根据我的计算,它将采取> 10个小时。这是可悲的。
我发现的另一种方法是使用tornado
。我在500个网址上测试了它(请看一下代码)。它使他的工作变得快,但是(!)大量的响应代码是599.这很奇怪,然后我检查了通过浏览器(简单GET
请求)映射到599代码的网址并确保该网址很好。如何解决这个问题?
from urlparse import urlparse
from threading import Thread
import httplib, sys
from Queue import Queue
from tornado import ioloop, httpclient, gen
import tornado
from time import sleep
i = 0
good = 0
def handle_request(response):
global good
if response.code != 200:
print response.code, response.reason, response.request.url
else:
good += 1
print 'KKKKKKKKKKK: ', good, '[%s]' % response.request.url
global i
i -= 1
if i == 0 or i < 0:
ioloop.IOLoop.instance().stop()
http_client = httpclient.AsyncHTTPClient()
lis = []
for url in open('urls'):
lis.append(url.strip())
specific_domain = '...'
for l in lis[:500]:
i += 1
method = 'GET' if specific_domain in l else 'HEAD'
req = tornado.httpclient.HTTPRequest(l, method=method, request_timeout=30.0)
http_client.fetch(req, handle_request)
ioloop.IOLoop.instance().start()
答案 0 :(得分:2)
599是Tornado为内部超时生成的响应代码。在这种情况下,大多数请求可能在等待插槽时在队列中超时。您可以增加超时(在发出请求时传递request_timeout
),也可以管理自己的队列,只在处理请求时将速度提交到AsyncHTTPClient
(这通常建议用于大型抓取工作,如它可以让您自己决定不同主机的优先级和公平性。有关队列的示例,请参阅tornado: AsyncHttpClient.fetch from an iterator?