可在pipeline中自定义一个图片类来继承Scrapy的图片类(ImagesPipeline[可以实现异步下载]),并重写ImagesPipeline的方法,来实现图片的异步下载
Scrapy的ImagesPipeline流程
- 在spider中爬取需要下载的图片链接,将其放入item中的image_urls.
- spider将其传送到pipieline
- 当ImagePipeline处理时,它会检测是否有image_urls字段,如果有的话,会将url传递给scrapy调度器和下载器
- 下载完成后会将结果写入item的另一个字段images,images包含了图片的本地路径,图片校验,和图片的url。
图片异步下载的实现
- 打开ITEM_PIPELINES(定义新建的TeacherPipeline管道)
ITEM_PIPELINES = {
#'car.pipelines.CarPipeline':300,
'car.pipelines.CarImgPipeline':1,
}
- 设置图片的保存路径(变量名称必须为IMAGES_STORE,否则无法识别)
大多数如下:
IMAGES_STORE=os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')
- 定义item
class CarItem(scrapy.Item):
# define the fields for your item here like(类似于字典的映射,避免字典时输入值出错)
# name = scrapy.Field()
title=scrapy.Field()
link=scrapy.Field()
images_urls=scrapy.Field()
pass
- 编写spider
class CarsSpider(scrapy.Spider):
name = 'cars'
allowed_domains = ['car.autohome.com.cn']
start_urls = ['https://car.autohome.com.cn/pic/series/65.html#pvareaid=2042214']
def parse(self, response):
links=response.xpath("//div[@class='row'][5]/div/div[@class='uibox']")
for i in range(