项目场景:
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文件夹中)
结果图片如下:
希望我的文章能对大家有所帮助!