【Python】BeautifulSoup de スクレイピングに挑戦

スポンサーリンク

前回に引き続きスクレイピングしてみたいと思います。
スクレイピングで使われるパッケージとして、【BeautifulSoup】があります。
今回はこのパッケージを使ってスクレイピングで遊びたいと思います。
ちなみに「ビューティフルスープ」と読みますw

BeautifulSoupってどんなパッケージなのか?

HTML や XML から特定のデータを抽出するためのライブラリです。

HTMLやXMLのデータがあれば、そのデータを解析してくれるという優れものです!
ただ逆に言うとデータがなければ何もできません。
データ解析に特化したパッケージですね!

[BeautifulSoup]と[Selenium]どこが違うのか?

HTMLを解析できる点では、同じです。
ただSeleniumはウェブサイトにアクセスができるので、1つのパッケージで完結できます。

その為、[BeautifulSoup]では、[urllib(正確にはurllib内のrequest)]と組み合わせて使うことが多いと思われます。

表にすると上記みたいな感じですね。
その為、[Selenium+BeautifulSoup]や[urllib+BeautifulSoup]の組み合わせで使用は可能です。
今回は[Selenium+BeautifuSoup]の組み合わせで行いたいと思います。

事前準備

BeautifulSoupをインストールする

まずは、[BeautifulSoup]をインストールしていきましょう。
下記コマンドを実行してください。

pip install beautifulsoup4

補足)ビューティフルスープ3もあるらしいですが、サポートが終了しており、4を使いましょう!

Seleniumをインストール

次は、ウェブにアクセスするためのパッケージとして[Selenium]をインストールします。

pip install selenium

実際にコードを書いてみる

やる事(簡易仕様)

前回と同様に、「TSUTAYA 土佐道路店 の在庫確認」をやってみたいと思います。
最近読みたい本があるんです。
それは【HSPサラリーマン 人に疲れやすい僕が、楽しく働けるようになったワケ】という本です。

リンク:HSPサラリーマン 人に疲れやすい僕が、楽しく働けるようになったワケ/春明力 セル本 – TSUTAYA 店舗情報 – レンタル・販売 在庫検索 (tsite.jp)

【在庫結果】をポップアップで表示する仕様にしたい。

URL(ウェブページ)にアクセスする

ここは前回と同様なので画像だけで行います。

これでウェブページにアクセスできました。

現在のHTMLを取得する

現在アクセスしているページのHTMLを取得したいと思います。

driver.page_source

一部ですが、printの結果は下記のようになりました。
データはちゃんと取れていそうです。

BeautifulSoupを使って、データを取得

今回は括りを指定しながら目的のデータへたどり着きたいと思います。
[F12]を押して、開発ツールで確認していきました。

欲しい情報は、在庫情報で、[class=”state”]の中にある[span]のデータにありました。

from bs4 import BeautifulSoup 
soup = BeautifulSoup(htmldata, 'html.parser')
element = soup.find(class_='state').find('span')
print(element.text)

流れとしては、先ほど取得したhtmlデータをBeautifulSoupにいれます。
そして、htmlの構造を指定しながら取得していきます。

エラーになった人へ

beautifulsoupでエレメントが見つからず、エラーになる時があります。
何度確認しても構造の指定もあっているになぜ。。。とはまってしまします。
自分もでました。

これは、beutifulsoupでエレメントの取得の失敗のですが、ウェブサイトによって少し待たないと正確にhtmlが完成していないことがあります。
ウェブサイトの作りでJavaScriptが動いていると発生することがあるそうです。
このようなエラーになった人は、ウェブページをアクセス後、少しウェイトを置いて取得するようにしましょう。

完成したコードはこちら

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--headless')

driver = webdriver.Chrome(options = options)
driver.maximize_window()
url = "https://(アクセスしたいURL)"
driver.get(url);

import time
time.sleep(1)
htmldata = driver.page_source
#print(htmldata)

from bs4 import BeautifulSoup 
soup = BeautifulSoup(htmldata, 'html.parser')
element = soup.find(class_='state').find('span')
print(element.text)

#input()
import tkinter as tk
from tkinter import messagebox as msgbx
root = tk.Tk()
root.withdraw()
msgbx.showinfo('終了','在庫結果:' + element.text)
root.destroy()

driver.quit()

ウィンドウは非表示で実行するようにしています。そっちの方が裏で動いてる感がでるのでw
もし、動いている所が見たい人は、[ options.add_argument(‘–headless’) ]をコメントにしてください。

まとめ

今回は、BeautifulSoupを使って、ウェブサイトの欲しいデータを取得することをしました。
ウェブサイトまでのアクセスは[Selenium]を使いましたが、[urllib]を使っても問題ありません。
[urllib]との組み合わせの方が情報にあふれていますw

自分的にはSelenium使えるなら、BeautifulSoupを使う必要はないかなと考えています。
ただし、今回のサイトのようにウェイトを置かないとデータが取得できない場合は、[urllib]の方が確実に取得できると思っています。※経験上です

使ってみて、メリットとデメリットを体感して、選択できるようになる方がいいと考えているので、ぜひとも[urllib]でもやってみてはいかがでしょうか?

コメント

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