【发布时间】:2010-12-30 06:44:06
【问题描述】:
如何使用 python 确定给定 url 上的任何内容是否存在于网络中?它可以是 html 页面或 pdf 文件,这无关紧要。 我试过写在这个页面上的解决方案http://code.activestate.com/recipes/101276/ 但当它是 pdf 文件或任何东西时,它只会返回 1。
【问题讨论】:
-
你链接到的代码似乎做你想做的事?
如何使用 python 确定给定 url 上的任何内容是否存在于网络中?它可以是 html 页面或 pdf 文件,这无关紧要。 我试过写在这个页面上的解决方案http://code.activestate.com/recipes/101276/ 但当它是 pdf 文件或任何东西时,它只会返回 1。
【问题讨论】:
发送 HEAD 请求
import httplib
connection = httplib.HTTPConnection(url)
connection.request('HEAD', '/')
response = connection.getresponse()
if response.status == 200:
print "Resource exists"
【讨论】:
该示例中的 httplib 使用 HTTP/1.0 而不是 1.1,因此 Slashdot 返回状态代码 301 而不是 200。我建议使用 urllib2,并且还可能检查代码 20*和30*。
httplib 的 documentation 声明:
它通常不直接使用——
urllib模块使用它来处理使用 HTTP 和 HTTPS 的 URL。[...]
保留
HTTP类只是为了向后兼容 1.5.2。它不应该在新代码中使用。使用方法请参考在线文档。
所以是的。 urllib 是在 Python 中打开 URL 的方法——HTTP/1.0 客户端在现代 Web 服务器上不会走得太远。
(另外,我也可以使用 PDF 链接。)
【讨论】:
httplib.HTTP 跳过了请求中的主机字段。您可以通过以下方式进行测试: $ telnet slashdot.org 80 HEAD / HTTP/1.0 主机:slashdot.org
此解决方案返回 1,因为服务器正在发送 200 OK 响应。
您的服务器有问题。如果文件不存在,它应该返回 404。
【讨论】:
您需要检查 HTTP 响应代码。 Python 示例:
from urllib2 import urlopen
code = urlopen("http://example.com/").code
4xx 和 5xx 代码可能意味着您无法从该 URL 获取任何内容。 4xx 状态码描述客户端错误(如“404 Not found”),5xx 状态码描述服务器错误(如“500 Internal server error”):
if (code / 100 >= 4):
print "Nothing there."
链接:
【讨论】:
urlopen 发送 GET 请求,服务器将返回该 URL 的全部内容。个人觉得用HTTPConnection/HTTPSConnection建一个HEAD请求比较好,这样会节省很多网络流量。
HEAD 通常更好并且会节省流量。所以我赞成 Yacoby 的回答。但是,urllib2.urlopen 非常易于使用并节省了代码行数(例如,无需将 URL 拆分为服务器/路径对)。 GET 费用在许多情况下是可以接受的。