获取数万个HTTP响应代码

时间:2016-01-30 21:58:09

标签: python python-2.7 http tornado

我有~80 000个网址,我想得到它们的响应状态代码。请注意,我希望尽快得到它。我使用HEAD python电池尝试了GETrequests请求,但这对我的目标来说太慢了。根据我的计算,它将采取> 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()

1 个答案:

答案 0 :(得分:2)

599是Tornado为内部超时生成的响应代码。在这种情况下,大多数请求可能在等待插槽时在队列中超时。您可以增加超时(在发出请求时传递request_timeout),也可以管理自己的队列,只在处理请求时将速度提交到AsyncHTTPClient(这通常建议用于大型抓取工作,如它可以让您自己决定不同主机的优先级和公平性。有关队列的示例,请参阅tornado: AsyncHttpClient.fetch from an iterator?

中的答案
相关问题