【问题标题】:urllib2.urlopen cannot get image, but browser canurllib2.urlopen 无法获取图像,但浏览器可以
【发布时间】:2017-04-20 10:29:55
【问题描述】:

有一个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。谢谢。

【问题讨论】:

    标签: python http request uri urllib2


    【解决方案1】:

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

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

    如果您在 Chrome 或 Firefox 中使用 DevTools,您会看到通常浏览器(如果还没有 cookie)会收到带有 cookie 的第一个响应,而 302 Moved Temporarily 会重定向到相同的 url 但带有 cookie,然后它会收到图像.

    你可以试试我的 cookie,也许它会收到图像。 Bu 通常你必须做两个请求 - 第一个获取 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)
    

    【讨论】:

    • 我可以从这个站点获取有效的cookies吗?好像urllib2.urlopen(req) 收不到cookies?
    • 使用urllib.request 你将不得不使用CookieJar 类,但它需要更多的工作——所以我总是使用requests 模块。
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多