scrapy采集的图片如何保存在不同的文件夹?

发布于 2022-09-05 08:33:49 字数 580 浏览 18 评论 0

有时候爬虫爬到不同内容的图片,例如头像一类,动态内容的图片又是一类,如何能在scrapy下载的时候分开文件夹存储?
找到修改图片名存储的方法,参考:https://segmentfault.com/q/10...
但是这个方法只能修改图片名去存储,没法改变路径。

clipboard.png
即使我在file_path方法中强制多加一个/a/的路径,也不行。这样,根本就没图像下载,打开Pic文件夹,空空如也。

clipboard.png

请问如何修改图片保存的路径呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

与之呼应 2022-09-12 08:33:49

不用在process_item里写,这个函数还是用来干过滤比较合适。
你重写file_path的做法没错,因为file_path只返回一个字符串,后续的处理还在ImagesPipeline类的其他函数里。同时要配合get_media_requests传递meta,不然拿不到item的,请参考:

def get_media_requests(self, item, info):
    for image_url in item['image_urls']:
        yield scrapy.Request(url=image_url, headers={'Referer': item['page_url'][0]}, meta={'item': item})

def file_path(self, request, response=None, info=None):
    item = request.meta['item']
    path = "covers/%s.%s" % (item['id'][0],
                            item['image_urls'][0].split('.')[-1])
    return path

我猜你出问题的地方还有setting.py里没写对自定义的类名,这样的话scrapy还是在用默认的pipeline在跑,你再怎么改也一样,注意一下下面这两个地方吧,都要设定的。

ITEM_PIPELINES = {'yourproject.pipelines.**MyImagesPipeline**': 100}
IMAGES_STORE = '/yourpath'
謸气贵蔟 2022-09-12 08:33:49

setting中修改配置了吗,这是我自己写的一个方法,你可以参考下
image_urls是图片的地址,
img_postfix是图片的后缀,默认是jpg,
name是图片的名字
filepath是图片的存储路径
header就是他的请求的的header,有的可能需要

class ImagesPipeline(object):
    def process_item(self, item, spider):
        headers = None
        if 'image_urls' in item:  # 如何‘图片地址’在项目中
            dir_path = '%s' % (item['filepath'])
            if not os.path.exists(dir_path):
                os.makedirs(dir_path)
            if 'img_postfix' in item:
                file_path = '%s/%s.%s' % (dir_path, item['name'], item['img_postfix'])
            else:
                file_path = '%s/%s.jpg' % (dir_path, item['name'])
            if os.path.exists(file_path):
                del item
                return None
            else:
                images = file_path
                if 'header' in item:
                    headers = item['header'][0]
                with open(file_path, 'wb') as handle:
                    response = requests.get(item['image_urls'], stream=True,headers=headers)
                    for block in response.iter_content(1024):
                        if not block:
                            break
                        handle.write(block)
                item['images'] = images
                return item
任谁 2022-09-12 08:33:49

主要在pipelines文件中使用shutil.move()函数移动文件到你指定的目录下
参考这个:
https://www.jianshu.com/p/0ea...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文