爬蟲-Scrapy (五) 爬取美女圖片

Scrapy 框架的piplelines下提供瞭如今圖片和視頻的類,這使得咱們將頁面中的圖片下載到本地很是方便。框架

1.尋找目標dom

百度搜索‘美女’,就能夠找到不少有美女圖片的網站,這裏不貼地址了,反正不少。我找個是這樣個的一個網站
scrapy

 

咱們按F12看下頁面源碼結構
ide

 

 很是清晰,咱們的目標就是爬取頁面中的圖片,並按主題保存到本地,動手。網站

 2.itemurl

定義2個屬性,主題名稱和圖片地址列表。spa

## 圖片Item
class ImageItem(scrapy.Item):
    topic_name = scrapy.Field()         # 主題名
    img_url_list = scrapy.Field()       # 圖片url列表

3.spider3d

解析元素存入item,沒什麼特別說明的。code

import scrapy
from scpy1.items import ImageItem

class ImagespiderSpider(scrapy.Spider):
    name = 'ImageSpider'
    allowed_domains = ['www.*****.com']       #替換成目標網址
    start_urls = ['https://www.****/meinv/']  #替換成目標網址

    def parse(self, response):
        topic_list = response.xpath('//div[@id="container"]/div')[1:-1]
        # 遍歷主題
        for topic in topic_list:
            topic_name = topic.xpath('.//h3[@class="list_title"]//span/text()').extract_first()
            img_url_list = topic.xpath('.//img/@src').extract()
            item = ImageItem()
            item['topic_name'] = topic_name      # 主題名稱
            item['img_url_list'] = img_url_list  # 圖片url列表
            yield item

4.pipelineorm

這裏注意要繼承ImagePipeline ,而後重寫get_media_request 方法。

class ImageSpiderPipeline(ImagesPipeline):

    def get_media_requests(self, item, spider):
        # 循環每一張圖片地址下載
        for image_url in item['img_url_list']:
            yield Request(image_url)

5.settings

a.開啓pipeline

ITEM_PIPELINES = {
   'scpy1.pipelines.ImageSpiderPipeline': 300
}

 

b.設置圖片存儲根路徑(必須)

# set image store path
IMAGES_STORE = './image'

6. 運行看下結果

項目路徑/image/full 路徑下,圖片下載完成。是否是很是簡單。

7.重寫路徑

咱們觀察下圖片路徑 項目路徑/image 是咱們在settings 裏指定的路徑,full是自動生成的,而後圖片並無按照主題分類,這時候咱們從新下pipeline裏的file_path方法,

代碼以下:

class ImageSpiderPipeline(ImagesPipeline):

    def get_media_requests(self, item, spider):
        # 循環每一張圖片地址下載
        for image_url in item['img_url_list']:
            # 這裏meta={'item': item},目的事件item傳遞到file_path中
            yield Request(image_url,meta={'item':item})

    def file_path(self, request, response=None, info=None, *, item=None):
        # 讀取item中topic_name 做爲路徑名稱
        item = request.meta['item']
        path = item['topic_name']
        # 經過分割圖片路徑獲取圖片名字
        img_name = request.url.split("/")[-1]
        return '{}/{}.jpg'.format(path,img_name)

8.再次運行看效果

圖片已經按主題分好了,看着和小電影似的,下次儘可能不作這種類型的了。

 

 

相關文章
相關標籤/搜索