Frqux’s AI laboratory

AIの技術が進化する今日

PythonでWebスクレイピングを始めよう!BeautifulSoupの基礎とスクレイピングの注意点を簡単に解説!

 こんにちは。ふらうです。

 今回は、Webスクレイピングについて解説していきます。

 AIを学習する際も、何か情報を解析する際も、多くのデータが必要になります。その際に、自力で収集するのは結構大変だと思います。そこでPythonを使い、データ収集を自動化することで効率的にデータを集めることができるようになります。

 もちろんデータには著作権が存在しますし、頻繁なアクセスはサーバー負荷につながり、最悪サーバーがダウンして業務妨害等に当たる可能性もあるので、ある程度の知識が必要になってきます。

 そのあたりの基本的なことを今回は説明していけたらと考えております。


Webスクレイピングとは

 Webスクレイピングとは、Web上のデータを解析・分析できる状態で収集することです。主にツールを使っての収集が基本です。


Webスクレイピングの注意点

 Webスクレイピングをする際にはいくつか注意点があります。主に以下の5つです。


 これらの注意点を一つずつ説明していきます。

利用規約の確認

 真っ先に確認しましょう。
 とりあえずスクレイピングしたいサイトに入ったら、利用規約のページに行き、"ctrl+F"でweb内検索を起動して「スクレイピング」「スクレイパー」「クローラー」などで検索して記載の有無を確認しましょう。

 ダメと書かれていたらそれに従ってください。また、後述しますが、スクレイピングが禁止な代わりにAPIが提供されている場合がありますので、それも併せて確認してください。


著作権を侵害しない範囲での収集

 どんなデータにも必ず著作者がいるものです。ここで、その著作者がデータの提供を許可しているかの確認はしておかなければ、最悪裁判になる可能性があります。
 日本では、未成年であれば別ですが「知らなかった」では済まされないので一番気を付けることでしょう。

 基本的に、商用利用・研究利用・個人的利用の3つに分かれると思いますが、規約をしっかり確認しそれぞれの使用用途に合った対応をするべきです。


サーバー負荷を極力抑えたスクレイピングを行う

 Webサーバーに、あまりに頻繁な接続を繰り返すとサーバーがダウンしたり、接続困難になったりする可能性があります。そうなれば、ほかの利用者の迷惑になるほか、最悪の場合に訴えられる可能性があります。
 
 では、どの程度サーバーにアクセスすると危険なのでしょうか。結論としては、サーバーや接続方法によって違います。

 サーバーは1つではなく、数多くの企業がサーバー事業を展開しており、大規模なサーバーは大量のアクセスにも耐えられるサーバーを使っており、小規模であればすぐに重くなってしまいます。このようにサーバーによって耐久性が違います。
 また、トップページへのアクセスからその他の接続とでは負荷が違います。こういったことから決められた制限はないです。しかし、一般の共通認識はあるようで、1秒間に1回のアクセスに抑えるべきだという認識が大多数の意見です。


robots.txtの確認および robots metaタグに従ってデータを収集する

 robots.txtは、クローラーでデータを収集されるときにそれを制御するためのものです。クローラーとはWebサイトを巡回してデータを集めてくるbot(ロボット)のことです。Webスクレイピングは、データを収集する技術のことを呼ぶということに対して、クローラーはデータ収集を行うbotのことを呼ぶので注意してください。

 robots.txtは、クローラーに町(Webサイト)の総合案内を行う窓口のようなものです。「あそこのデータは持ってっていいよー!」、「あそこのデータは持っていったら駄目だよー!」などとデータ収集の案内をしてくれるテキストファイル君です。クローラー君が総合案内所に行って案内を受けたうえで町を観光すると思ってもらえればわかりやすいです。
 これの確認方法としてはWebサイトのURLに「/robots.txt」を付け加えると確認できます。例えば、はてなブログであれば、「https://hatenablog.com/robots.txt」とアドレスバーに入力して検索すれば、はてなブログrobots.txtを見ることができます。

 robots.txtの記載内容については以下の表を参考にしてください。

robots.txt内の項目 説明
User-agent
制御するクローラーの種類を制御する項目。
Disallow
クロールを禁止する部分を指定している。
Allow
クロールが可能である部分を指定している。
基本的に、Disallowで指定した以外の部分が自動的にクロール可能となるため記載してないところが多い。
Sitemap
sitemap.xmlの場所を記載している。
これがあるとクローラーがWebサイトを巡回しやすくなる。

 robots metaタグ、クローラーの動作を制御するものになります。これはテキストファイルではなくhtml内等のmetaタグとして記載されてありますので、詳細に制御が可能です。しかし権限はrobots.txtのほうが強いので、robots.txtで制御しているページはmetaタグは無意味になりますので、確認は不要です。


