在Python中扫描一组URL的最快方法是什么?

时间:2012-07-19 16:50:56

标签: python url wsgi

我需要扫描一组给定的URL并在Python中获取类似“200 OK”的HTTP状态代码。我目前正在使用urllib来做到这一点。有更快的方法吗?

Python代码

def get_status(url):
try:
    return urllib.urlopen(url).getcode()

except StandardError :
    return None

5 个答案:

答案 0 :(得分:4)

夫妻言论我会为更快乐的状态检查做出准备。第一个提示是使用http HEAD方法。这要求服务器只提供http标头(包括状态代码),而不是它也为页面正文提供服务。

第二个urllib有效,但我建议使用精彩的Requests库,它提供了一个更好的API,几乎可以用于你想用http做的一切。

最后,我会使用gevents库让您以异步方式下载每个标头,从而大大加快整个过程。

答案 1 :(得分:2)

您可能希望以非阻塞方式并行执行此操作。在这里查看eventlet库:http://eventlet.net/。您只需从首页http://eventlet.net/#web-crawler-example获取示例。

答案 2 :(得分:1)

是的。

  1. 使用多个线程同时检查不同的URL。
  2. 使用实现简单HTTP请求的原始套接字。一旦获得200响应(或任何其他代码),您就会关闭连接,避免不必要的数据传输。

答案 3 :(得分:1)

对于速度,请尝试使用GRequests异步检查网址(不是一次检查网址)。

代码

import grequests

urls = [
    'http://www.heroku.com',
    'http://tablib.org',
    'http://httpbin.org',
    'http://python-requests.org',
    'http://kennethreitz.com'
]

rs = (grequests.get(u) for u in urls)
# For even faster status code checks, use the HEAD method instead of GET
# rs = (grequests.head(u) for u in urls)

for r in grequests.map(rs):
    print r.status_code, r.url

输出

200 http://www.heroku.com/
200 http://tablib.org/
200 http://httpbin.org/
200 http://docs.python-requests.org/en/latest/index.html
200 http://kennethreitz.com/

答案 4 :(得分:0)

使用线程。将代码放在Thread类中,并将结果存储在全局对象中。打电话给一堆线程。