scrapyで画像習得

pythonフレームワーク "Scrapy"を利用してWebクローリングとスクレイピングを行い、画像を習得します。


Scrapy公式サイト

環境およびバージョン
・OS: Ubuntu 18.04.2
・Python 3.5.2
・scrapy: 1.6.0


(WEB)クローリングについて
ウェブ上の多種多様なサイトに対して、ルールに基づきサイト内のリンクを周期的に巡回し、該当ページにあるデータを自動で収集すること。


スクレイピングについて
ウェブサイトから情報を取得し、その情報を加工して新たな情報を生成すること。

Scrapyインストール

インストール公式ドキュメント

$ pip install scrapy

Scrapy 利用の流れ

1. startprojectでプロジェクト生成

2. クローリングプログラム(Spider)を作成する

3. 画像を取得するための準備 settings.pyの編集

4. 収集する情報の指定 items.pyの編集

5. Spiderの実行 (画像収集開始!)


1. scrapy startprojectでプロジェクト生成

[project_dir]配下に<project_name>というプロジェクトを生成する。

[project_dir]を省略するとカレントディレクトリにプロジェクトが生成される。

$ scrapy startproject <project_name> [project_dir]
$ scrapy startproject sample_project # for example

プロジェクトを作成するとこのような構造のプログラムが展開される。

sample_project
├── scrapy.cfg
└── sample_project
   ├── __init__.py
   ├── __pycache__
   ├── items.py
   ├── middlewares.py
   ├── pipelines.py
   ├── settings.py
   └── spiders
       ├── __init__.py
       └── __pycache__

2. クローリングプログラム(Spider)を作成する

作成したプロジェクトのプロジェクトフォルダに移動する。

$ cd sample_project

scrapy genspiderコマンドでspiderの雛形を作成する。

# -t オプションでテンプレートを指定することができる。
$ scrapy genspider [-t template] <name> <domain>

yahooのサイトを例に (-tは略)

$ scrapy genspider getyahoo news.yahoo.co.jp

sample_project/sample_project/spiders/getyahoo.pyが生成される。

# -*- coding: utf-8 -*-
import scrapy

class GetyahooSpider(scrapy.Spider):
   name = 'getyahoo'
   allowed_domains = ['news.yahoo.co.jp']
   start_urls = ['https://news.yahoo.co.jp/']
   
   # 以下にメソッドを記述する。
   def parse(self, response):
       pass

複数URLをstart_urlで指定可能。下記は例。

start_urls = ['https://**.co.jp/shop_product_id/{}/'.format(str(i)) for i in range(100, 200)]


3. 画像を取得するための準備 settings.py

sample_project/settings.pyに以下を追記する。

ITEM_PIPELINES = {'scrapy.contrib.pipeline.images.ImagesPipeline':1}
IMAGES_STORE = './images'

4. 収集する情報の指定 items.py

sample_project/items.pyを以下のように記述する。

import scrapy

class SampleProjectItem(scrapy.Item):
    image_urls = scrapy.Field()

​<name> = scrapy.Field()で指定する。

今回は画像なので、image_urls (予約語)で指定している。そのほかには

text, author, tagsなどがある。書き方はimage_urlsと同じ。

5. Spiderの実行

# -*- coding: utf-8 -*-
import scrapy
import numpy as np
from sample_project.items import SampleProjectItem

class GetyahooSpider(scrapy.Spider):
   name = 'getyahoo'
   allowed_domains = ['news.yahoo.co.jp']
   start_urls = ['https://news.yahoo.co.jp/']

   def parse(self, response):        
       item = SampleProjectItem()
       item["image_urls"] = []
       for image_url in response.xpath("//img/@src").extract():
           if "https" not in image_url:
               item["image_urls"].append(response.url.rsplit("/", 1)[0] + "/" + image_url)
           else:
               item["image_urls"].append(image_url)

       return item

以下のコマンドで実行する。

$ scrapy crawl <spider_name>

sample_project/sample_project/images/full/以下に画像が保存されていく。

参考




この記事が気に入ったらサポートをしてみませんか?