首頁  >  文章  >  後端開發  >  使用Scrapy框架爬取Flickr圖片庫

使用Scrapy框架爬取Flickr圖片庫

WBOY
WBOY原創
2023-06-22 11:02:07768瀏覽

在現今的資訊科技時代,海量資料的爬取成為了一項重要的技能。而隨著大數據技術的快速發展,資料爬取技術也不斷更新與改進。其中,Scrapy框架無疑是最常用和流行的框架,其在資料爬取和處理上有著獨特的優點和靈活性。

本文將介紹如何使用Scrapy框架爬取Flickr圖片庫。 Flickr是一個圖片分享網站,庫存有數億張圖片,具備非常大量的資料資源。透過Scrapy框架的使用,我們可以輕鬆地取得這些資料資源,進行研究分析或利用其搭建應用模型,從而更好的發揮大數據的威力。

一、Scrapy框架介紹

Scrapy是一個基於Python語言的開源網路爬蟲框架。它以「有效率」和「可維護性」作為設計理念,實現了一個全面的爬蟲框架,比較適合大規模資料的爬取和處理。 Scrapy框架的核心部分包含以下主要的功能模組:

  • 引擎(Engine):負責處理整個系統的資料流,控制各個元件之間的互動和資料傳遞。
  • 調度器(Scheduler):負責將引擎發出的請求(Request)排序,並交給下載器(Downloader)。
  • 下載器(Downloader):負責下載網頁內容,將網頁回傳的內容經過處理後再交給引擎。
  • 解析器(Spider):負責解析下載器下載的網頁,將想要的資料從中提取並組織成結構化的資料。
  • 管道(Pipeline):負責將處理完的資料進行後續處理工作,例如儲存到資料庫或檔案中等。

二、取得Flickr API Key

在進行資料爬取之前,我們需要先申請Flickr API Key來取得存取Flickr資料庫的權限。在Flickr開發者網站(https://www.flickr.com/services/api/misc.api_keys.html)中,我們可以透過註冊來取得一個API KEY。具體的申請步驟如下:

①首先,我們需要進入 https://www.flickr.com/services/apps/create/apply/ 網址來申請API KEY。

②在進入該網址後,我們需要進行登陸操作,如果沒有帳號則需要自行註冊一個。

③登陸之後,需要填寫並提交Flickr的申請表格。在表格中,主要需要填寫兩個面向的資訊:

  • 一個小應用程式的名稱
  • 一個「非商業」目的的描述

④申請表填寫完畢之後,系統會產生一個API KEY和一個SECRET。我們需要將這兩個資訊保存,以便於後序的使用。

三、Scrapy框架爬取Flickr圖片庫的實作

#接下來,我們將介紹如何使用Scrapy框架來實作Flickr圖片庫資料爬取的操作。

1.寫Scrapy爬蟲

首先,我們需要新建一個Scrapy項目,並在專案中建立一個爬蟲檔案。在爬蟲檔案中,我們需要設定好Flickr API資料庫的基本信息,以及資料的儲存位置:

import time
import json
import scrapy
from flickr.items import FlickrItem

class FlickrSpider(scrapy.Spider):
    name = 'flickr'
    api_key = 'YOUR_API_KEY'  # 这里填写你自己的API Key
    tags = 'cat,dog'  # 这里将cat和dog作为爬取的关键词,你可以自由定义
    format = 'json'
    nojsoncallback = '1'
    page = '1'
    per_page = '50'

    start_urls = [
        'https://api.flickr.com/services/rest/?method=flickr.photos.search&'
        'api_key={}'
        '&tags={}'
        '&page={}'
        '&per_page={}'
        '&format={}'
        '&nojsoncallback={}'.format(api_key, tags, page, per_page, format, nojsoncallback)
    ]

    def parse(self, response):
        results = json.loads(response.body_as_unicode())
        for photo in results['photos']['photo']:
            item = FlickrItem()
            item['image_title'] = photo['title']
            item['image_url'] = 'https://farm{}.staticflickr.com/{}/{}_{}.jpg'.format(
                photo['farm'], photo['server'], photo['id'], photo['secret'])
            yield item

        if int(self.page) <= results['photos']['pages']:
            self.page = str(int(self.page) + 1)
            next_page_url = 'https://api.flickr.com/services/rest/?method=flickr.photos.search&' 
                            'api_key={}' 
                            '&tags={}' 
                            '&page={}' 
                            '&per_page={}' 
                            '&format={}' 
                            '&nojsoncallback={}'.format(self.api_key, self.tags, self.page, self.per_page, self.format, self.nojsoncallback)
            time.sleep(1)  # 设置延时1秒钟
            yield scrapy.Request(url=next_page_url, callback=self.parse)

在爬蟲檔案中,我們設定了Flickr圖片庫的關鍵字“cat”和“dog” ,然後設定了翻頁的參數,並將格式設為json。我們在parse函數中進行了每個圖片的資訊提取和處理,並使用yield返回。

接下來,我們需要定義資料的儲存位置和格式,在settings.py中進行一下設定:

ITEM_PIPELINES = {
   'flickr.pipelines.FlickrPipeline': 300,
}

IMAGES_STORE = 'images'

2.寫Item Pipeline

接下來,我們需要寫一個Item Pipeline,將收集到的圖片資料處理和儲存:

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

class FlickrPipeline(object):
    def process_item(self, item, spider):
        return item

class FlickrImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_url']:
            try:
                yield scrapy.Request(image_url)
            except Exception as e:
                pass

    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 images")
        item['image_paths'] = image_paths
        return item

3.運行程式

當我們完成以上的程式碼編寫之後,就可以執行Scrapy框架來實現資料爬取的操作了。我們需要在命令列中輸入以下指令:

scrapy crawl flickr

程式開始運作之後,爬蟲將會爬取Flickr資料庫中有關「cat」和「dog」的圖片,並將圖片儲存在指定的儲存位置中。

四、總結

透過本文的介紹,我們詳細了解如何使用Scrapy框架來爬取Flickr圖片庫的操作。在實際的應用中,我們可以根據自己的需求來修改關鍵字、一頁的數量或圖片儲存的路徑等內容。無論從哪方面來講,Scrapy框架作為一個成熟的、功能豐富的爬蟲框架,其不斷更新的功能和靈活的可擴展性,都為我們的數據爬取工作提供了強有力的支持。

以上是使用Scrapy框架爬取Flickr圖片庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn