pythonでスクレイピングしてみた~Scrapy編~

プログラミング

前回 に続きおもしろそうなスクレイピング方法をまた見つけたので紹介していきたいと思います。

Scrapyというフレームワークを使った方法です。

スポンサーリンク

Scrapyとは

Scrapyとはpythonのフレームワークです。BeautifulSoupと同じようにサイトスクレイピングができます。

しかし、スクレイピングまでのアプローチの仕方がかなり違っていて、やり方次第では高度なスクレイピングができるようです。

今回は前回と同じように自分のサイトを簡単にスクレイピングしていきたいと思います。

準備するもの

  • Powershell

普通にPowershellがつかえればいいと思います。ぼくはAnacondapromptをつかいました。

Scrapyを使ってみる

Scrapyのインストール

では始めて行きましょう。まず、Scrapyをインストールしていきます。(Anaconda promptでもインストールする必要があります。)

 pip install scrapy 

これでScrapyが使えます。

プロジェクトを作る

Scrapyを使うに当たり、以前紹介したDjangoのようにプロジェクトを作っていきます。

まず、自分でProjectフォルダを作り、Powershellで移動します。

 cd Project 

そうしたら、次に種々のファイルを自動生成します。

 scrapy startproject (プロジェクト名) 

(プロジェクト名)には好きな名前を入れてください。

すると、自動でファイルができます。

Project
└── (プロジェクト名)
     ├── scrapy.cfg
     └── (プロジェクト名)
         ├── __init__.py
         ├── __pycache__
         ├── items.py
         ├── middlewares.py
         ├── pipelines.py
         ├── settings.py
         └── spiders
             ├── __init__.py
             └── __pycache__

このようにファイルができていれば成功です。

spiderのテンプレートを作る

つぎにProject/(プロジェクト名)/(プロジェクト名)に移動し、

Project
└── (プロジェクト名)
     ├── scrapy.cfg
     └── (プロジェクト名)←ここ!!!!!!!
         ├── __init__.py
         ├── __pycache__
         ├── items.py
         ├── middlewares.py
         ├── pipelines.py
         ├── settings.py
         └── spiders
             ├── __init__.py
             └── __pycache__

 scrapy genspider (スパイダーの名前)(スクレイピングするサイトのURL) 
とすることでテンプレートのようなものを作ってくれます。

(スパイダーの名前)には好きな名前をいれ、(スクレイピングするサイトのURL)にはhttps://imagisi.comを入れるとこのサイトがスクレイピングできるようになります。

class (スパイダーの名前)(scrapy.Spider):
    name = '(スパイダーの名前)'
    allowed_domains = ['imagisi.com']
    start_urls = ['https://imagisi.com/']

    def parse(self, response):
        pass

spiderの編集

さて、今回はページをまたいでスクレイピングして、ブログ記事のタイトルとそのURLを取得したいので、それができるようにspiderを編集していきましょう。

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


class (スパイダー名)(scrapy.Spider):
    name = '(スパイダー名)'
    allowed_domains = ['imagisi.com']
    start_urls = ['https://imagisi.com/']

    def parse(self, response):
        for href in response.css('.a-wrap'):
            yield {
                'url': href.css('a::attr(href)').extract_first(),
                'title':href.css('h2.entry-card-title::text').extract_first(),
            }
        # ページを移動するための処理
        older_post_link = response.css('div.pagination-next a.pagination-next-link::attr(href)').extract_first()
        if older_post_link is None:
            # リンクが取得できなかった場合は最後のページなので処理を終了
            return

        # URLが相対パスだった場合に絶対パスに変換する
        older_post_link = response.urljoin(older_post_link)
        # 次のページをのリクエストを実行する
        yield scrapy.Request(older_post_link, callback=self.parse)

これで完了です。

補足しておくと、

for href in response.css('.a-wrap'):
            yield {
                'url': href.css('a::attr(href)').extract_first(),
                'title':href.css('h2.entry-card-title::text').extract_first(),
            }
では.css()を利用して目的のタグを取得して処理を回していきます。このブログでは
<a class="a-wrap" href="...">
 <h2 class="entry-card-title">...</h2>
</a>
<a class="a-wrap" href="...">
 <h2 class="entry-card-title">...</h2>
</a>
...
という構造をしていたので上記のようにデータを引き出しました。

設定を行う(重要)

さて、スクレイピングを行っていく前に絶対にやっておきたい設定がいくつかあります。

まず、setting.pyを開きましょう。

開いたら、まずレスポンス間隔を調整しましょう。これをしないとスクレイピングするサーバーに負荷をかけることになり迷惑が掛かります。

 
# Configure a delay for requests for the same website (default: 0) 
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay 
# See also autothrottle settings and docs 
DOWNLOAD_DELAY = 3 

コメントになっているのでコメントを外しておきましょう。

次にキャッシュを有効にしていきましょう。

 
# Enable and configure HTTP caching (disabled by default) 
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
#httpcache-middleware-settings 
HTTPCACHE_ENABLED = True 
HTTPCACHE_EXPIRATION_SECS = 0 
HTTPCACHE_DIR = 'httpcache' 
HTTPCACHE_IGNORE_HTTP_CODES = [] 
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' 

これもコメントを外しておきましょう。

スクレイピング

ではさっそくスクレイピングをしていきましょう。

Powershellで、

 scrapy crawl (スパイダー名) -o (csv名).csv 

としてみましょう。(csv名).csvというファイルができているはずです。(csv名)は何でもいいです。

開いてみてしっかり出力されていたら成功です!!!

しっかりスクレイピングされていました!!!

参考

Scrapy入門(1) - Qiita
Scrapy入門(1) はじめに PythonでWebスクレイピングを行う場合には、様々なアプローチが存在します。この記事ではスクレイピング用のフレームワークであるScrapyを題材に取り上げ実際に簡単なサンプルを作成しなが...
10分で理解する Scrapy - Qiita
Scrapy とは Scrapy とは Python でクローラーを実装するためのフレームワークです Python でクローラーというと BeautifulSoup や lxml などの HTML パーサーがよく使われていますが...

コメント

  1. […] 前回はScrapyによるスクレイピングをやりましたが、今回はseleniumを使ってスクレイピングをしていきます。 […]

タイトルとURLをコピーしました