こんにちは。
キャスレーコンサルティングLS(リーディング・サービス)部の市村です。
社内でPythonを用いたポートフォリオを作成する機会があり、
その関連で「Pythonを用いて何ができるのか?」と思ったことが、記事執筆のきっかけとなりました。
今回は、Pythonの得意分野であるスクレイピングを行います。
スクレイピングを行う際の注意
情報を集めるにあたって便利な技術である一方で、
気を付けなければいけないこともあります。
詳しくは、下記リンクをご参照ください。
https://qiita.com/nezuq/items/c5e827e1827e7cb29011
環境使用言語等
- macOS 10
- Python 3.7.3
- Beautiful Soup
Pythonのライブラリの一つで、スクレイピングに特化したモジュール
- JupyterNotebook
Notebookと呼ばれる形式でコードを記述することができ、
また作成したプログラムを動かしながら実行結果を残せるツール
環境構築
今回はDockerを用いて環境構築を行います。
Dockerをインストール
Dockerをインストールします。
Dockerの基礎情報やインストール方法については、下記のブログをご覧ください。
Dockerを体感しよう
また、Dockerのメリット・デメリットについての記事もございます。よろしければご覧ください。
Dockerのメリット・デメリット
PythonとAnacondaの環境を整える
Anacondaは、Python本体とPythonでよく利用されるライブラリをセットにしたPythonパッケージです。
今回は、Anacondaの中から最小限のパッケージのみを限定した「miniconda」からDockerイメージをダウンロードします。
$ docker pull continuumio/miniconda3
次にダウンロードしたイメージからコンテナを生成します。
$ docker run -i -t continuumio/miniconda3 /bin/bash
これでPythonが利用できるようになりました。
JupyterNotebookの利用
JupyterNotebookをDockerから導入します。
JupyterNotebookは、ノートブックと呼ばれる形式で作成したプログラムを実行するためのツールです。
ブラウザから起動できるため、Pythonのプログラム実行に便利です。
$ docker run -d --name notebook -p 8888:8888 jupyter/datascience-notebook ※8888番ポートを使ってコンテナを起動
ブラウザ上のNotebookの表示
スクレイピング
スクレイピングとは、webサイトから情報を取得し、条件によって抽出することを言います。
Pythonでスクレイピングをする際には、Beautiful Soupというライブラリを用いることで、
手軽にhtmlから情報を取り出せます。
※「Beautiful Soup」の語源は、不思議の国のアリスの「ウミガメのスープ」という唄から派生しているそうです。
BeautifulSoupのインストール
Dockerで、Beautiful Soupを利用するコンテナのbashに入ります。
以下のpipコマンドを実行し、インストールします。
※先ほどのJupyterNotebookを利用する場合は、そのコンテナに入ってから以下のコマンドを実行します
# pip install beautifulsoup4
これでBeautiful Soupが利用できるようになりました。
Beautiful Soupの利用法
Beautiful Soupの使い方を見てみましょう。
以下は、JupyterNotebookを用いて、HTMLをPythonのコード内に文字列で指定し、解析し、任意の部分を抽出して表示しています。
※枠内の入力フィールドにプログラムコードを記載し、その下に実行結果が表示されます
htmlのタグを用いたり、「class」「id」を用いる事でデータを抽出することができます。
対象を確認
技術ブログの記事タイトル、投稿日付等の情報を取得するためには、ブラウザの開発者モードで取得したい要素を指定するための「タグ」「class」「id」等を調べます。
スクレイピング対象の確認
※記事のタイトルを取得したいなら、「post-title」クラスを指定して取得すれば良いことがわかります。
技術ブログのタイトル、日付を取得
それでは、実際に技術ブログから歴代の「記事タイトル」「投稿日付」を取得したいと思います。
実行ソース
from bs4 import BeautifulSoup import urllib.request as req #技術ブログのタイトル,日付取得 def get_title(url): res = req.urlopen(url) soup = BeautifulSoup(res, "html.parser") title_list = soup.select(".post-title") date_list = soup.select(".post-time") for title in title_list: titleText = title.text if titleText != None: print(titleText) for date in date_list: dateText = date.text if dateText != None: print(dateText) #スクレイピング実行 for i in range(1,20): url = "https://www.casleyconsulting.co.jp/blog/engineer/?page={}".format(i) print(url) get_title(url)
実行結果
技術ブログから、「記事タイトル」の一覧と「投稿日付」が取得できました。
※表示の関係上すべては表示されていませんが、過去の記事全280件が取得できています
おわりに
実際にやってみるにあたってPythonに便利なライブラリ(Beautiful Soup)があり、環境構築もDockerを利用することで、比較的気軽にできるのかなと思いました。
スクレイピングは自分に必要な情報を取得するために有効だと思いますので、ぜひ試してみてください!