scrapy爬蟲筆記(2):提取多頁圖片並下載至本地


上一節使用scrapy成功提取到 https://imgbin.com/free-png/naruto/ 第一頁所有圖片的下載鏈接

本節在之前的基礎上,實現如下2個功能:

1、提取前10頁的圖片下載鏈接

2、下載圖片至本地

一、提取指定頁數圖片

網站向后翻頁,鏈接的后綴會發生如下變化

https://imgbin.com/free-png/naruto/2
https://imgbin.com/free-png/naruto/3

所以只需要構造一下傳入的url即可,例如需要爬取10頁圖片,則 url 后綴需要從1遍歷至10

1、在 settings.py 中,添加一個配置,表示最大爬取頁碼

MAX_PAGE = 3  # 定義爬取頁數

2、編輯 images.py , 修改 start_requests()方法

def start_requests(self):
    base_url = "https://imgbin.com/free-png/naruto/"
    for page in range(1, self.settings.get("MAX_PAGE") + 1):
        url = base_url + str(page)
        yield Request(url=url, callback=self.parse)

使用 for 循環,達到 url后綴 自增的目的;

self.settings.get("MAX_PAGE") 表示讀取settings.py配置文件中定義好的  MAX_PAGE 字段

在終端輸入 scrapy crawl images 運行一下,得到如下結果,說明發起了10次不同的請求

 二、下載圖片至本地

1、在 settings.py 中,添加一個配置,表示圖片存儲路徑

IMAGES_STORE = './images'  # 圖片存儲至當前項目目錄下的images文件夾,如果沒有則會新建一個

2、編輯 pipelines.py 文件 ,定義 Image Pipeline

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter

import scrapy
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
from itemadapter import ItemAdapter


class ImagePipeline(ImagesPipeline):

    def file_path(self, request, response=None, info=None):
        url = request.url
        file_name = url.split('/')[-1]  # 以圖片鏈接最后一段xxx.jpg作為文件名
        return file_name

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem('Item contains no files')
        return item

    def get_media_requests(self, item, info):
        yield scrapy.Request(item['img_src'])

官方文檔中有關於上述3個方法的簡介:https://doc.scrapy.org/en/latest/topics/media-pipeline.html

(1)重寫 file_path()方法,返回文件保存的文件名;
(2)重寫 item_completed()方法,當單個Item完成下載時(下載完成或由於某種原因失敗),調用方法;
參數 results 就是該 Item 對應的下載結果,它是一個列表形式,列表的每一個元素是一個元組,一個元組中包含一個狀態碼和一個字典,形如
[(True,
  {'checksum': '2b00042f7481c7b056c4b410d28f33cf',
   'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
   'url': 'http://www.example.com/files/product1.pdf',
   'status': 'downloaded'}),
 (False,
  Failure(...))]
image_paths = [x['path'] for ok, x in results if ok], 等號右邊是一個列表推導式,等價於
for ok, x in results:
    if ok:
        image_paths = [x['path']]

意思是如果results中某一元組結果的狀態值為True,則取出該元組內字典中的path值

3、修改 settings.py,添加 ITEM_PIPELINES配置

ITEM_PIPELINES = {
    'imgbin.pipelines.ImagePipeline': 300,
}
imgbin是該scrapy項目的名稱

ImagePipeline是 pipelines.py文件中定義的 Image Pipeline類名

最后在終端執行一下,就可以把前10頁的圖片下載至本地了

 


免責聲明!

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



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