【Pythonでwebスクレイピング】環境構築からスクレイピングまで行う方法

Webスクレイピングの基礎

私が行っているWebクローリング方法について紹介します。
開発言語はPython 3です。

1. 開発環境を整える

言語はPython 3を使用します。外部ライブラリのインストールのためにAnaconda(conda)もしくはpipを使用します。
個人的にはAnacondaをオススメします。Jupyterなどの非常に使いやすい開発ツールや、よく使用するライブラリがデフォルトで入っているため、別途パッケージをインストールする手間が省けます。

なお、外部ライブラリについては以下のものを使用します。

ライブラリ 用途
Beautiful Soup 4 jQueryライクのcssセレクタでHTMLを処理します。
Selene Selenideという実際にWebブラウザを操作しながらスクレイピング処理を行えるライブラリのPythonラッパーです。ログイン処理などを介したクロールについてはこちらのライブラリを使用します。

Beautiful Soup 4とは?

Beautiful Soup 4はログイン処理が不要かつJavascriptが無効の状態でも取得可能なページのクロールの場合に使用します。

Selene とは?

Selenideについてはログイン処理が必要な場合、もしくはJavaScriptを動作させたあとのページの状態でのクロールの場合に使用します。

SeleneSelenideというパッケージのPython用のラッパーです。
さらにこのSelenideSeleniumという非常に有名なツールのラッパーです。

Seleniumは、Webブラウザを自動操作させたUIテストツールを実現するものです。SelenideSeleniumよりも操作を非常に単純化させた仕組みになっています。これからWebクロールを学ぶ際は是非SeleniumよりもSelenideを使用することをオススメします。

Beautiful Soup 4 のインストール

$ conda install -c anaconda beautifulsoup4

もしくは

$ pip install beautifulsoup4

Beautiful Soup 4についてはcondaや`pip等を使用してインストール可能です。

Selene のインストール

$ pip install selene --pre

Seleneについては、マイナーなパッケージのためcondaではまだインストールすることができません。pipを用いてインストールします。

2. 実際にスクレイピングしてみよう

今回は「ヤフーニュースのニュース一覧」をスクレイピングするプログラムを書いてみます。
ヤフートップはログイン処理は不要で JavaScript 的な操作も不要ですのでBeautiful Soup 4を使用してスクレイピングを行います。

早速ですがコードは以下のようになります。

from bs4 import BeautifulSoup import requests # サイトにアクセスしHTMLを取得、news_htmlに格納 url = "https://news.yahoo.co.jp/" response = requests.get(url) response.encoding = response.apparent_encoding news_html = response.text # HTMLをパース soup = BeautifulSoup(news_html, 'html.parser') # スクレイピング soup = BeautifulSoup(news_html, 'html.parser') news_elements_a_tag = soup.select("#tpc_maj > ul > li > a") # type=list(bs4.element.Tag) for a_tag in news_elements_a_tag: news_topic = a_tag.text.replace("NEW", "").replace("動画", "").strip() link_url = a_tag.get("href") print(news_topic + ", " + link_url)

出力結果はこのようになります。

新元号懇 山中教授ら起用検討, https://news.yahoo.co.jp/pickup/6315957 「水の中」の母思い、卒業, https://news.yahoo.co.jp/pickup/6315955 北朝鮮 米国を甘く見ていた?, https://news.yahoo.co.jp/pickup/6315948 不動産 共有名義の放置は危険, https://news.yahoo.co.jp/pickup/6315945 レース機材 トラックごと盗難, https://news.yahoo.co.jp/pickup/6315946 吉野家 28年ぶり牛丼新サイズ, https://news.yahoo.co.jp/pickup/6315924 斎藤洋介 オレオレ詐欺で被害, https://news.yahoo.co.jp/pickup/6315952 キース・フリントさん死去, https://news.yahoo.co.jp/pickup/6315956

このようにニュースのトピックを取得することができます。
それでは内部の操作について説明していきます。

HTMLをパース

soup = BeautifulSoup(news_html, 'html.parser')

bs4.BeautifulSoup()関数を使用することでパース(HTMLをプログラムで処理しやすい形への変換)を行います。
第一引数にhtml文字列を、第二引数には使用するパーサーを指定します。パーサーの詳細はこちらの資料がオススメです。

CSSセレクタを使用して対象の要素を取得

news_list_element = soup.select("#tpc_maj > ul > li > a")

パース済みのsoup変数を用いて、select()関数でCSSセレクタを指定しています。
これが本記事のメインとなる部分です。CSSセレクタを使用して取得対象のデータ(ニューストピック)を指定しています。
CSSセレクタは#tpc_maj > ul > liと指定しています。これは、jQueryを使用している方なら親しみ深い記述だと思います。

jQueryに親しみがない場合、少し難しく感じるかもしれませんが心配はありません。実はGoogle Chrome等のWebブラウザには、自動でCSSセレクタを作成してくれる機能があります。

Chromeを用いた実際のCSSセレクタ取得例を示します。
Chromeの開発ツールでCSSセレクタを取得1
まず、取得したい要素を右クリックし「検証」をクリックします。

Chromeの開発ツールでCSSセレクタを取得2
検証をクリックすると、HTMLのソースから指定した部分にフォーカスをしてくれます。
そのフォーカスされたタグについて、右クリック→Copy→Copy selectorを実行します。

Copy selectorを実行すると、クリップボードにこのようなテキストがコピーされています。

#tpc_maj > ul > li:nth-child(4) > a

これが、そのままプログラム中のCSSセレクタとして使用できる部分です。なお今回はニュースリストの4番目の要素についてCSSセレクタのコピーを実行しました。
そのため、コピーされた内容を見るとli:nth-child(4)との記述がなされています。このままですと、「ニュースリスト」ではなく「ニュースの4番目の要素」しか取得できないCSSセレクタとなっています。
ですので、ここではnth-child(4)を除去して

#tpc_maj > ul > li > a

としてプログラムのselect()関数の引数として貼り付けます。

なお、CSSセレクタの詳しい構文について知りたい方はこちらの資料が参考になるかと思います。
jQueryの基本まとめ – CSSセレクタを使おう – Qiita

CSSセレクタで取得したタグを処理する

for li in news_list_element: news_topic = li.text.replace("NEW", "").replace("動画", "").strip() print(news_topic)

今回は取得したタグの情報を単純にテキストとして出力しています。
CSSセレクタでの取得する際に使用したselect()関数は「タグのリスト」を返します。例えばselect("#tpc_maj > ul > li")というセレクタだった場合は、この条件にマッチするliタグをすべて取得し返します(今回の例ではニュース見だしのリスト)。
ですので、実際にタグを取り出す際はまずリストから要素を取り出す必要があります。ここではfor文で1要素(タグ)ごと取り出して出力しています。

「実際にスクレイピングしてみよう」 まとめ

いかがでしたか。非常に簡単なプログラムとChromeの開発ツールを駆使することで、容易にニュース見だし一覧をスクレイピングできたかと思います。
是非皆さんもスクレイピングで作業の自動化を進めていきましょう!

3. ログイン処理まで行う高度なスクレイピング

次回に続きます。Seleneを使ってスクレイピングをしていきます。乞うご期待。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です