【问题标题】:Python urllib2 Response headerPython urllib2 响应头
【发布时间】:2009-10-31 06:17:18
【问题描述】:

我正在尝试提取 URL 请求的响应标头。当我使用 firebug 分析 URL 请求的响应输出时,它返回:

Content-Type text/html

但是当我使用 python 代码时:

urllib2.urlopen(URL).info()

结果输出返回:

Content-Type: video/x-flv

我是 python 新手,一般来说是 web 编程;非常感谢任何有用的见解。另外,如果需要更多信息,请告诉我。

提前感谢您阅读这篇文章

【问题讨论】:

标签: python url header response


【解决方案1】:

尝试像 Firefox 那样请求。您可以在 Firebug 中看到请求标头,因此将它们添加到您的请求对象中:

import urllib2

request = urllib2.Request('http://your.tld/...')
request.add_header('User-Agent', 'some fake agent string')
request.add_header('Referer', 'fake referrer')
...
response = urllib2.urlopen(request)
# check content type:
print response.info().getheader('Content-Type')

还有 HTTPCookieProcessor 可以让它变得更好,但我认为在大多数情况下你不需要它。看看python的文档:

http://docs.python.org/library/urllib2.html

【讨论】:

  • 对于 Python 3:response.info()["content-type"]
  • 网站是否完全不可能检查请求是否包含虚假引荐来源网址?我的尝试并不幸运,总是出现错误“Invalid referer, won't load xy”...
  • 另外,如果 info() 没有显示一行“Referer”:我可以断定“fake referer”不起作用吗?
【解决方案2】:

内容类型文本/html

真的,像那样,没有冒号吗?

如果是这样,这可能会解释它:它是一个无效的标头,因此它被忽略,因此 urllib 通过查看文件名来猜测内容类型。如果 URL 的末尾恰好有“.flv”,它会猜测类型应该是video/x-flv

【讨论】:

    【解决方案3】:

    这种特殊的差异可能是由两个请求发送的不同标头(可能是接受类型的标头)来解释的——您能检查一下吗...?或者,如果 Javascript 正在 Firefox 中运行(我假设您在运行 firebug 时正在使用它?)——因为它绝对没有在 Python 案例中运行——“所有的赌注都没有”,正如他们所说的那样;-) .

    【讨论】:

    • hmmm,我不太确定会有两个不同的标题以及如何区分两者。我很确定 javascript 正在 firefox 中运行......那么我在 python 中需要做什么?
    • @looter,没有直接的方法在 Python 中执行 Javascript——如果 Javascript 在确定页面的最终内容方面发挥着关键作用,那么你最好的选择是自动化真正的浏览器,例如通过 SeleniumRC。
    • 我不确定 Javascript 是否正在处理请求,因为当我在 firebug 中使用网络监控时,响应标头也可以在 HTML 视图中查看。就像我在帖子中提到的那样,我对 python 和 web 编程/脚本真的很陌生,所以其中一些让我头疼,我不确定我是否足够描述性。感谢您迄今为止的帮助。
    【解决方案4】:

    请记住,Web 服务器可能会根据请求的差异为同一 URL 返回不同的结果。例如,内容类型协商:请求者可以指定其将接受的内容类型列表,服务器可以返回不同的结果以尝试适应不同的需求。

    此外,您的某个请求可能会收到错误页面,例如,因为它格式错误,或者您没有设置正确验证您身份的 cookie,等等。查看响应本身以了解您的内容正在获得。

    【讨论】:

      【解决方案5】:

      根据http://docs.python.org/library/urllib2.html,只有get_header()方法,getheader一无所有。

      询问是因为您的代码适用于

      response.info().getheader('Set cookie')
      

      但是一旦我执行了

      response.info().get_header('Set cookie')
      

      我明白了:

      Traceback (most recent call last):
        File "baza.py", line 11, in <module>
          cookie = response.info().get_header('Set-Cookie')
      AttributeError: HTTPMessage instance has no attribute 'get_header'
      

      编辑: 此外
      response.headers.get('Set-Cookie') 也可以正常工作,在 urlib2 文档中没有提到......

      【讨论】:

      • get_header() 用于 urllib2.Request 类。响应类使用 getheader() 代替,这是一个不幸的不匹配。
      猜你喜欢
      • 2012-08-18
      • 2011-01-28
      • 2012-12-05
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2015-09-01
      相关资源
      最近更新 更多