こんにちは。阿形です。
前回までで、PythonからWebブラウザを制御することができるようになりました。
今回からは、スクレイピングで最も重要な、HTMLソースを取得して解析するところをやってみようと思います。
前回までのコードを改めて。
本ブログサイトのトップページを開くところまでやっておきます。
ついでで前回までには使用していなかった、HTMLを解析するBeautifulSoup4も先に読み込んでおきます。
ソースだけ提示していますが、Pythonの対話モードで試してもらうといいと思います。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
import bs4
options = Options()
options.binary_location = '/usr/bin/chromium-browser'
driver = webdriver.Chrome(options=options)
driver.get('https://blog.interstellar.co.jp/')
さて、ここまででブラウザでページを開くところまで進みました。
開いたページのソースは以下で取得できます。
html = driver.page_source
簡単ですね。
これでhtmlにテキストデータとして格納されます。
試しにprintで表示してみるとソースがそのまま表示できます。
print(html)
HTMLソースがテキストデータとして手に入ったので、正規表現など駆使すればどうとでもなるところまで来ました。
ただ、HTMLのタグを解析するのにいちいち自分で書くのも面倒なので、便利なツールを使用して解析してみましょう。
ここではBeautifulSoup4というものを使用します。
最初のPythonコードに書いた
import bs4
で読み込んだやつですね。
まず先程取得したhtmlをパーサーに食わせて初期化します。
soup = bs4.BeautifulSoup(html, 'html.parser')
これで初期化は完了です。
いろいろ解析してみましょう。
まずは簡単な例で、ページタイトルを取得してみましょう。
タイトルは<title>〜</title>なので、以下のように取得できます。
title = soup.find('title')
このままprintしてみるとこんな感じで出力されます。
print(title)
<title>INTERSTELLAR BLOG インターステラ株式会社 技術ブログ</title>
そのままだとタグが含まれてしまうので、テキストだけ抜き出したい場合は以下のようにして取得できます。
print(title.text)
INTERSTELLAR BLOG インターステラ株式会社 技術ブログ
タグの内側を取得する方法は他にもcontentsやstringがありますが、ちょっとややこしいのでここでは割愛。
titleタグは1ページに一つしかありませんが、リストされた記事を全部取得したいというような場合は、同一のタグが複数あると思います。
このような場合にはfind_allを使用します。
試しに本ブログサイトトップページから記事リストを取得してみましょう。
HTMLソースを見ると、記事のリストは <article class=”archiveList”> 〜</article>でくくられているので、以下のようにしてリストを取得します。
article_list = soup.find_all('article')
記事のリストを取得できましたが、これだと記事タイトルや日付なども一緒になってしまっているので、それぞれの要素を抜き出してみましょう。
リストなので、forループで処理する事ができます。
記事タイトルだけ抜き出すには以下のコードで取得できますね。
article_list = soup.find_all('article')
for article in article_list:
print(article.find('h2').text)
これまではタグそのもので検索していましたが、classなどの属性でも検索ができます。
例えばクラスがarchiveList__textの要素を取得する場合は以下のようになります。
soup.find(attrs={'class':'archiveList__text'})
今回はBeautifulSoupの使い方について説明しました。
ここまででかなりスクレイピングの基本的な部分はだいたいクリアできたかなと思います。
このシリーズをもう少し続けるかどうかは作業時間次第ですが、まだPythonから直接ソースを取得する方法をやっていないので、時間ができたらそちらの記事を書いてみようかと思います。