APIとスクレイピングの違い
スクレイピングとは、ウェブサイトにアクセスしてその情報を抽出・取得することです。特にHTMLコードを取得し、その中の情報を抽出・解析することを言います。
ウェブサイトからの情報の取得には、サイト運営者側から提供されているAPIという方法もあります。 スクレイピングはAPIとは異なり、サイト運営者が想定していない方法なので、以下のようなデメリットがあります。
- HTMLやURL構造が突然変わることがある→プログラムは一から作成し直し
- アクセス拒否される場合がある
そのため、APIが使えるようなサイトの場合はできるだけAPIを使うようにし、どうしても取得できない情報がある場合のみスクレイピングを行うようにしましょう。また、スクレイピングを行う際には、取得先のサイトに負荷をかけないように十分注意して、取得先のサイトの規約をよく読み以下のようなマナーを守りましょう。
Python以外に必要な知識
スクレイピングはウェブサイトのソースコードを解析するものなので、ウェブサイトに使われているHTML等に関する最低限の知識を持っている必要があります。
自分で一からサイトを作れるほどの知識は必要としませんが、「このHTMLタグはこの部分に対応している」、「こう書くとここのCSSが指定できる」程度は理解できる必要があります。
また、HTMLやCSS以外にも、JavaScriptに関する知識があるとさらにスクレイピングできる範囲が広がります。JavaScriptを利用してページ遷移が行われるウェブサイトのスクレイピングなど、HTMLとCSSだけではどうにもならなさそうな場合は、簡単な入門ぐらいは学んでみるといいかもしれません。
Chrome・Firefox・Edgeなどご利用のブラウザに合わせて、閲覧中のウェブサイトのHTMLのソースコードの確認方法も調べておくようにしましょう。
ほとんどのブラウザでF12で開く開発者ツールからソースコードを確認することができます。この開発者ツールで、どの部分がどのHTMLタグに対応しているかを確認しながら、スクレイピングのコードをPythonで書いていくことになります。
スクレイピングに利用される外部ライブラリ
Pythonでスクレイピングを行う際には、RequestsとBeautiful Soupの組み合わせかSeleniumかのどちらかの外部ライブラリが主に使用されます。
Requests / Beautiful Soup
import requests #pip install requests
from bs4 import BeautifulSoup #pip install beautifulsoup4
RequestsはAPIとの通信にも利用されるHTTP通信関連のライブラリです。スクレイピングでは、取得先のウェブサイトにアクセスしページ内容(=HTMLコード全体)を取得するのに利用されます。
Beautiful Soup(beautifulsoup4)はHTMLやXMLからデータ・要素を抽出するためのライブラリです。
この二つのライブラリの組み合わせで、ほとんどのサイトのスクレイピングは済ませることが可能で、今回もこのRequestsとBeautiful Soupの組み合わせによるスクレイピングを解説します。
Selenium
from selenium import webdriver #pip install selenium
Seleniumはブラウザを自動操作するためのライブラリです。ブラウザの自動操作なので、基本的にはrequestsのような通信用のライブラリを別途importする必要はありません。また、Beautiful SoupのようなHTMLからのデータ抽出機能も内蔵されています。
Seleniumを利用する際には、Pythonのライブラリのインストールの他にも、 WebDriver(自動操作用のツール)をダウンロード・インストールする必要があります。
ログイン等の認証操作、JavaScriptによるページ遷移(「さらに表示ボタン」を押すとURLが変化せず検索結果の表示が増えるようなサイトなど)等、RequestsとBeautiful Soupの組み合わせだと難しかったり、複雑なコードを書く必要がある場合にはSeleniumが利用されます。
(任意)Pandas
import pandas #pip install pandas
スクレイピングとは直接関係ありませんが、取得・抽出したデータの加工や保存のために、データ解析用のライブラリであるPandasという外部ライブラリもよく使われます。
Pandasが真価を発揮するのは取得した保存済みのデータを解析するときですが、スクレイピング時のデータをCSVやデータベースに出力するときにも、非常に便利です。
今回解説するコードでもPandasを利用しています。
PandasではDataFrameというデータ構造が利用されます。DataFrameは、表のような構造(二次元配列)となっており、データの加工時に便利です。
import pandas
df = pandas.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
print(df)
num_legs num_wings num_specimen_seen
falcon 2 2 10
dog 4 0 2
spider 8 0 1
fish 0 0 8