天天看點

使用scrapy爬取圖檔

一 半自定義方法

這裡我們以美食傑為例,爬取它的圖檔,作為示範,這裡隻爬取一頁。美食傑網址

使用scrapy爬取圖檔

1 首先我們在指令行進入到我們要建立的目錄,輸入 scrapy startproject meishi, 接着根據提示cd meishi, 再cd meishi,

, 下來寫 scrapy genspider mei meishij.net ,生成如圖所示檔案。

(關于以上指令的講解不在這次寫的範圍内)

使用scrapy爬取圖檔

2 點進如圖所示的mei.py 檔案,這裡需要注意,要将start_urls[] 改為我們要爬取的Url 位址,然後根據xpath爬取圖檔

(這裡放圖檔而不放源碼得原因是,代碼得自己寫,不要複制)

使用scrapy爬取圖檔

3 進入到items 檔案,她來處理剛剛得到的檔案

使用scrapy爬取圖檔

4 進入到mei.py 檔案,引入items這個檔案的函數,并進行輸出,因為src是圖檔,是以要用[]括起來

使用scrapy爬取圖檔

5 在settings.py 裡進行設定,大緻在67行前後的位置,自己定義下載下傳。

最後兩句代碼,IMAGES_STORE = ’ ’ 裡面寫圖檔儲存的路徑

IMAGES_URLS_FIELD=’ ’ 裡面寫接收圖檔的變量

使用scrapy爬取圖檔

6 在指令行輸入 scrapy crawl mei 點選确認,看到如圖所示,表示成功

使用scrapy爬取圖檔

2 使用系統的方法

上面的方法雖然能爬取下來圖檔,但是圖檔的名字是scrapy 根據某些規則(哈希) 為我們命名的,但是我們想用圖檔原本的名字進行命名時,這種方法就明顯不行了, 這時需要另外一種辦法了。

下面,将以站長素材網為例,爬取圖示,并根據名字儲存下來 網址

1 上面已經介紹了如何建立scapy的方法,這裡不再贅述,還是和上面一樣,使用xpath提取我們想要的資料,

這裡我們需要兩個資料,一個是标題,一個是每一個詳細圖檔的連結位址,

使用scrapy爬取圖檔
使用scrapy爬取圖檔

2 首先進入剛才給的網址,提取每一頁的詳細連結,使用callback=‘下一個函數的名字‘’

這裡需要注意,把函數自帶的括号删掉。

關于item配置,跟上面的一樣,這裡title表示提取出來的标題,src 表示每一個圖檔的詳細連結

(xpath方法寫的很爛,最精簡的應該是,檢視F12 點到你要提取的元素–>右擊–>copy–>copy_Xpath, 這個以前介紹過)

接下來配置Items 跟上面一樣,這次多了一個title

# -*- coding: utf-8 -*-
import scrapy
from ..items import ZhanzhangItem

class ZhanSpider(scrapy.Spider):
    name = 'zhan'
    allowed_domains = ['sc.chinaz.com']
    start_urls = ['http://sc.chinaz.com/tubiao/']

    def parse(self, response):
        href_list = response.xpath('//div[@class="text_left"]//li/span/a/@href').extract()
        for href in href_list:
            yield scrapy.Request(url=href, callback=self.get_info)

    def get_info(self, response):
        div_list = response.xpath('//div[@class="all_wrap"]//div[@class="left"]')
        for div in div_list:
            title = div.xpath('.//div[2]/h2/a/text()').extract_first('')
            src_list = div.xpath('.//div[@class="png_pic"]/img/@src').extract()
            for src in src_list:
                item = ZhanzhangItem()
                item['title'] = title
                item['src'] = [src]
                yield item
           

3 進入到settings.py 設定如圖所示

使用scrapy爬取圖檔

4 寫關于下載下傳的函數, 我們進入到pipelines.py 檔案, 我這裡把原類注釋掉了,也可以在裡面直接寫,

但是函數的名字是固定的,

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import scrapy
# ImagesPipeline 為系統中下載下傳圖檔的管道
from scrapy.pipelines.images import ImagesPipeline
#
# class ZhanzhangPipeline(object):
#     def process_item(self, item, spider):
#         return item

# 這個類的意思是,繼承裡系統中下載下傳圖檔的功能
class ZhanzhangPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        yield scrapy.Request(url=item['src'][],meta={'item':item})

    def file_path(self, request, response=None, info=None):
        item = request.meta['item']
        # 設定圖檔的路徑為  類型名稱/url位址
        # 這是一個圖檔的url: http://pics.sc.chinaz.com/Files/pic/icons128/7065/z1.png
        # 這句代碼的意思是先取出圖檔的url,[0]表示從清單轉成字元串
        # split分割再取最後一個值,這樣寫是讓圖檔名字看起來更好看一點
        image_name = item['src'][].split('/')[-]
           

5 檔案儲存 ,還是剛才的pipelines檔案,關于檔案儲存有兩種:

第一種方式:

(以下代碼應該接在上面代碼的後面,分開來寫是因為這樣更能講的清楚)

# 這樣寫是儲存在一個檔案夾裡面,注意最後是以'.jpg' 結尾
# path = item['title'] + image_name
           

指令行運作scrapy crawl zhan ,如圖所示

使用scrapy爬取圖檔

第二種方式:

# 這樣寫是儲存在不同的檔案夾中,根據title來為檔案夾命名,路徑下是圖檔的名字,還是以.jpg結尾的
        path = '%s/%s' % (item['title'], image_name)
        return path
           
使用scrapy爬取圖檔

最後,我們使用第二種方式整體運作一下,會得到如下圖所示

使用scrapy爬取圖檔

(在上面我倒數第二個圖檔裡面,每個檔案夾隻有一個圖檔,跟提取src數量有關,這些寫的原因是圖檔數量太多,剛開始寫的時候,每次隻取一個,測試起來友善)

上面個的我都是是爬取了一頁,要是想爬取所有頁面,可以根據網頁的下一頁源碼,進行提取,這裡以美食傑為例,簡單介紹一下

使用scrapy爬取圖檔

在剛才美食傑的mei.py檔案裡,加入如下代碼:

使用scrapy爬取圖檔

以上就是簡單的使用scrapy 爬取圖檔的方式,當然scrapy還可爬取其他東西,儲存成json,csv等,我将在下一篇中介紹