Python網絡爬蟲(scrapy管道類之ImagesPipeline)


  ImagesPipeline是scrapy自帶的類,用來處理圖片(爬取時將圖片下載到本地)用的。

優勢:

    1. 將下載圖片轉換成通用的JPG和RGB格式
    2. 避免重復下載
    3. 縮略圖生成
    4. 圖片大小過濾
    5. 異步下載
    6. ......

工作流程:

    1. 爬取一個Item,將圖片的URLs放入image_urls字段
    2. Spider返回的Item,傳遞到Item Pipeline
    3. Item傳遞到ImagePipeline,將調用Scrapy 調度器和下載器完成image_urls中的url的調度和下載。
    4. 圖片下載成功結束后,圖片下載路徑、url和校驗和等信息會被填充到images字段中。

實現方式:

    1. 自定義pipeline,優勢在於可以重寫ImagePipeline類中的實現方法,可以根據情況對照片進行分類;
    2. 直接使用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,
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM