python - urllib2.urlopen() 不返回与 chrome 相同的页面

标签 python html google-chrome urllib2

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

但是我注意到,当我点击 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- zh

为什么会发生这种情况?如何遵循与浏览器相同的重定向?

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

最佳答案

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

opensubtitles.org 可能识别出您正在尝试以编程方式检索该网页,并且正在阻止它。尝试使用 Chrome 中的用户代理字符串之一(更多信息请参见 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

在你的脚本中。

请参阅此问题,了解如何编辑脚本以支持自定义用户代理 header - Changing user agent on urllib2.urlopen .

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

关于python - urllib2.urlopen() 不返回与 chrome 相同的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34844124/

相关文章:

python - 如何让图像/物体无限次跳跃?

css - 在其侧边栏父级之外显示下拉菜单,并在滚动时使菜单也根据其父级滚动,

javascript - 如何用 JavaScript 模拟按键或点击?

javascript - 登录表单不提供在 Chrome 上保存密码的功能

javascript - 你能让浏览器检测除 <a> 之外的元素上的 Javascript 链接吗

python - 在不使用集合的情况下,在嵌套的 for 循环中对 dict 和 list 中的项目进行成员资格检查?

python - 使用TastyPie进行用户注册。如何处理认证?

python - 将元组列表转换为字典

html - 需要帮助更改索引页面描述文本字体大小,以便我可以将其用作标题和子标题?

php - 无法获取 _POST 元素