PythonでWebページをスクレイピングしてみた
こんにちは、技術部のKです。
さて、前回のPythonを用いた「Streamlitの導入からデプロイまで」に引き続き、今回もPythonに関連した「Webページのスクレイピング」について紹介させていただきます。
1. スクレイピングとは
スクレイピングとは、WebサイトからWebページのHTMLを取得し、見出しや特定データの抽出を可能にするソフトウェア技術のことを指します。
スクレイピングは各サイトの情報を取得できる便利な技術ですが、サイトによってはスクレイピング行為の禁止、違法行為に該当する可能性もあるため注意が必要です。
そのため、事前にWebサイトの利用規約や著作権に違反していないかなど、ご自身の責任の下ご確認をお願いします。
2. スクレイピングで利用できるライブラリ
ライブラリ | Webページ取得 | データ抽出 |
---|---|---|
Requests | ○ | × |
BeautifulSoup | × | ○ |
Selenium | ○ | ○ |
3. スクレイピングの手順
①事前準備
今回はスクレイピングの練習用として公開されているWebサイトhttp://books.toscrape.com/を使用して、赤枠で囲まれた本の価格“£53.74”を取得しましょう。
※jupyter lab(ジュピターラボ)を用いて進めます。
②実行手順
以下、2つのライブラリをインストールします
pip install requests
pip install beautifulsoup4
インストールできたら、下記コマンドを実行します。
from bs4 import BeautifulSoup
import requests
url = “http://books.toscrape.com/”
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
soup
インストールしたライブラリをインポートし、スクレイピングするURLを変数定義します。次にHTMLParserを用いて、HTML文書を読み込ませ、HTMLのタグを抽出し条件に合う属性のテキストを取得します。
実行結果は下記の通りとなります。
ご覧のとおり、WebサイトのHTMLデータの取得ができました。
では、この中から本の価格を取得していきましょう。
そのためには、まず検証ツールを用います。該当サイトでF12を押下して検証ツールを開いてください。
prices_list = soup.html.find_all('p', {'class': 'price_color'})
prices_list
実行結果は下記のとおりです。
この中から、冒頭申し上げた2番目の本の価格を取得すべく下記のコマンドを実行します。
prices_list[1].text.replace('£','£')
配列の2番目についてタグなどを除去した形式で表示するために、“.text”を使用し、文字コードの関係で価格を整形します。そうすることでサイトと同じ形で無事に価格取得ができました。
4. 参考
Webサイトによっては、上記のようにrequestsやBeautifulSoupを用いても文字化けして正しく取得できない場合もあります。これは、「ダウンロードしたHTMLファイル」と「ブラウザに表示されるHTML」が異なることが原因の一つに考えられます。その場合requestsでサーバーから直接ダウンロードしたHTMLファイルをBeautifulSoupで解読してもブラウザで見ている内容と違うのでスクレイピングできません。特にサイトの更新頻度が高いものは、サーバーコストの増加を避けるためによく適用されています。
その場合は、「requests-html」ライブラリを用いて容易にスクレイピングもできますので、気になる方は一度調べてみてください。
最後までお読みいただきありがとうございました。
関連記事
- 2022-11-02
- テクノロジー