【问题标题】:how can i determine if anything at the given url does exist [duplicate]我如何确定给定网址上的任何内容是否确实存在[重复]
【发布时间】:2010-12-30 06:44:06
【问题描述】:

如何使用 python 确定给定 url 上的任何内容是否存在于网络中?它可以是 html 页面或 pdf 文件,这无关紧要。 我试过写在这个页面上的解决方案http://code.activestate.com/recipes/101276/ 但当它是 pdf 文件或任何东西时,它只会返回 1。

【问题讨论】:

  • 你链接到的代码似乎做你想做的事?

标签: python http url


【解决方案1】:

发送 HEAD 请求

import httplib 
connection = httplib.HTTPConnection(url) 
connection.request('HEAD', '/') 
response = connection.getresponse() 
if response.status == 200:
    print "Resource exists"

【讨论】:

  • 我收到此答案的错误 Traceback(最近一次调用最后一次):文件“/home/cad/eclipse/wsp/pyCrawler/src/pyCrawler/pyCrawler.py”,第 63 行,在 打印 httpExists('sstatic.net/so/all.css?v=5912') 文件“/home/cad/eclipse/wsp/pyCrawler/src/pyCrawler/pyCrawler.py”,第 25 行,在 httpExists c = httplib.HTTPConnection(url) 文件“/usr/ lib64/python2.6/httplib.py”,第 656 行,在 init self._set_hostport(host, port) 文件“/usr/lib64/python2.6/httplib.py”,第 668 行,在 _set_hostport .....
  • 为了记录,这个确实使用 HTTP/1.1,所以在 Slashdot 上也可以工作。
【解决方案2】:

该示例中的 httplib 使用 HTTP/1.0 而不是 1.1,因此 Slashdot 返回状态代码 301 而不是 200。我建议使用 urllib2,并且还可能检查代码 20*30*

httplibdocumentation 声明:

它通常不直接使用——urllib 模块使用它来处理使用 HTTP 和 HTTPS 的 URL。

[...]

保留HTTP 类只是为了向后兼容 1.5.2。它不应该在新代码中使用。使用方法请参考在线文档。

所以是的。 urllib 是在 Python 中打开 URL 的方法——HTTP/1.0 客户端在现代 Web 服务器上不会走得太远。

(另外,我也可以使用 PDF 链接。)

【讨论】:

  • 与HTTP版本无关。实际上是因为httplib.HTTP 跳过了请求中的主机字段。您可以通过以下方式进行测试: $ telnet slashdot.org 80 HEAD / HTTP/1.0 主机:slashdot.org
  • 我真正的意思是 1.0 的请求不是要求包含主机头的。
【解决方案3】:

此解决方案返回 1,因为服务器正在发送 200 OK 响应。

您的服务器有问题。如果文件不存在,它应该返回 404。

【讨论】:

    【解决方案4】:

    您需要检查 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 费用在许多情况下是可以接受的。
    • 也许你也应该避免重定向代码。
    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2013-04-08
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2013-06-28
    相关资源
    最近更新 更多