一般記事

クローリング・スクレイピングの技術を知る

この記事を読むのに必要な時間:およそ 2 分

データ分析や機械学習で人気を集めるPython。そのPythonでデータ収集を行う「クローリング・スクレイピング」も人気を集めています。クローリング・スクレイピングとはなにか,そしてPythonでどんなことができるのか,注意すべき点などを紹介します。

クローリング・スクレイピングとは

クローリング(Crawling)⁠スクレイピング(Scraping)は,WebサイトやAPIから情報を収集するための技術です。Web上の情報を収集することととらえてください。予約状況をお店のWebサイトから自動取得したり,Twitterで自社情報がどれだけつぶやいているか調べたりといった情報の自動取得がわかりやすい例でしょう。Googleなどの検索エンジンもクローリング・スクレイピングによるデータ収集に支えられています。

Webサイトにアクセスして情報を取得する,あるいはAPIを叩くというとcurlやwgetといったCLIツールが思いつきます。これらのツールは単体でも十分に便利ですが,⁠プログラム的な)処理の柔軟さに欠けます。適切なプログラミング言語を用いることで効率よく行えます。

このクローリング・スクレイピング,Pythonで行うのが人気です。

なぜPythonでクローリング・スクレイピングなのか

データ分析に関連する技術ということもあり,その分野に強いPythonでクローリング・スクレイピングを行うことがトレンドになっています。

データ収集後,収集したデータのmatplotlibによる可視化やPandasによる分析などPythonのエコシステムの中でシームレスに多くのことができます。Pythonで作るWebサービス向け(検索エンジンなど)の情報収集や,機械学習向けのデータ収集にも発展的に利用できます。

Pythonにはクローリング・スクレイピング向けの強力なライブラリが揃っているのもポイントです。特に有名なものをリストアップします。

Scrapyは数多くの機能を備えた強力なフレームワークです。クローリング・スクレイピングのクラウドサービス,Scrapy Cloudなどを提供する企業Scrapinghubが中心になって開発しています。クローリング・スクレイピング関連の機能を網羅的に備えていますが,その分設定項目などが複雑で初めて使うには少し難しいと感じる人もいるでしょう。

Beautiful SoupはHTML/XML向けのスクレイピングライブラリです。古くから人気のあるライブラリで,使いやすいAPIがまとまっています。

PyppeteerはChrome(Chromium)を自動操作するライブラリです。近年増えつつあるJavaScript実行を前提とするSPAなどにも柔軟に対応できます。Node.jsで実装されたPuppeteerのPythonポート版です。

クローリング・スクレイピングがどんなものか,Pyppeteerを試しに使ってみましょう。Python 3.6以上の環境が必要です。

import asyncio
# pip install pyppeteer
from pyppeteer import launch

async def main():
    browser = await launch() # ブラウザー起動
    page = await browser.newPage() # 新規ページ
    await page.goto('https://gihyo.jp')
    # querySelector(jsのそれ)で取得できる
    feature_elm = await page.querySelector('#featureArticle dt:first-child')
    feature_text = await page.evaluate('(feature_elm) => feature_elm.textContent', feature_elm)
    print(feature_text) # おすすめ記事のトップを表示
    await browser.close() # 終了

asyncio.get_event_loop().run_until_complete(main())

実行するとWebサイトの要素がきっちり取得できます。ブラウザーをGUIで実行しない(ヘッドレスモード)なのでわかりづらいですが,ちょっとしたコードで簡単にブラウザーが操作できます。

他にも数多くのライブラリがありますが,その用途やメリット・デメリットについてはここではまとめません。Pythonでクローリング・スクレイピングをしようとおもったとき,強力なライブラリ・フレームワークの存在で手軽に進められることだけ覚えておきましょう。

クローリング・スクレイピングを安心に行うために

Pythonには強力なライブラリがあるのですぐにクローリング・スクレイピングが始められるかというと,必ずしもそうではありません。クローリング・スクレイピングを始めるにあたっては「相手とのかかわり」を意識しなくてはいけないからです。

クローリング・スクレイピングがほかの種々のプログラミングと異なるのは,⁠自分」「相手」が存在する点でしょう。

例えば,Webアプリ開発や機械学習においては自前の,あるいは自分たちが契約したマシンやネットワーク以外には影響がありません。基本的には自分の世界です。対して,相手のサーバーにアクセスする(APIを叩く)というやりとりが生じるクローリング・スクレイピングでは,相手への配慮が必要となります。

クローリング・スクレイピングにおいては,相手のサーバーに負荷を与えるような大量の同時アクセスを避けるのが原則です。そのためにはライブラリの設定を適切にしたり,よりアクセスをしないで情報を取得できるようにプログラムを設計したりと意識すべき点が数多くあります。

また,派生して,著作権法に抵触しない範囲で情報を取り扱う必要がある点にも注意が必要です。

ライブラリがあるからと簡単な気持ちでクローリング・スクレイピングを始めると相手に迷惑をかけたり,相手のサービスの利用禁止(BAN)を招いたりしかねません。慎重に行う必要があります。

Pythonでクローリング・スクレイピングを学ぶなら

クローリング・スクレイピングをより効率的に,相手に迷惑をかけずに行うにはどうすればいいのか。 そこで,Pythonのクローリング・スクレイピングに入門するときにおすすめなのが,「Pythonクローリング&スクレイピング[増補改訂版]⁠です。

本書では,Unixコマンドによる初歩のクローリング・スクレイピングから,便利なサードパーティライブラリによる高効率な開発,相手に迷惑をかけないためのノウハウ,データベース設計,クラウド連携,さらにScrapyの網羅的な解説を行っています。

これ一冊でPythonクローリング・スクレイピングのすべてが学べます。

バックナンバー

2019

  • クローリング・スクレイピングの技術を知る