我正在开发一个使用Beautiful Soup来抓取网站的程序,然后使用urllib来检索网站上的图像(使用图像的直接URL)。我正在抓取的网站不是图像的原始主机,但链接到原始图像。我遇到的问题是,某些网站检索www.example.com/images/foobar.jpg
会将我重定向到主页www.example.com
并生成一个空(0 KB)图像。实际上,转到www.example.com/images/foobar.jpg
重定向也是如此。在我正在抓取的网站上有趣,图像显示正常。
我在SO上看过一些例子,但他们都解释了如何在绕过重定向的同时从网站捕获cookie,标题和其他类似数据,而我无法让它为我工作。有没有办法阻止重定向并将图像存储在www.example.com/images/foobar.jpg
?
这是保存图像的代码块:
from urllib import urlretrieve
...
for imData in imList:
imurl = imData['imurl']
fName = os.path.basename(URL)
fName,ext = os.path.splitext(fName)
fName += "_%02d"%(ctr,)+ext
urlretrieve(imurl,fName)
ctr += 1
处理所有抓取的代码太长,太合理地放在这里。但我已经确认在imData ['imurl']中保存了图像的准确网址,例如http://upload.wikimedia.org/wikipedia/commons/9/95/Brown_Bear_cub_in_river_1.jpg。但是,某些图片会重定向:http://www.public-domain-image.com/public-domain-images-pictures-free-stock-photos/fauna-animals-public-domain-images-pictures/bears-public-domain-images-pictures/brown-bear-in-dog-salmon-creek.jpg。
答案 0 :(得分:0)
您尝试从中下载图片的网站可能需要额外检查以限制屏幕抓取量。常见的检查是Referer
标题,您可以尝试将其添加到urllib
请求中:
req = urllib2.Request('<img url>')
req.add_header('Referer', '<page url / domain>')
例如,我的浏览器用于此引用网站的羊驼图像的请求包含一个引用标题:
Request URL:http://www.public-domain-image.com/cache/fauna-animals-public-domain-images-pictures/alpacas-and-llamas-public-domain-images-pictures/alpacas-animals-vicugna-pacos_w725_h544.jpg
Request Method:GET
....
Referer:http://www.public-domain-image.com/fauna-animals-public-domain-images-pictures/alpacas-and-llamas-public-domain-images-pictures/alpacas-animals-vicugna-pacos.jpg.html
User-Agent:Mozilla/5.0