PythonスクレイピングツールScrapyで定期的に情報取得

Python独学ならTech-Joho TOP > いろいろやってみた >PythonスクレイピングツールScrapyで定期的に情報取得

PythonでWebサイトに書いてある情報を取得する

プログラムを使って、Webサイトに書いてある情報を取得することがスクレイピングです。

いわゆるクローリングにも近い概念です。
Pythonで実施することができ、その方法も色々ありますが、お手軽なのがScrapyというツールを使うことです。

Scrapy公式ページ
https://scrapy.org/

インストールするには、pipで以下のように実行します。

> pip install Scrapy

Scrapyの基本的な使い方

Scrapyのいちばん大事なWebページにアクセスして書いてある内容を読み取る機能は、SpiderというPythonのクラスに集約されています。
これを継承したオリジナルのクラスを作成するのが、Scrapyを使う最初の一歩です。

例えば、Yahoo! Japanのニュースのページにアクセスして、一番上のニュース欄にある見出しを取得・表示してみます。

yahoonews

以下のようなファイル yahoospider.py を作成します。

yahoospider.py

import scrapy


class YahooSpider(scrapy.Spider):
    name = 'yahoospider'
    start_urls = ['https://news.yahoo.co.jp/']

    def parse(self, response):
        print("start")
        for title in response.css(".topics .ttl a::text"):
            print(title.extract())

ポイントは parseメソッドで、response.css()をつかって、CSSセレクターでニュースのタイトルの要素を探しています。
“.topics .ttl a::text”というCSSセレクターは、topicsクラスを持つ要素の下のttlクラスを持つ要素の下のa要素のテキストすべて、という意味です。

これを実行するには、コマンドプロンプトなどで以下のコマンドを実行します。

> scrapy runspider yahoospider.py

たくさん文字が表示されますが、中程にニュースタイトルがでてくるはずです。

略

2017-12-07 09:22:59 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)
start
エルサレム首都 EU深刻な懸念
NHK「お墨付き」重い責任も
強い寒気 北海道で-23.8℃
ガマ荒らし 少年ら遺族に謝罪
官製春闘5年目 息切れ懸念も
本田 欧州リーグ移籍画策か
宇野余裕 寝坊も寝癖もなんの
瀬戸康史 美しい女装男子役

略

Scrapyの機能はたくさんあるのですが、基本的にはこれで十分ではないでしょうか?

繰り返し実行してみた

1分毎や1時間ごとなど、あるサイトに定期的にアクセスして情報の変化を追いたい事があると思います。

これもいろいろな方法がありますが、素朴な方法として、上記のコマンドをタイマーを仕込んだpython経由で実行する方法を書いてみました。

repeat.py

from subprocess import call
import os
import time
dir_path = os.path.dirname(os.path.realpath(__file__))
os.chdir(dir_path)

while True:
    call(["scrapy", "runspider", "yahoospider.py"], cwd=dir_path)
    print('run spider')
    time.sleep(30)

下記のコマンド実行で、30秒に1回、yahooニュースの情報を取得します。

> python repeat.py

上のコードはこちらからダウンロードできます。

https://github.com/tech-joho-info/scrapy-sample-news-site

上のプログラムを改造すれば、いろいろなサイトに応用できます。
是非試してみて下さい。
ただし、あまり頻繁にアクセスするとサイバー攻撃になってしまいますので、気をつけて下さい。

Author: 管理

tech-joho.infoの管理人です。いろいろな技術について勉強しています。