解决Scrapy ImagesPipeline无法将爬取到的图片保存到指定路径的问题

项目场景:

Scrapy ImagesPipeline对图片进行爬取


问题描述:

Scrapy ImagesPipeline对图片进行爬取无法存入本地,运行结果中出现类似下面的代码

{'img_urls': ['https://b.zol-img.com.cn/desk/bizhi/image/10
/960x600/1610680763748.jpg'], 'images': []}

原因分析:

如果运行成功,结果应该是这样的

{'image_urls': ['https://b.zol-img.com.cn/desk/bizhi/image
/10/960x600/1610680763748.jpg'], 'images': [{'url': 'https:
//b.zol-img.com.cn/desk/bizhi/image/10/960x600/1610680763748
.jpg', 'path': 'full/5db01ba4532eda66262518832ff6c1a5e3fb50
3e.jpg', 'checksum': 'd81ead47e5fc0116a7102c57ad8a73b4', 'st
atus': 'downloaded'}]}

可以看到,两者相比,前者的‘images’中没有‘url’,‘path’等内容,说明我们没有将内容传进去。


解决方案:

事先说明一下,我不会把代码都copy下来让大家自己“找不同”,而是会将需要注意的点都列举下来,大家只需求同去异就好

ps:以下几点缺一不可

1.yield返回字典索引一定要是" image_urls" (item类型同理)

yield {
            "image_urls":image_url
        }

原因如下:

我们到python\Lib\site-packages\scrapy\pipelines下找到images.py文件

再去找到get_media_requests函数(保存文件的函数)

    def get_media_requests(self, item, info):
        urls = ItemAdapter(item).get(self.images_urls_field, [])
        return [Request(u) for u in urls]

ctrl+左键点击images_urls_field,跳转到

self.images_urls_field = settings.get(
            resolve('IMAGES_URLS_FIELD'),
            self.IMAGES_URLS_FIELD
        )

ctrl+左键点击IMAGES_URLS_FIELD,跳转到

        if not hasattr(self, "IMAGES_URLS_FIELD"):
            self.IMAGES_URLS_FIELD = self.DEFAULT_IMAGES_URLS_FIELD

ctrl+左键点击DEFAULT_IMAGES_URLS_FIELD,跳转到

DEFAULT_IMAGES_URLS_FIELD = 'image_urls'

这就是我们上面提到的索引,一定要和保持一致,否则系统无法识别

2.settings.py文件中要把ITEM_PIPELINES 取消注释,且要将其内容进行修改

网上所说的方法如下(我试过了没用,系统提示我没有scrpay.contrib的模块)
在这里插入图片描述

还有第二种方法(我亲身实践可用)

ITEM_PIPELINES = {
  'scrapy.pipelines.images.ImagesPipeline': 300,
}

ps:这个不绝对,大家可以自己亲自试一下,哪个能成功就用哪个

3.settings.py文件中要加上储存的文件地址并将其赋给IMAGES_STORE变量

(注意:变量名只能是IMAGES_STORE)

IMAGES_STORE = 'C:\\img2'

原因如下:

还是按上面提到过的方法找到images.py文件,在其中可以发现这样一行代码:

store_uri = settings['IMAGES_STORE']

所以我们设置的变量名一定要与其保持一致


最后

在修改完上述三点后,运行项目,应该就可以将图片保存到制定的路径中(系统会先为你新建一个名为full的文件夹,再将爬取到的图片放入full文件夹中)

结果图片如下:
在这里插入图片描述
在这里插入图片描述

希望我的文章能对大家有所帮助!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 首先,我们需要在项目的items.py文件中定义需要保存的数据字段,例如: ```python import scrapy class KaoyanItem(scrapy.Item): title = scrapy.Field() content = scrapy.Field() datetime = scrapy.Field() ``` 在代码中,我们定义了需要保存的三个字段,分别是"title"、"content"和"datetime"。 接下来,在Spider中实现xpath翻页爬取和数据保存。具体代码如下: ```python import scrapy from ..items import KaoyanItem class KaoyanSpider(scrapy.Spider): name = 'kaoyan_spider' allowed_domains = ['kaoyan.com'] start_urls = ['https://www.kaoyan.com/news/'] def parse(self, response): # 实现xpath爬取 data = response.xpath("你需要爬取的数据的xpath表达式") # 处理爬取到的数据 for item in data: kaoyan_item = KaoyanItem() kaoyan_item["title"] = item.xpath("标题的xpath表达式").get() kaoyan_item["content"] = item.xpath("内容的xpath表达式").get() kaoyan_item["datetime"] = item.xpath("发布时间的xpath表达式").get() yield kaoyan_item # 实现翻页 next_page = response.xpath("下一页的xpath表达式").get() if next_page: next_url = response.urljoin(next_page) yield scrapy.Request(next_url, callback=self.parse) ``` 在代码中,我们使用items.py文件中定义的KaoyanItem类来保存爬取到的数据,并使用yield语句将数据传给管道进行保存。同时,我们也实现了xpath翻页爬取。 接下来,我们需要配置管道来将数据保存到csv文件中。在项目的settings.py文件中添加以下配置: ```python FEED_FORMAT = "csv" FEED_URI = "data.csv" FEED_EXPORT_FIELDS = ["title", "content", "datetime"] ``` 在配置中,我们将数据保存的格式设置为csv,并指定保存路径为"data.csv"。同时,我们还指定了需要保存的字段,即"title"、"content"和"datetime"。 最后,启动爬虫并执行命令`scrapy crawl kaoyan_spider`,即可开始爬取保存数据。 需要注意的是,爬虫需要遵守网站的爬虫规则,不要过度频繁地请求网站。同时,对于数据的处理和保存方式,需要根据具体情况进行选择和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值