从某个 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 浏览器通常发送的内容。如果这些不存在,它根本不会回答请求。因此您的代码永远不会返回。此机制有时用于防止自动抓取图像或其他内容,这可能是您正在尝试做的。
您可以查看 urllib
的 build_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)
我正在尝试从提供的 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 浏览器通常发送的内容。如果这些不存在,它根本不会回答请求。因此您的代码永远不会返回。此机制有时用于防止自动抓取图像或其他内容,这可能是您正在尝试做的。
您可以查看 urllib
的 build_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)