Pythonの基礎が理解できてくると、Pythonを使用して実用的に役立つ処理を実行してみたくなるのではないでしょうか。
そこで今回は、Pythonの利用用途として人気である「Webスクレイピング」について解説していきます。スクレイピングの概要からサンプルコードの解説までお伝えしますので、この記事を読んだ後すぐにスクレイピングができるようになりますよ。
INDEX
PythonでできるWebスクレイピングとは?
Webスクレイピングとは、WebサイトからWebページのHTMLデータを取得し、見出しや写真といった特定のデータを抽出するコンピューターソフトウェア技術のことです。Webスクレイピングによって得られた情報は、不要な部分の削除といった加工が自動的に行われます。そのため、人の手でデータを収集する際にかかる時間を大幅に削減できます。
このWebスクレイピングを行うプログラムのことを「スクレイパ」と言います。なお、Webスクレイピングの作業を始める前に、対象のサイトを「クローリング」する必要があります。クローリングとは、WebサイトからHTMLなどの情報を取得する技術で、クローリングを行うプログラムのことを「クローラー」といいます。
Webスクレイピングは、「スクレイパ」と「クローラー」のによって構成されています。
スクレイピングの基本的な流れ
Webスクレイピングを行う時の基本的な手順は以下の通りです。
1.クローリングをして対象のWebページの内部情報を取得する
↓
2.取得したWebページを解析し、スクレイピングをして特定のデータを検索・抽出する
↓
3.スクレイピングして抽出したデータを整形し保存(もしくは表示する)
上記の一連の作業を行うために、Webスクレイピングのライブラリやフレームワークを使用することが多いです。
スクレイピングは禁止されているサイトも!注意点はある?
スクレイピングで特定のデータを抽出する際、自分の管理元にないWebサイトの情報を抽出すると、違法行為になる可能性があります。
違法行為をしてしまうことを未然に防ぐために、注意点がいくつかあります。以下の点に留意して、行いましょう。
- スクレイピングを行うWebサイトの利用規約、著作権を事前に確認しましょう。
Webサイトの中にはページ内の情報の抜き出しを禁止しているものもあります。そのため、抽出した情報を使用する時、著作権法に違反していないか確認しましょう。
- robots.txtの指示を守っているのかも、事前に確認してください。
robots.txtは検索エンジンのクローラー(ロボット)からWebページへのアクセスを制限するためのファイルです。robots.txtにはアクセスしても良いページ、してはいけないページなどの記述があるので、該当のページのスクレイピングが許可されているか確認しましょう。
- サーバーアクセスをする時は最低1秒以上間隔をあけて、Webサーバーに負荷をかけないようにしてください。
Webサーバーに負荷がかかると、他の閲覧者がサイトを見られなくなったりサーバーが落ちてしまったりします。トラブルの原因とならないよう、Webサーバーへの負荷は極力避けましょう。
- クローリングをするためのプログラム、クローラーを開発する時は連絡先を明示しておくのがおすすめです。
明示しておくことで、問題が起きた時サーバー管理者とスムーズに連絡を取ることができます。連絡先は、クローラーのUser-agentヘッダーにURLやメールアドレスを書きましょう。
\21万以上のオンラインコースから選べる!/
Udemyで講座を探すPythonでWebスクレイピングする際に利用できるライブラリ
PythonにはWebスクレイピングに適したライブラリが複数用意されています。よく利用されるライブラリ、「Requests」、「Beautiful Soup」、「Selenium」について解説していきます。
3つのライブラリはそれぞれ出来る事と特徴が違います。
ライブラリ | Webページ取得 | データ抽出 | 特徴 |
Requests | 〇 | × | Webページを取得する。 シンプルで人が直感的に分かりやすいプログラムを記述できる。 |
Beautiful Soup | × | 〇 | 取得したWebページの情報(HTML)をパースする。 |
Selenium | 〇 | 〇 | Webページ取得と、データ抽出の両方が利用できる。 JavaScriptが使用されたサイトやログインにも使用できる。 動作が遅いのがデメリット。 |
Pythonでのスクレイピング入門【Requests編】
Pythonでのスクレイピング入門として、JavaScriptが使用されていないサイトから情報を取得するためにRequestsとBeautiful Soupを使用して、ページの情報を表示していきます。
まず、Requestsを利用してHTMLを取得する処理を、ソースコードもまじえて解説していきます。
ライブラリを利用するには、まずインストールが必要です。
Python3系バージョンのRequestsをインストールする時は、以下のコマンドを実行しましょう。
1 |
$pip3 install requests |
Requestsのメソッドを解説
ライブラリの機能を実行するために、メソッドを利用します。
Requestsで主に利用するメソッドについて解説します。
メソッド | 処理内容 |
get() | サーバーから情報を取得する |
post() | サーバーへ情報を登録する |
put() | サーバーの情報を更新する |
delete() | サーバーの情報を削除する |
それぞれのメソッドの使い方を詳しく見ていきましょう。
・get()
記述方法は
1 |
r= requests.get(URL, <オプション>) |
です。
引数のURLは必須で、<オプション>には任意で値を設定します。
引数 | 説明 |
URL | 読み込み対象のURL |
続いて、<オプション>で利用される引数をいくつか紹介します。
引数 | 処理内容 |
headers | 辞書を設定することで、ヘッダーとして送信する内容を書き換える |
timeout | リクエストのタイムアウトを指定する |
files | バイナリータイプのデータを送信する |
・post()
記述方法は
1 |
r= requests.post(URL, <送信データ>) |
です。
URLに対して、送信データを送ることができます。
送信データにはファイルを指定したり、JSONと呼ばれる形式で記述されたデータ列を指定したりすることができます。
・put()
記述方法は
1 |
r= requests.put(URL, <更新データ>) |
です。
postと同様にリクエストできます。
・delete()
記述方法は
1 |
r= requests.post(URL, <送信データ>) |
です。
postと同様にリクエストし、指定のデータを削除できます。
Webページのデータを取得しよう
それでは実際に、Webページのデータを取得してみましょう。
1 2 3 4 5 |
import requests url = "https://example.com" r= requests.get(url) |
上記を実行すると、response変数に、指定したURLのWebページ情報が取得できます。
Webページ情報が取得できたら、print()を利用して特定の情報を見ることができます。例えば、ヘッダー情報を取得したい時は
1 |
print(r.headers) |
を、ボディ内の情報を取得したいなら
1 |
print(r.content) |
を実行することで、情報を見ることができます。
Pythonでのスクレイピング入門【BeautifulSoup編】
BeautifulSoupはサーバーと情報をやり取りする機能がないため、はじめにRequestsでHTMLデータを取得します。取得した情報を解析するのが、BeautifulSoupの役割です。例えば、RequestsでHTMLのデータを取得し、BeautifulSoupでページのタイトルや見出しなどの情報を摘出することができます。
Python3系バージョンのBeufiulSoupをインストールする時は、以下のコマンドを実行しましょう。
1 |
$ pip3 install beautifulsoup4 |
BeautifulSoupのメソッドを解説
BeautifulSoupでHTML要素を取得するには、「find系」(find(), find_all())と「select系」(select_one(), select())のメソッドを使用します。
find系も、select系もHTMLの内容を検索し、条件に合う要素を返すという事は同じですが、条件の指定方法が異なります。
find系は、引数にHTMLの属性と属性値を指定します。一方、select系はCSSセレクタと呼ばれる、「何をどの値にするか」を設定した要素(セレクタ)を指定します。どちらを使うかは好みで良いでしょう。
また、メソッドに_allや_oneが付くことで、全ての要素を返すのか、1つだけの要素を返すのかが異なります。
処理速度を気にする場合は、全ての要素だと遅くなるため、1つだけの要素を返すメソッドを使うのがおすすめです。
これらを表で整理すると下記のようになります。
タイプ | 全ての要素をリストで返す | 1つの要素だけ返す | 検索条件 |
find系 | find_all() | find() | 属性、属性値 |
select系 | select() | select_one | CSSセレクタ |
WebページのタイトルやURLを取得しよう
それでは実際に、RequestsでWebページを取得し、BeautifulSoupでタイトルやURLを取得してみましょう。
先に、ソースコードと実行結果です。
1 2 3 4 5 6 7 8 9 10 11 12 |
import requests from bs4 import BeautifulSoup url = "https://example.com" r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") print(soup.select("h1")) print(soup.select("p")) |
上記コードを実行すると、
1 2 3 |
[<h1>Example Domain</h1>] [<p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>, <p><a href="https://www.iana.org/domains/example">More information...</a></p>] |
のように出力されます。
ソースコードについて解説していきます。
1 2 |
import requests from bs4 import BeautifulSoup |
ここで、BeautifulSoupを使用するためにモジュールを読み込みます。
1 2 3 4 5 |
url = "https://example.com" r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") |
Requestsを使用し、「https://example.com」のWebページの情報を取得します。
その後、BeautifulSoupの関数を呼び出し、Webページのコンテンツの内容を分析しています。
第2引数で設定されている “html.parser” は分析を行う時に使用するパーサー(解析器)を指定しています。html.parserはPythonの標準ライブラリに入っており、ライブラリの追加が不要です。
この時点で、soupには、Webページのコンテンツの全てが入っています。
1 2 3 |
print(soup.select("h1")) print(soup.select("p")) |
で、selectメソッドを使用し、条件に合うデータを出力しています。今回は、Webページの、 「<h1>」と「<p>」 を指定しています。
Chromeブラウザであれば、「F12」を押下することで、下記のようにWebページの情報を参照できますので、取得したいデータ情報を簡単に得ることができます。(左側がWebページで、右側がWebページのHTML構造)
PythonでできるWebスクレイピングを活用し、情報解析に役立てよう
今回の記事では、Pythonを使ってWebスクレイピングする方法を紹介しました。
RequestsとBeautifulSoupのライブラリを使用することで、簡単な記述でWebページから情報を取得し、データを解析・抽出することができます。
Webスクレイピングのやり方を習得することで、自動化したり、面倒な手間を省いたりするツールを作成することも可能ですので、是非使ってみてください。
最新情報・キャンペーン情報発信中