【コピペで使える】Python で webスクレイピング便利クラスを作ってみました。

Python入門
この記事は約6分で読めます。

前回の記事では、Pythonを使ったスクレイピング(Scraping)の方法について、価格COMのスペック情報を抜き出すというテーマで解説しました。

今回は、前回のソースコードの中から汎用的に使える部分をクラス化したので紹介したいと思います。

ついでに、前回のサンプルコードを今回のクラスで置き換えてスッキリさせましたので、併せてご紹介したいと思います。

クラスはコピペで使えますので、是非ご活用下さい。

スクレイピング便利クラスの概要

今回はScrape というクラス名にしました。

クラスの構成は次の様になっています。

下記は指定したURLのページを読み込み、title タグの text を読み出すサンプルになります。

コンストラクタで2と5を指定していますので、URLを1ページ読み込むごとに最低2秒、最大5秒の間でランダムなウェイトが発生します。

リファレンス

詳細はソースコードのコメントに記載していますので、ここでは各メソッドについて簡単に解説しておきます。

内容メソッド名と引数補足
コンストラクタ Scrape(wait=1,max=None)リクエストごとに、wait~max の間で
ランダムな待ち時間が入る。
サイトにリクエストを発行し、取得したHTMLを保持したBeautifulSoupのインスタンスを返すrequest(url,
wait=None,
    max=None,
    console=True)
wait,maxが指定されると、コンストラクタよりこちらの値が優先される。
console=Trueの場合、URLと処理時間
がコンソールに出力される。
戻り値として、BeautifulSoupのインスタンスが返される。
アンカータグからURLを取得し
リストで返す 。
get_href(soup,contains = None)contains を指定すると、その文字列が含まれるURLだけが返される。
Imgタグから画像のURLを取得し
リストで返す 。
get_src(soup,contains = None) contains を指定すると、その文字列が含まれるURLだけが返される。
文字列にキーワードが
含まれているかチェックする 。
contains(line,kwd)line もしくは kwd が None
又は ” の場合は Trueを返す。
指定した文字を削除する 。 omit_char(values,omits)omits はリスト形式で指定する。
例:[’\u3000’,’\n’]
DataFrameに1行追加する 。 add_df(values,columns,
omits = None)
クラス内部に保持しているDataFrameに1行追加する。
DataFrameの内容を
CSVとしてファイルに書き込む 。
to_csv(filename,dropcolumns=None)クラス内部に保持しているDataFramをCSV出力する。
テキストプロパティの値を取得する。 get_text(soup)findの結果が bs4.element.Tag で返されるので、これを引数として渡す。そfindの結果がNoneの場合は半角スペース(’ ‘)を、Noneでなければ text の値を返す。
重複する列名の末尾に連番を
付けてユニークにする 。
rename_column(columns)リストで指定したカラム名において、重複しているカラム名には末尾に連番を付けて返す。
指定したファイルに任意の文字
列を追記する 。
write_log(filename,message)スクレイプした結果、エラーになったURLなどをファイルに記録しておくためのもの。
指定したファイルを読み込んで
リストで返す 。
read_log(filename)エラーになったURLリストを読み込んで、再読み込み等何らかの処理を行いたい場合に使う。

Scrapeクラスのソースコード

以下はScrapeクラスのソースコードになります。

そのままコピペしてお使いいただけますが、必要に応じて適宜修正してお使い下さい。

価格COMのデジカメ情報を取得する

では、次に今回のクラスを使って、前回記事で掲載したプログラムを書き直した結果をご紹介しましょう。

全体の構造

今回は Scrape クラスを使うので、その分ソースコードが簡略化できます。

とは言うものの、詳細ページからスペック情報を取得する部分が少々煩雑なので、これをget_detailという名前で関数化することにしました。

get_detail関数は価格COMの詳細情報からスペック情報を抜き出すための専用関数であるため、Scrape クラスにメソッドは実装せず、今回専用の関数として用意しました。

以下がそのソースコードになります。

メインのスクレイピング処理

メインのスクレイピング処理は、次の様なフローになります。

実際にスクレイピングをして分かったことですが、一覧ページの中には中古デジカメのURLも含まれていました。

これを処理しないようにするため、URLに ‘used’ の文字が含まれていた場合、処理を飛ばすようにしています。

また、何らかの理由でページ読み込みに失敗することがあったので、それが分かるようにログファイルにURLを出力するようにしています。

正しくスペック情報が取得できた場合、ScrapeのインスタンスにあるDataFrameに結果を格納していき、最後にCSV出力するという方法を取っています。

以上のことを念頭に、もう少しフローを細かく記載したのが下記の図です。

そして、最終的なスクレイピングのソースコードは次の様になりました。

デジカメの商品一覧ページは全部で6ページありますので、for ループで1~7でカウントをしています。

出力されたCSVは次の様になりました。

まとめ

今回はPythonを使ったスクレイピングで便利に使えるScrapeクラスを作ってみたので、それについて解説致しました。

また、前回記事で掲載したソースコードをScrapeクラスを使うように書き換えたサンプルも紹介致しました。

クラスにどのような機能を持たせるかについては、個人の考え方がありますので、あくまでも1つの例として参考にして頂ければと思います。

ちなみに、商品一覧のURL部分を書き換えるだけで、価格.COM に掲載されている他の商品にも対応できそうです。

全て試したわけではありませんが、ノートPCとかデジタル一眼は、この方法でうまくいきました。

今回の記事が皆様のお役に立てば幸いです。

タイトルとURLをコピーしました