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.再次運行看效果
圖片已經按主題分好了,看着和小電影似的,下次儘可能不作這種類型的了。