【问题标题】:urllib2.urlopen() does not return the same page as chromeurllib2.urlopen() 不返回与 chrome 相同的页面
【发布时间】:2016-04-22 23:57:20
【问题描述】:

我正在尝试制作一个下载电影文件字幕的小程序。

但是我注意到,当我点击 chrome 中的链接并使用 urllib2.urlopen() 打开它时,结果并不相同。

作为示例,让我们考虑链接 http://www.opensubtitles.org/en/subtitleserve/sub/5523343 。在 chrome 中,这会重定向到 http://osdownloader.org/en/osdownloader.subtitles-for.you/subtitles/5523343,稍后会下载我想要的文件。

但是,当我在 python 中使用以下代码时,我被重定向到另一个页面:

import urllib2
url = "http://www.opensubtitles.org/en/subtitleserve/sub/5523343"
response = urllib2.urlopen(url)

if response.url == url:
  print "No redirect"
else: 
  print url, " --> ", response.url

结果:http://www.opensubtitles.org/en/subtitleserve/sub/5523343 --> http://www.opensubtitles.org/en/subtitles/5523343/the-musketeers-commodities-en

为什么会这样?如何遵循与浏览器相同的重定向?

(我知道这些网站在python中提供API,但这是在python中的练习和第一次使用urllib2)

【问题讨论】:

    标签: python html google-chrome urllib2


    【解决方案1】:

    您从 Chrome 发出的请求与使用上述 urllib2 的脚本之间存在显着差异,即 HTTP 标头 User-Agent (https://en.wikipedia.org/wiki/User_agent)。

    opensubtitles.org 可能确定您正在尝试以编程方式检索该网页,并且正在阻止它。尝试使用 Chrome 中的 User-Agent 字符串之一(更多此处为http://www.useragentstring.com/pages/Chrome/):

    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36
    

    在你的脚本中。

    请参阅此问题,了解如何编辑脚本以支持自定义 User-Agent 标头 - Changing user agent on urllib2.urlopen

    我还想推荐使用 Python 的 requests 库而不是 urllib2,因为 API 更容易理解 - http://docs.python-requests.org/en/latest/

    【讨论】:

    • 更改用户代理并不能解决问题,无论是使用 urllib2 还是使用请求
    • 啊,我现在已经对此进行了更深入的研究@Cantfindname,似乎他们正在 JavaScript 中重定向到要下载的文件。以编程方式执行此操作(无论是否您正在使用 urllib2、请求或任何其他语言而不是 Python)是解析 html/javascript 并找出链接是什么,然后对文件 URL 发出新请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2013-05-27
    • 2015-02-05
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多