【问题标题】:Able to see image on browser, but urllib.urlretrieve() fails to downlad it. How can I download it?能够在浏览器上看到图像,但 urllib.urlretrieve() 无法下载它。我怎样才能下载它?
【发布时间】:2018-07-19 00:01:39
【问题描述】:

图片路径-->http://markinternational.info/data/out/366/221983609-black-hd-desktop-wallpaper.jpg

我正在使用的代码

import urllib
urllib.urlretrieve("https://markinternational.info/data/out/366/221983609-black-hd-desktop-wallpaper.jpg" , "photu.jpg")

它返回什么(成功或不成功的尝试返回相同的东西)

('photu.jpg', <httplib.HTTPMessage instance at 0x7fe3cfb27d88>)

有人可以帮忙吗?

【问题讨论】:

  • 您的图像主机有问题。他们似乎阻止从非浏览器客户端下载图像。 Access denied | markinternational.info used Cloudflare to restrict access
  • 我将如何解决这个问题。有没有办法让他们不知道我是机器? @Sazzy
  • 顺便说一句@Sazzy你是怎么得到这个日志的
  • 做@Rakesh方法,查看phototu.jpg文件内容。
  • 我做到了。我得到了 3.3 kb photu.jpg,打开后出现错误,错误解释 JPEG 图像文件(不是 JPEG 文件:以 0x3c 0x21 开头)无法加载图像@Sazzy

标签: python web-scraping urllib


【解决方案1】:

您需要伪造用户代理以绕过 Web 服务器的此限制。

我使用了 Python3 和 requests 库,我设法得到了图片:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
url = 'https://markinternational.info/data/out/366/221983609-black-hd-desktop-wallpaper.jpg'
res = requests.get(url, headers=headers)
with open('photo.jpg', 'wb') as W:
    W.write(res.content)

【讨论】:

    【解决方案2】:

    这可能会有所帮助。

    import urllib
    f = open('photu.jpg','wb')
    f.write(urllib.urlopen('https://markinternational.info/data/out/366/221983609-black-hd-desktop-wallpaper.jpg').read())
    f.close()
    

    【讨论】:

    • 还是一样的结果,没有下载图片
    【解决方案3】:

    由于您发送的原始 http 请求没有任何 User-Agent 标头,因此服务器不允许该请求通过。您可以在标头中使用已定义的 User-Agent 模拟它,它就像在浏览器上一样工作。

    url = "https://markinternational.info/data/out/366/221983609-black-hd-desktop-wallpaper.jpg"
    
    req = urllib.request.Request(
        url, 
        data=None, 
        headers={
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
        }
    )
    
    with open('image.jpg', 'wb') as img_file:
        img_file.write(urllib.request.urlopen(req).read())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2019-01-04
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多