Python初心者でもできる!RequestsとBeautiful Soupを使ったWebサイトスクレイピング入門

この記事の要点

  • Pythonがスクレイピングに最適なのはライブラリが豊富だから
  • WebスクレイピングにはPython以外にHTMLとCSSの最低限の知識が必要
  • RequestsとBeautiful Soupを使ったスクレイピングの流れ

今回は、Pythonを使ったWebスクレイピングの具体的な実装方法を紹介します。

公式ドキュメントを読み、プログラムを構成することが望ましいですが、初心者にはハードルがすこし高いかもしれません。

Pythonが最適な理由やスクレイピングに関する注意点などをこの記事で学習し、実際にデータの抽出を行うためのプログラムも見ていきましょう。

Webスクレイピングとは?

スクレイピングは削る・擦るといった意味を持つ英単語の「Scrape」に由来します。特にIT業界では、サイト上の膨大なデータから必要とする値を取り出すという操作をWebスクレイピングと呼びます。

例えば天気予報の情報が必要な時、Pythonでデータを取得して人工知能の学習データとしてスクレイピングを活用できます。

用途に合わせて様々なアルゴリズムを実装できるため、汎用的な技術だと言えます。

WebスクレイピングにPythonが最適な理由

なぜ数あるプログラミング言語の中でもPythonがスクレイピングに最適なのでしょうか?

その理由はライブラリの豊富さにあります。
もちろん、スクレイピングを行うライブラリの存在が主な理由として挙げられますが、実際の開発環境では得られたデータを解析することが必要になります。
多くのアルゴリズムが用意されているため、Pythonが最適だと考えられています。

他のライブラリと共に利用すると、収集したデータを人工知能に活用するといったことが可能になります。グラフ生成のライブラリとも相性が良いです。

Webスクレイピングに必要なPython以外の知識と注意点

サイトから情報を抽出するため、Python以外の言語の知識を兼ね備えなければいけません。
なぜ、そしてどのようにして必要となるのかを理解するためにもスクレイピングの手順を知ることが大切です。

スクレイピングの手順

スクレイピングの手順として、まずはWebページの取得を行います。この時、得られる情報はHTMLやCSSといったサイトを構成するプログラムの文字列です。

例えば次のようなコードです。

<html>
<head>
<title>くだもの</title>
</head>
<body>
<h1>みかん</h1>
<p class=”introduction”>オレンジ色で、美しい。</p>
<h1>りんご</h1>
<p class=”introduction”>赤色で、おいしい。</p>
</body>
</html>

しかし、これでは指定した部分から求める情報を取得できません。

そこでデータ抽出のライブラリを活用します。HTMLの情報の中でどのCSSのクラスを指定すれば情報抽出ができるかを調べる必要があります。文章ではとても難しく感じますが、実際にプログラムを見るととても理解しやすくなります。

多数の言語を知る必要がある?

「Pythonだけでも難しいのに、HTML, CSSといったサイト言語まで理解しないといけないの!?」

言語の数だけで判断すると確かに難しそうに感じますが、Pythonはプログラミング言語であるのに対し、HTML, CSSはマークアップ言語と呼ばれます。
そして学習の難易度はプログラミング言語よりも格段に容易だと考えられます。

さらに、サイトの構造さえ理解すればスクレイピングは実装できるため、あまり気にする必要はないと言えるでしょう。

著作権やルールに注意

著作権法47条の7では情報解析を目的とする複製などを著作権者の同意なく行うことを認めています。ただし、収集した情報を他人に譲渡する行為は違反とされています。

また、サービス(サイト)によってはスクレイピングが禁止されている場合があります。

例えば

  • Amazon
  • Twitter
  • 楽天市場

といったサービスでは禁止されています。

しかしこれはごく一部であり、自分がスクレイピングを行いたいサイトの規約などを確認しないと後から問題になる危険性も理解しておきましょう。

法律事務所のサイトでスクレイピングの著作権について解説されています。
https://it-bengosi.com/blog/scraping/

Webスクレイピングで使用するライブラリ

Pythonにはサイト上から情報を集めることのできるライブラリが用意されています。例えば、天気予報や株価の取得を自動化でき、サービスが幅広いものとなります。

ライブラリとはよく使ったり、記述を簡単にしたりするためのプログラムをまとめたものです。これを利用することでプログラム開発をより効率的に進めることができます。

Webスクレイピングで利用する有名なライブラリとして、

  • Requests
  • Selenium
  • Beautiful Soup

などが挙げられます。

データのダウンロードデータの抽出
Requests
Selenium
Beautiful Soup

表のようにライブラリごとにそれぞれ適した役割があります。

例えば、RequestはHTMLデータのダウンロードを担当し、そのデータをから任意の値を抽出するためにBeautiful Soupを活用するといった手順になります。

Requests
https://requests-docs-ja.readthedocs.io/en/latest/

Beautiful Soup
http://kondou.com/BS4/

