ホームページ  >  記事  >  バックエンド開発  >  Scrapy フレームワークを使用して Flickr 画像ライブラリをクロールする

Scrapy フレームワークを使用して Flickr 画像ライブラリをクロールする

WBOY
WBOYオリジナル
2023-06-22 11:02:07701ブラウズ

今日の IT 時代では、大量のデータをクロールすることが重要なスキルになっています。ビッグデータテクノロジーの急速な発展に伴い、データクローリングテクノロジーは常に更新され、改善されています。その中でも、Scrapy フレームワークは間違いなく最も一般的に使用され、人気のあるフレームワークであり、データのクローリングと処理において独自の利点と柔軟性を備えています。

この記事では、Scrapy フレームワークを使用して Flickr 画像ライブラリをクロールする方法を紹介します。 Flickr は、数億枚の写真と非常に大量のデータ リソースを保有する写真共有 Web サイトです。 Scrapy フレームワークを使用すると、これらのデータ リソースを簡単に取得し、調査と分析を実行したり、それらを使用してアプリケーション モデルを構築したりすることができ、ビッグ データの力をより効果的に活用できます。

1. Scrapy フレームワークの概要

Scrapy は、Python 言語に基づいたオープンソースの Web クローラー フレームワークです。 「効率」と「保守性」を設計コンセプトとしており、大規模なデータのクローリングと処理に適した包括的なクローラ フレームワークを実装しています。 Scrapy フレームワークのコア部分には、次の主要な機能モジュールが含まれています。

  • エンジン: システム全体のデータ フローの処理と、さまざまなコンポーネント間の対話とデータ転送の制御を担当します。
  • スケジューラー (Scheduler): エンジンが発行したリクエスト (Request) を分類し、ダウンローダー (Downloader) に渡す役割を担います。
  • ダウンローダー (ダウンローダー): Web ページのコンテンツをダウンロードし、Web ページから返されたコンテンツを処理して、それをエンジンに引き渡します。
  • パーサー (スパイダー): ダウンローダーによってダウンロードされた Web ページを解析し、必要なデータを抽出して構造化データに編成する役割を果たします。
  • パイプライン: データベースやファイルへの保存など、処理されたデータの後続の処理を担当します。

2. Flickr API キーの取得

データをクロールする前に、Flickr API キーを申請して、Flickr データベースへのアクセス許可を取得する必要があります。 Flickr 開発者 Web サイト (https://www.flickr.com/services/api/misc.api_keys.html) に登録することで API KEY を取得できます。具体的な申請手順は次のとおりです。

① まず、https://www.flickr.com/services/apps/create/apply/ URL を入力して API KEY を申請する必要があります。

②この Web サイトに入ったら、ログインする必要があります。アカウントをお持ちでない場合は、自分で登録する必要があります。

③ログイン後、Flickr 申請フォームに記入して送信する必要があります。フォームには、主に次の 2 つの情報を入力する必要があります。

  • 小規模アプリケーションの名前
  • 「非営利」目的の説明

④申請フォームに記入すると、システムは API KEY と SECRET を生成します。これら 2 つの情報を後で使用できるように保存する必要があります。

3. 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)

クローラー ファイルでは、キーワード「cat」と「dog」を設定します。 Flickr 画像ライブラリ 、次にページめくりパラメータを設定し、形式を json に設定します。 parse 関数で各画像の情報を抽出して処理し、yield を使用して返しました。

次に、データの保存場所と形式を定義し、settings.py で設定する必要があります:

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

IMAGES_STORE = 'images'

2. アイテム パイプラインの書き込み

次に、収集した画像データを処理して保存するアイテム パイプラインを作成する必要があります:

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 データベース内の「猫」と「犬」に関する写真をクロールし、指定された場所に写真を保存します。保管場所は真ん中。

4. 概要

この記事の導入部を通じて、Scrapy フレームワークを使用して Flickr 画像ライブラリをクロールする方法を詳しく学びました。実際のアプリケーションでは、必要に応じてキーワード、ページ数、または画像ストレージのパスを変更できます。 Scrapy フレームワークはどの側面から見ても成熟した機能豊富なクローラ フレームワークであり、常に更新される機能と柔軟な拡張性により、データ クローリング作業を強力にサポートします。

以上がScrapy フレームワークを使用して Flickr 画像ライブラリをクロールするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。