Skip to main content
 首页 » 编程设计

Python 图像抓取器在单独运行时有效,但在从其他地方调用时无效

2025年05月04日14jackei

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.