Pythonの自動化についてはこちらの記事が参考になります。

Pythonの自動化ツールとは?できることや業務効率化の事例を紹介

RequestsとBeautiful Soupを使ったスクレイピングの流れ

実装を理解するためにまずはシンプルなプログラムを理解し、その後に応用を学習することが効果的です。最初は難しく感じるかもしれませんが、上から順番にゆっくりと理解しましょう。

シンプルなスクレイピングプログラム

サイトのデータを取得して、解析の準備を行う最低限のプログラムは次のようになります。

# 各ライブラリのインポート
import requests
from bs4 import BeautifulSoup

url = 'データを抽出したいサイトのURL'
res = requests.get(url) # htmlデータの取得
soup = BeautifulSoup(res.text, 'html.parser') # データの解析

このsoupという変数からクラスなどを指定して任意の値を取得します。

しかし、それぞれのWebサイトごとに構造は異なり、URLの指定も必要となる場合があります。
サイトをブラウザ上で検証を行い、抽出したい部分に指定されている方法を理解しましょう。

基本的な文法はどのサイトにおいても同様であるため、このプログラムを覚えておくこともオススメです。ただし、このプログラムでは取得のみを行い、データの選択や結果の表示はありません。
変数soupからデータの抽出が可能で、soup.find(“title”)とするとサイトのtitleタグからタイトルを取得できます。

Google検索の結果一覧を取得

実際にgoogle.comで任意の文字を検索した場合に表示されるタイトル一覧を取得してみましょう。
※ 今回はRequestsとBeautiful Soupを利用したサンプルプログラムを記載しています。

# 各ライブラリのインポート
import requests
from bs4 import BeautifulSoup

search_word = 'りんご' # Google検索の文字
url = 'https://www.google.com/search?q=' + search_word
res = requests.get(url) # htmlデータの取得
soup = BeautifulSoup(res.text, 'html.parser') # データの解析
results = soup.find_all("h3") # h3タグを抽出

for res in results:
print(res.text) # 各データの文字列を表示

2022/6/29に実行した場合は次のような出力でした。

リンゴ - Wikipedia
【楽天市場】りんごの通販
リンゴ(林檎)|とれたて大百科|旬をみつける - JAグループ
りんご - Amazon.co.jp
(以下略)

このプログラムはGoogle検索で「りんご」と検索した場合に表示されるh3タグ内の文字を出力しています。

少し解説を加えると、soup.find_all()ではタグ名を指定してデータを抽出しています。ここにクラスの指定など設定するとより細かいデータの選択が可能となります。ちなみにsoup.find()を用いると一つだけを抽出できます。

タグの指定に加え、クラスの指定をするとより細かくデータの選別を行えます。

具体的な解説として、スクレイピングをするサイトのURLを指定しますが、今回の場合は検索ワードによってURLが変わります。
実際にGoogleで検索するとURLに「search?q=」が付き、この後ろに検索ワードが記載されます。この仕組みを理解するとURLは「https://www.google.com/search?q=検索語」だとわかり、変数設定ができます。

このようにURLの推測が少し複雑になりますが、色んなサイトをスクレイピングすることで慣れてみましょう。

そのURLから得られたサイト情報をresとし、soupに変換します。
今回はGoogleの検索一覧を取得するため、サイトを検証してタイトルに何のタグが使われているのかを確認します。
h3という見出しの一つを利用しているため、h3タグの一覧を取得しました。
soup.find_allでの返り値は配列形式になるため、for文で結果を表示できます。

Webスクレイピングを効率よく学ぶには?

プログラミング初心者にとって新たな技術を学習するハードルはとても高く感じてしまいます。
最も効率的に学ぶオススメの方法として実際にプログラムを書き、実行することが挙げられます。その際に発生するエラーなどを修正し、より理解が深まっていきます。

特にスクレイピングなどのライブラリに対する学習ではサンプルコードをよく見ることが大切です。

わからないエラーが出た時はその内容を検索してみると、同じようなことに悩む方が多くいます。質問を参考にして解決しましょう。

言語そのものの勉強も、アウトプットを中心に進めるとより理解が進みます。

Pythonで初心者が作れるもの5つ【効率的な勉強法とは?】

学習を円滑にするため、テキストエディタではVisual Studio Codeというソフトがオススメです。こちらのエディタに拡張機能としてコードやインデントに色をつけることができます。

Visual Studio Code
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

まとめ

Pythonにはスクレイピングに関係する便利なライブラリが豊富にあるので、比較的少ないコードで実装が可能です。
実際にプログラムを作って、様々なサイトでスクレイピングを試すことで、Pythonのライブラリをうまく使うコツ、スクレイピングのコツがつかめると思います。

著作権などの法令を守りながら、トライしてみましょう!

以下の記事では、数多くのプログラミングスクールの中からPythonを学べる安くて質が良いスクールを厳選してご紹介しています。

Pythonを学べるプログラミングスクール5つ【コスパで選ぶ】