Python在忽略重定向的同时检索文件

时间:2014-03-14 17:37:27

标签: python beautifulsoup urllib

我正在开发一个使用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

1 个答案:

答案 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