一 半自定義方法
這裡我們以美食傑為例,爬取它的圖檔,作為示範,這裡隻爬取一頁。美食傑網址
1 首先我們在指令行進入到我們要建立的目錄,輸入 scrapy startproject meishi, 接着根據提示cd meishi, 再cd meishi,
, 下來寫 scrapy genspider mei meishij.net ,生成如圖所示檔案。
(關于以上指令的講解不在這次寫的範圍内)
2 點進如圖所示的mei.py 檔案,這裡需要注意,要将start_urls[] 改為我們要爬取的Url 位址,然後根據xpath爬取圖檔
(這裡放圖檔而不放源碼得原因是,代碼得自己寫,不要複制)
3 進入到items 檔案,她來處理剛剛得到的檔案
4 進入到mei.py 檔案,引入items這個檔案的函數,并進行輸出,因為src是圖檔,是以要用[]括起來
5 在settings.py 裡進行設定,大緻在67行前後的位置,自己定義下載下傳。
最後兩句代碼,IMAGES_STORE = ’ ’ 裡面寫圖檔儲存的路徑
IMAGES_URLS_FIELD=’ ’ 裡面寫接收圖檔的變量
6 在指令行輸入 scrapy crawl mei 點選确認,看到如圖所示,表示成功
2 使用系統的方法
上面的方法雖然能爬取下來圖檔,但是圖檔的名字是scrapy 根據某些規則(哈希) 為我們命名的,但是我們想用圖檔原本的名字進行命名時,這種方法就明顯不行了, 這時需要另外一種辦法了。
下面,将以站長素材網為例,爬取圖示,并根據名字儲存下來 網址
1 上面已經介紹了如何建立scapy的方法,這裡不再贅述,還是和上面一樣,使用xpath提取我們想要的資料,
這裡我們需要兩個資料,一個是标題,一個是每一個詳細圖檔的連結位址,
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 設定如圖所示
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 ,如圖所示
第二種方式:
# 這樣寫是儲存在不同的檔案夾中,根據title來為檔案夾命名,路徑下是圖檔的名字,還是以.jpg結尾的
path = '%s/%s' % (item['title'], image_name)
return path
最後,我們使用第二種方式整體運作一下,會得到如下圖所示
(在上面我倒數第二個圖檔裡面,每個檔案夾隻有一個圖檔,跟提取src數量有關,這些寫的原因是圖檔數量太多,剛開始寫的時候,每次隻取一個,測試起來友善)
上面個的我都是是爬取了一頁,要是想爬取所有頁面,可以根據網頁的下一頁源碼,進行提取,這裡以美食傑為例,簡單介紹一下
在剛才美食傑的mei.py檔案裡,加入如下代碼:
以上就是簡單的使用scrapy 爬取圖檔的方式,當然scrapy還可爬取其他東西,儲存成json,csv等,我将在下一篇中介紹