我正在尝试制作一个下载电影文件字幕的小程序。
但是我注意到,当我点击 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/