我正在尝试从提供的URL列表中下载图像。大多数链接返回可接受的链接或禁止的链接。但是,对于某个链接,我可以通过浏览器访问它,并且在代码尝试下载时不会引发错误。它只是挂断并永远运行。这是urllib,我的代码还是链接本身的问题,有没有解决的办法?
import urllib.request
urllib.request.urlretrieve("http://www.mercedsunstar.com/news/9d6aao/picture82035257/alternates/FREE_640/13330875_1110997995625119_2134033517544198418_n", "test_image.jpg")
答案 0 :(得分:3)
该特定站点正在检查浏览器通常发送的User-Agent和其他标头。如果这些都不存在,它将根本不会回答请求。因此,您的代码永不返回。有时会使用此机制来防止图像或其他内容的自动爬网,这可能是您要尝试执行的操作。
在使用build_opener()
之前,您可以研究install_opener()
的{{1}}和urllib
方法来创建一个打开实例并修改其addheaders
属性。
urlretrieve
之后,您问题中的代码应按原样工作。
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)
如果您确实在爬网,我建议您考虑专门设计用于执行此操作的框架,例如Scrapy。它提供了许多方便的功能,与从头开始构建所有内容相比,可能可能更容易实现您要实现的目标。
还应告知他们,出于某种原因可能会采用此机制,并确保您没有侵犯其知识产权。
答案 1 :(得分:0)
此页面检查“ User-Agent”标头以识别Web浏览器并阻止脚本和机器人。 "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)
的字符串,因此服务器会阻止它。
此代码对我有用
y_train = y_train.reshape((60000, 1))