APIの有無の確認

 スクレイピングについて言及されていないサイトでも、APIの有無を確認しましょう。
 もしAPIにてデータの提供を行っているのであれば、そちらを利用するようにしましょう。

 APIを使ったほうが、面倒な処理をしなくてもいいですし、サーバー側の負荷も抑えられます。また、APIでの情報提供のみしていてスクレイピングは不可なサイトがありますので、確認しましょう。



BeautifulSoupとは

 BeautifulSoupはスクレイピングするためのPythonライブラリです。htmlおよびxmlファイルからデータを引き出します。

 今回使用しているバージョンは、執筆当時の最新バージョンの2023年3月20日にリリースされた、4.12.0です。

BeautifulSoupのインストール

 以下のコマンドでインストールできます。

pip install beautifulsoup4

 Beautiful Soupのパーサーは自分で選択することができ、種類が複数あるので紹介します。

パーサー 使用方法 特徴
Python’s html.parser
BeautifulSoup(markup, "html.parser")
Pythonの標準ライブラリとして入っているので追加のインストールが不要
lxml’s HTML parser
BeautifulSoup(markup, "lxml")
・とても速い
・外部C依存
lxml’s XML parser
BeautifulSoup(markup, "lxml-xml")
BeautifulSoup(markup, "xml")
・とても速い
・現在サポートされている唯一のxmlパーサー
html5lib
BeautifulSoup(markup, "html5lib")
webブラウザと同じ方法で解析
・有効なhtml5を作成
・とても遅い

 特徴に記した通り、標準搭載のhtmlパーサー以外は各自インストールが必要です。以下にインストール用のコマンドを記しておきますので必要に応じてインストールしてください。

パーサー インストール方法
lxml’s HTML・XML parser
以下のいずれかのコマンド
・apt-get install python-lxml
・easy_install lxml
・pip install lxml
html5lib
以下のいずれかのコマンド
・apt-get install python-html5lib
・easy_install html5lib
・pip install html5lib


BeautifulSoupでスクレイピングする

 では、実際にスクレイピングを実行していきましょう。

各種ライブラリのインポート

import requests
import re
from bs4 import BeautifulSoup

 各ライブラリの説明を簡単にしておきます。

  • requests ... HTTP向けのPythonライブラリで、webの情報を取得したりできる。
  • re ... 正規表現を扱うライブラリ。


 次にデータを取得しましょう。今回は食べログを使わせていただきます。
 規約には特に何も書かれていなかったので大丈夫でしょう。

URL = "https://tabelog.com/"
doc = requests.get(URL)

 これで、食べログのデータがdoc変数に入りました。これをBeautifukSoupにかけてオブジェクトを得ます。パーサーは標準のhtml.parserを使います。

soup = BeautifulSoup(doc.text, "html.parser")

 ここまでできたのでsoupを見てみましょう。

soup

 なんかめちゃくちゃ出てくると思いますが、これがwebページを構成しているhtmlです。ここから必要な情報を各自抽出していくことになります。

 例えば以下の関数があります。

soup.title

 これはtitleタグで囲まれているwebサイトのタイトルを取得しています。また以下のようにすると、titleタグを外して要素だけ取得できます。

soup.title.string

 まあ正直、タグを外したりするのは別途Pythonプログラムで外せるので覚えなくていいかもしれません。大体でいいので、ランキングの部分を抽出する方法であったり、タイトルを抽出したりする方法が分かれば大丈夫だと思います。

 ほかにもBeautifulSoupにはいろんな機能があるのですが、別のブログ様が紹介してくださっているものが優秀すぎることや、公式が日本語でドキュメントを書いてくれていることもあるので説明しません。

 ブログの一番最後にリンクをまとめて貼っておきますので活用してください。


終わりに

 今回はスクレイピングの注意点や方法について簡単に解説しました。

 私的には、requestsでデータを取得してBeautifulSoupで細かく抽出、その後にPythonのプログラムを自分で書いてタグを外したり文章を正規化していく方法がおすすめです。

 大手のサイトはスクレイピングが禁止されていることが多いので、訴えられないように気を付けましょう。自分は中学生の時に著作権で揉めた経験があるので、これからも注意していきたいですね...。

 では。最後まで閲覧いただきありがとうございました!

以下、おすすめな参考サイト様です。

日本語訳のドキュメント
kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

図解!Python BeautifulSoupの使い方を徹底解説!
図解!Python BeautifulSoupの使い方を徹底解説!(select、find、find_all、インストール、スクレイピングなど) - AI-interのPython3入門