01

May

PythonでWebから自動でデータ抜き出すスゴワザの神髄、URLの一覧を渡されたら一体どうしたらいいか

無茶ぶりにもスマートに対応できます(写真:Funtap/PIXTA)

全3回に渡ってPythonを使った業務効率化の方法をご紹介する連載第2回。伊沢剛著『超速Python仕事術大全』 より、自動でWeb ページから情報を抜き出してExcel に書き出すプログラムを紹介します。前回:Pythonで不統一なExcelファイル繋ぐワザの神髄(1月18日配信)■Webページから自動で情報を抜き出す集めたい情報がいくつかある場合、Webブラウザから該当するWebページを検索し、Webページが開いたらそこから欲しい情報を探してコピーし別の資料にペーストして・・・を繰り返すのは面倒です。そんな時Pythonを使えば、ExcelファイルにURLをまとめておくだけで、以下のように抜き出したい項目を一気に収集できます。

例えば、複数の書籍の「タイトル」「著者」「価格」「ページ数」の情報を集めたいとします。①まずは以下のように、「書籍リスト.xlsx」というExcelファイルを用意します。Excelファイルの内容は、1行目がヘッダ行で「URL」「タイトル」「著者」「価格」「ページ数」をA列から順に記入しておきます。A列の2行目以降には収集したいWeb ページのURL を記入します。②その後、Pythonプログラムを実行します。

③プログラム実行して再び「書籍リスト.xlsx」を開いてみると、必要なデータが入力されています。ただし、プログラム実行中に「書籍リスト.xlsx」を開いているとエラーになるので注意が必要です。このようにWebからデータを自動的に収集することをスクレイピングといいます。それではプログラムを見てみましょう。なお、本プログラムはPython実行環境としてAnaconda(アナコンダ)の使用を前提としています。Anacondaは https://www.anaconda.com/products/individual からインストール可能です。

プログラムの内容は、pandas(Pythonのライブラリのひとつ)によるExcel ファイルの操作と、requests+ BeautifulSoupという機能を使ったスクレイピングの合わせ技です。07行目のread_excel関数で「書籍リスト.xlsx」を読み込み、for 文とiterrows メソッドで1行ずつの繰り返し処理を行います。繰り返し処理内の10~20行目では、Excelファイルから取得したURLをもとにrequests.get().textでHTMLを取得し、BeautifulSoupに渡します。あとはfindメソッドで「書名」「著者」「価格」「ページ数」を探します。

PythonでWebから自動でデータ抜き出すスゴワザの神髄、URLの一覧を渡されたら一体どうしたらいいか

■取得したテキストから数値だけを取り出す22~26行目は取得したデータをDataFrameオブジェクト(表形式のデータ)に差し込んでいく処理です。ただし、取り出されるテキストは「価格:2,178円(税込)」のような形になっています。必要なのは数値だけなので、re.sub関数を使って数字以外を消し、「2178」だけを残します。re.subは正規表現(さまざまな文字列を1つの文字列で表現すること)で置換する関数です。第1引数の「r“\D”」は数字以外の文字を表し、第2引数の「“”」は空文字を表します。数字以外を空文字に置き換えるので、数字だけが残るというわけです。

■行と列を指定してデータを入れる22行目から26行目では、findメソッドで取得したデータを、DataFrameオブジェクトに入れるためにiloc属性を使っています。iloc属性は行と列のインデックス番号を指定して、特定のセルを取得/設定します。今回の場合、行のインデックス番号は変数indexに入っているものを使い、columns.get_locメソッドで列名から列のインデックス番号を調べています。

最後にto_excelメソッドでExcel ファイルに上書き保存して完了です。■連続取得時は1秒空ける27行目、forループの最後に書いてある「time.sleep(1)」という記述が気になった方もいるかもしれません。これは、プログラムの処理を1秒間止めるための関数です。もともとWeb サーバー(Web ページを公開しているコンピューター)は、人間がWebページを見る速さを想定しています。そのため、スクレイピングで大量のデータを連続して取得すると、Webサーバーの負荷が高まって、最悪の場合、停止してしまうこともあるのです。そのため、繰り返し処理で取得するときは、1秒間程度空けたほうがいいとされています。

スクレイピングのやりすぎでWebサーバーに負荷を掛け過ぎると、アクセス禁止になることもあるので注意してください。今回は書籍データである「書名」「著者」「価格」「ページ数」を探しましたが、実際に使用する際は、目的に応じて「書籍リスト.xlsx」やサンプルプログラムの該当する箇所を変更して使うといいでしょうただし、このようにスクレイピングをするにはHTML(HyperText Markup Language)の知識が必要となります。HTMLとはWebページを記述するための言語で、テキストの所々にタグという記号を埋め込んで、表やリストを記述したり、画像や動画、音声などをページに埋め込んだりします。

例えば サンプルプログラムの14行目には「“h1”, {“class”: “book-title”}」という記述がありますが、これは今回使用したWebサイトで、書籍名を示すh1タグ内のclass属性(クラス名を指定するもの)が「class=“book-title”」となっているためです。さて、最終回である次回は、問い合わせフォームなどから送られたデータの集計を支援するプログラムを紹介します。前回:「Python」不統一なExcelファイル繋ぐワザの神髄(1月18日配信)

東洋経済オンライン

最終更新:1/25(火) 15:01

東洋経済オンライン