我正在尝试制作一个可以下载电影文件字幕的小程序。
但是我注意到,当我在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)
答案 0 :(得分:2)
您使用上面的urllib2从Chrome和您的脚本发出的请求存在显着差异,那就是HTTP标头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
在你的剧本中。
请参阅此问题,了解如何编辑脚本以支持自定义用户代理标头 - Changing user agent on urllib2.urlopen。
我还建议使用Python的请求库而不是urllib2,因为API更容易理解 - http://docs.python-requests.org/en/latest/。