Python检索文件而忽略重定向



我正在编写一个程序,该程序使用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 

相关内容

  • 没有找到相关文章

最新更新