我正在编写一个程序,该程序使用Beautiful Soup抓取网站,然后使用urllib检索网站上找到的图像(使用图像的直接URL)。我正在抓取的网站不是图片的原始主机,但确实链接到原始图片。我遇到的问题是,对于某些网站检索www.example.com/images/foobar.jpg
重定向到主页www.example.com
,并产生一个空(0 KB)的图像。事实上,转到www.example.com/images/foobar.jpg
也会重定向。有趣的是,在我抓取的网站上,图像显示正常。
我看过一些关于SO的例子,但是它们都解释了如何在绕过重定向的同时从网站捕获cookie, header和其他类似的数据,我无法让它们为我工作。是否有一种方法可以防止重定向并获得存储在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']持有准确的url为图像,例如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.
您试图下载图像的网站可能有额外的检查来限制屏幕抓取的数量。常见的检查是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