urllib2.urlopen无法获取图像,但浏览器可以

时间:2016-12-05 22:11:04

标签: python http request uri urllib2

有一个gif图片链接,但urllib2无法下载。

import urllib.request as urllib2
uri = 'http://ums.adtechjp.com/mapuser?providerid=1074;userid=AapfqIzytwl7ks8AA_qiU_BNUs8AAAFYqnZh4Q'
try:
  req = urllib2.Request(uri, headers={ 'User-Agent': 'Mozilla/5.0' })
  file = urllib2.urlopen(req)
except urllib2.HTTPError as err:
  print('HTTP error!!!')
  file = err 
  print(err.code)
except urllib2.URLError as err:
  print('URL error!!!')
  print(err.reason)
  return 

data = file.read(1024)
print(data)

脚本完成后,数据仍为空。为什么会这样?没有HTTPError,我可以在浏览器控制台中看到有一个有效的gif,HTTP响应的状态是200 OK。谢谢。

1 个答案:

答案 0 :(得分:0)

您应该检查浏览器发送给服务器的所有标头。

此页面需要两个标题:User-AgentCookie

如果你在Chrome或Firefox中使用DevTools,你会发现通常浏览器(如果它还没有cookie)会收到第一个带有cookie的响应,而302 Moved Temporarily会重定向到相同的网址,但会使用Cookie和然后它收到图像。

你可以尝试我的cookie,也许它会收到图像。通常你必须做两个请求 - 第一个获取cookie,第二个(使用cookie)获取图像。

import urllib.request as urllib2

uri = 'http://ums.adtechjp.com/mapuser?providerid=1074;userid=AapfqIzytwl7ks8AA_qiU_BNUs8AAAFYqnZh4Q'

headers = {
    'User-Agent': 'Mozilla/5.0',
    'Cookie': 'JEB2=583077046E650E2495131DE8FD2F1371',
}

try:
  req = urllib2.Request(uri, headers=headers)
  f = urllib2.urlopen(req)
except urllib2.HTTPError as err:
  print('HTTP error!!!')
  f = err 
  print(err.code)
except urllib2.URLError as err:
  print('URL error!!!')
  print(err.reason)

data = f.read(1024)
print(data)

如果您使用requests模块,那么它将自动执行所有操作,您将不需要两个请求。

import requests

uri = 'http://ums.adtechjp.com/mapuser?providerid=1074;userid=AapfqIzytwl7ks8AA_qiU_BNUs8AAAFYqnZh4Q'

headers = {
    'User-Agent': 'Mozilla/5.0',
}

r = requests.get(uri, headers=headers)

print(r.content)