PythonのBeautifulSoupでWebスクレイピング!

  • このエントリーをはてなブックマークに追加
Advertisements

PythonでWebにリクエストを送信し情報を取得した後、意味のある解析を行うためには適切にHTMLから情報を削ぎ落さなければなりません。ここではBeautifulSoup4を使った簡単なWebスクレイピング技術を紹介します。

こんにちは。wat(@watlablog)です。
Webスクレイピングを身に付けて情報収集を自動化します!ここではBeautifulSoupというライブラリパッケージを使うとこんなに簡単にスクレイピングできる、ということを示します

ここで紹介している内容はWebスクレイピングの一例に過ぎません。僕はPython特化型学習サービス「PyQ(パイキュー)」で基礎を覚えました。体系的にPythonプログラミングやWebスクレイピングを覚えたい方は是非「PyQでPython学習!実際に登録してみた感想と気になる料金」の記事をご覧下さい。

Webスクレイピングは自力でやると非常に大変

Webから情報を取得する方法のおさらい

当WATLABブログでは、「PythonでWebスクレイピング!Requestsで情報取得!」の記事からWebスクレイピングについて扱ってきました。

日常の情報収集作業を自動化できる画期的な技術であるため、他にもいくつか記事を書き、深堀をしていこうと思っています。

しかしWebからプログラム的に情報を取得する場合は、サーバー負荷や著作権等、法的問題に発展する危険性がありますので、是非先ほどの記事に記載の注意点を先に読んで頂ければと思います。

スクレイピングを自作するとこんなに大変!

スクレイピングとは、「削ぎ落す」という意味がありますが、まさにWebから情報をとってきて意味のある情報にするためには、この削ぎ落し技術を多用しなければいけません。

前回紹介した「Pythonテキスト処理!文章中からHTMLタグを取り除いてみた」の記事では、本記事で紹介するBeautifulSoupを使わないで、自力でHTMLの森から見出しという<h>タグで囲まれた文章を抽出して来ました。

そして「PythonでWebスクレイピング!ブログの見出しを抽出する方法!」ではさらに発展させて、HTMLの大森林から全ての<h>タグを抽出し、タグ部分を排除して文章だけにするコードを紹介しました。

コードを以下に再掲してみます。コメントやファイル保存等も含めていますが、ざっと65行ほどのコードになりました。これは長い

ちなみに、本コードはHTMLとにらめっこしながら2時間ほど考えて作りました…。学習のために「やってみよう!」と思って取り掛かりましたが、正直これは「車輪の再発明」ですよね。

しかし、BeautifulSoupという外部のライブラリパッケージを使えば、もっと簡略化したスマートなコードにすることができます。

BeautifulSoupを使ったスクレイピングコード

Advertisements

BeautifulSoupの概要とパッケージのインストール方法

先ほどから紹介しているBeautifulSoupとは、HTML言語の構文を解析するためのパッケージです。先に紹介した面倒なコードを、HTMLタグ毎に作らなくても良いように作られています。

HTMLの構文を解析することを「パース(parse)」すると言います。そして解析するプログラムの事を「パーサー(parser)」と呼びます。この後コード内でパーサーを使うので、覚えておいて下さい。

BeautifulSoupは2019年8月現在、バージョン4が最も使われています。このパッケージはコマンドプロンプトから、

python -m pip install beautifulsoup4

を打ち込み実行することでインストールできます。

ブログのタイトルをスクレイピングするコード

ではh1タグ、つまりブログのタイトルだけを抽出するプログラムを以下に紹介します。

soupの手前までは過去の記事で紹介した内容とほぼ同じです。BeautifulSoup関数に先ほど説明したパーサーを明示的に指定して実行することで、HTML構文が解析されます。パーサーを指定しなくても動きますが、Webページ毎に異なる挙動をすることがありますので、指定しておくと良いでしょう。

パーサーにはその他にも種類がありますが、当ブログで使う時に再度紹介しますので、ここでは「html.parser」だけを覚えましょう。

実行結果は以下のようになります。

「<>」を指定して検索したり、面倒な関数を作ってタグを排除しなくても綺麗に文章だけが抽出されていますね!

感動!!!

あれ、でも結局h1, h2, …と全て持って来るためにはwhileループは必須かな?

試しにh1の所をh2にしてみると、1つしか検索されません。どうやら複数のリスト形式で抽出するということまではやってくれないようです。となると、判定分やらなんやらは必要ですね。

それでも、BeautifulSoupを使えば、色々な括弧を排除していく作業や、タグの文字数に合わせてスライスする位置を調整したりすることは必要無くなるので、大変便利なパッケージであることには変わりはありませんね。

まとめ

Advertisements

自力で作ったスクレイピングのコードはスライスの位置調整やタグの排除といった細かいテクニックが必要でしたが、BeautifulSoupを使えばあっと言う間にHTML構文を解析し、綺麗に文章を抽出してくれることがわかりました。

これは使える!これを使えば情報収集の鬼になることが出来そうですね(法の範囲内で)!

Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*