我的项目要求我验证大量的网址。这些URL已被一个我无法控制的非常不可靠的进程捕获。所有的URL都已经过regexp验证,并且已知格式正确。我也知道他们都有有效的TLD
我希望能够快速过滤这些网址,以确定哪些网址不正确。此时我并不关心页面上的内容是什么 - 我只想尽快知道哪些页面无法访问(例如产生404错误)。
鉴于有很多这些,我不想下载整个页面,只是HTTP标题,然后从标题的内容中好好猜测页面是否可能存在。
可以吗?
答案 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)
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。)