scrapyで画像習得
pythonフレームワーク "Scrapy"を利用してWebクローリングとスクレイピングを行い、画像を習得します。
環境およびバージョン
・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/以下に画像が保存されていく。