从某个 link 下载图像需要 urllib 永远

Downloading an image from a certain link takes forever with urllib

我正在尝试从提供的 URL 列表中下载图像。大多数 link 是 return 可接受的 link 或禁止的 link。但是,对于某个 link,我可以通过浏览器访问它,并且当代码尝试下载它时它不会抛出错误。它只是挂断并永远运行。这是 urllib、我的代码还是 link 本身的问题,是否有解决方法?

import urllib.request

urllib.request.urlretrieve("http://www.mercedsunstar.com/news/9d6aao/picture82035257/alternates/FREE_640/13330875_1110997995625119_2134033517544198418_n", "test_image.jpg") 

此特定站点正在检查 User-Agent 和其他 headers 浏览器通常发送的内容。如果这些不存在,它根本不会回答请求。因此您的代码永远不会返回。此机制有时用于防止自动抓取图像或其他内容,这可能是您正在尝试做的。

您可以查看 urllibbuild_opener()install_opener() 方法来创建一个 opener 实例并在使用 [= 之前​​修改它的 addheaders 属性 16=].

import urllib

opener = urllib.request.build_opener()
opener.addheaders = [("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:67.0) Gecko/20100101 Firefox/67.0")]
urllib.request.install_opener(opener)

之后,您问题中的代码应该可以正常工作了。

urllib.request.urlretrieve("http://www.mercedsunstar.com/news/9d6aao/picture82035257/alternates/FREE_640/13330875_1110997995625119_2134033517544198418_n", "test_image.jpg") 

如果您真的在抓取网络,我建议您查看专门设计用于执行此操作的框架,例如Scrapy。它提供了许多方便的功能,可能比从头开始构建一切更容易实现您想要实现的目标。

另请注意,他们可能出于某种原因使用此机制,并确保您没有侵犯他们的 属性 知识产权。

此页面检查 'User-Agent' header 以识别 Web 浏览器并阻止脚本和机器人程序。 urllib 使用类似于 "Python ..." 的字符串,因此服务器阻止了它。

这段代码对我有用

import urllib.request

req = urllib.request.Request('http://www.mercedsunstar.com/news/9d6aao/picture82035257/alternates/FREE_640/13330875_1110997995625119_2134033517544198418_n')
req.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0')

content = urllib.request.urlopen(req).read()
with open("test_image.jpg", 'wb') as f:
    f.write(content)