测试大量格式良好的URL的有效性的最快方法是什么

时间:2009-02-18 23:46:48

标签: python http

我的项目要求我验证大量的网址。这些URL已被一个我无法控制的非常不可靠的进程捕获。所有的URL都已经过regexp验证,并且已知格式正确。我也知道他们都有有效的TLD

我希望能够快速过滤这些网址,以确定哪些网址不正确。此时我并不关心页面上的内容是什么 - 我只想尽快知道哪些页面无法访问(例如产生404错误)。

鉴于有很多这些,我不想下载整个页面,只是HTTP标题,然后从标题的内容中好好猜测页面是否可能存在。

可以吗?

8 个答案:

答案 0 :(得分:7)

要真正做到这一点,你也可以使用eventlet使用非阻塞IO来加快速度。

你可以使用这样的头部请求:

from eventlet import httpc
try:
    res = httpc.head(url)
except httpc.NotFound:
    # handle 404

然后,您可以将其放入一些简单的脚本,如that example script here。有了这个,你应该通过使用协同程序池获得相当多的并发性。

答案 1 :(得分:6)

我假设您希望根据您的代码在Python中执行此操作。在那种情况下,我会使用httplib。 (可选)以某种方式按主机对URL进行分组,以便您可以在一个连接中为具有相同主机的URL发出多个请求。使用HEAD请求。

conn = httplib.HTTPConnection("example.com")
conn.request("HEAD", "/index.html")
resp = conn.getresponse()
print resp.status

答案 2 :(得分:4)

使用httpliburlparse

def checkURL(url):
    import httplib
    import urlparse

    protocol, host, path, query, fragment = urlparse.urlsplit(url)

    if protocol == "http":
        conntype = httplib.HTTPConnection
    elif protocol == "https":
        conntype = httplib.HTTPSConnection
    else:
        raise ValueError("unsupported protocol: " + protocol)

    conn = conntype(host)
    conn.request("HEAD", path)
    resp = conn.getresponse()
    conn.close()

    if resp.status < 400:
        return true

    return false

答案 3 :(得分:3)

只需发送HTTP HEAD请求,如this question所接受的答案所示。

答案 4 :(得分:1)

您可以尝试发送HTTP HEAD请求,而不是为每个URL发送HTTP GET请求。它们在this document中描述。

答案 5 :(得分:0)

twisted这是一个微不足道的案例。您可以使用几种并发工具来降低速度,否则,它几乎可以同时完成。

Twisted绝对是我最喜欢的python。 :)

答案 6 :(得分:0)

这可能会帮助你开始。 sitelist.txt文件包含URI列表。您可能必须安装httplib2,强烈推荐。我在每个请求之间设置了一个睡眠,因此如果您在同一个站点上有许多URI,则您的客户端不会因滥用资源而被列入黑名单。

   import httplib2
   import time

   h = httplib2.Http(".cache")

   f = open("sitelist.txt", "r")
   urllist = f.readlines()
   f.close()

   for url in urllist:
      # wait 10 seconds before the next request - be nice with the site
      time.sleep(10)
      resp= {}
      urlrequest = url.strip()
      try:
         resp, content = h.request(urlrequest, "HEAD")
         if resp['status'] == "200":
            print url, "200 - Good"
         else:
            print url, resp['status'], " you might want to double check"
      except:
         pass

答案 7 :(得分:0)

执行类似工作的Python程序(对于存储在del.icio.us的URL列表)是disastrous

而且,是的,它使用HEAD而不是GET,但是请注意一些(不是HTTP标准)服务器为HEAD和GET发送不同的结果:Python环境Zope是典型的罪魁祸首。(另外,在某些情况下,网络问题,例如隧道+破坏防火墙,阻止ICMP,防止大数据包通过,因此HEAD工作,而不是GET。)