python 2.7
Ubuntu 12.04
我正在尝试组装一个图像抓取工具,我以前没有遇到任何问题,但现在我卡在了某个点上。
我从任何地方(网页或用户)获取图像链接列表,让我们假设它们是有效链接。
我正在抓取的网站是 imgur,一些链接不起作用,因为我没有添加对它们的支持(单个文件),我有从相册页面向下获取每个图像链接的代码,有效并返回如下链接:
http://i.imgur.com/5329B8H.jpg #(intentionally broken link)
我在实际程序中使用的 image_download 函数:
def image_download(self, links):
for each in links:
url = each
name = each.split('/')[-1]
r = requests.get(url, stream=True)
with open(name, 'wb') as f:
for chunk in r.iter_content(1024):
if not chunk:
break
f.write(chunk)
我拥有的用于测试的 image_download 函数可以自行运行:
def down():
links = ['link-1', 'link-2']
for each in links:
name = each.split('/')[-1]
r = requests.get(each, stream=True)
with open(name, 'wb') as f:
for chunk in r.iter_content(1024):
if not chunk:
break
f.write(chunk)
问题来了,第二个有效。 他们都接受相同的输入,他们都做同样的事情。 第一个确实返回一个具有正确名称和扩展名的文件,但文件大小不同,例如 960b,而第二个返回一个大约 200kb 的文件。
当我打印请求时,两者都返回 200 的响应,我尝试在不同的点打印输出,据我所知,它们以完全相同的方式使用完全相同的数据运行,只是没有返回相同的信息。
这是怎么回事?
请您参考如下方法:
您需要再缩进一次f.write(chunk)。您现在只是将最后一个 block 写入文件。
修正后的函数如下所示:
def image_download(self, links):
for each in links:
url = each
name = each.split('/')[-1]
r = requests.get(url, stream=True)
with open(name, 'wb') as f:
for chunk in r.iter_content(1024):
if not chunk:
break
f.write(chunk) #This has been indented to be in the for loop.
