ImagesPipeline是scrapy自帶的類,用來處理圖片(爬取時將圖片下載到本地)用的。
優勢:
-
- 將下載圖片轉換成通用的JPG和RGB格式
- 避免重復下載
- 縮略圖生成
- 圖片大小過濾
- 異步下載
- ......
工作流程:
-
- 爬取一個Item,將圖片的URLs放入
image_urls字段 - 從
Spider返回的Item,傳遞到Item Pipeline - 當
Item傳遞到ImagePipeline,將調用Scrapy 調度器和下載器完成image_urls中的url的調度和下載。 - 圖片下載成功結束后,圖片下載路徑、url和校驗和等信息會被填充到images字段中。
- 爬取一個Item,將圖片的URLs放入
實現方式:
-
- 自定義pipeline,優勢在於可以重寫ImagePipeline類中的實現方法,可以根據情況對照片進行分類;
- 直接使用ImagePipeline類,簡單但不夠靈活;所有的圖片都是保存在full文件夾下,不能進行分類
項目實現:
需求:爬取彼岸圖庫的圖片,並保存在本地文件夾,url:http://pic.netbian.com/
spider爬蟲文件(數據解析),獲取圖片url。biantu.py
# -*- coding: utf-8 -*- import scrapy from ..items import BiantuproItem class BiantuSpider(scrapy.Spider): name = 'biantu' # allowed_domains = ['www.xx.com'] start_urls = ['http://pic.netbian.com/'] # 數據解析 def parse(self, response): li_list = response.xpath('//*[@id="main"]/div[3]/ul/li') for li in li_list: img_url = "http://pic.netbian.com/"+li.xpath('./a/span/img/@src').extract_first() # 實例化一個item對象 item = BiantuproItem() item["img_url"] = img_url # 提交對象到管道 yield item
配置圖片存儲的item對象類。items.py
import scrapy class BiantuproItem(scrapy.Item): # define the fields for your item here like: # 存儲圖片地址 img_url = scrapy.Field()
配置管道類,這里我們下載圖片是自定義一個圖片下載類,並繼承scrapy中專門處理圖片下載的類(ImagesPipeline)。pipelines.py
from scrapy.pipelines.images import ImagesPipeline import scrapy # 自定義 創建下載及存儲的特殊管道類 class MyImagePipeline(ImagesPipeline): # 接收item對象並將獲取item對象中的url發送請求 def get_media_requests(self, item, info): yield scrapy.Request(item["img_url"]) # 指定文件存儲路徑 def file_path(self, request, response=None, info=None): # 打印圖片路徑 # print(request.url) # 通過分割圖片路徑獲取圖片名字 img_name = request.url.split("/")[-1] return img_name # 返回item對象,給下一執行的管道類 def item_completed(self, results, item, info): # 圖片下載路徑、url和校驗和等信息 print(results) return item
scrapy配置文件,配置圖片存放位置及開啟管道。settings.py
# Obey robots.txt rules ROBOTSTXT_OBEY = False LOG_LEVEL = "ERROR" # 指定文件保存位置 IMAGES_STORE = "imgsLab" # 配置管道 ITEM_PIPELINES = { 'biantuPro.pipelines.MyImagePipeline': 300, }
