意識低い系会社員

意識低い系会社員の日常

【スポンサーリンク】

Pythonを使ったWebスクレイピングでRETRIPの新着記事のタイトルを取得する方法

【スポンサーリンク】

事前準備

1. Pythonのインストール

Python公式からインストーラをダウンロードすることができます。

理由がなければPython3系を使うのが推奨されているので、Python3系の最新をインストールします。

www.python.jp

 

2. Seleniumのインストール

Pythonのインストールが終了して、pathの設定などが完了したら以下のコマンドでインストールできます。

 

pip install selenium

Seleniumはpythonからブラウザを操作するために必要です。

 

3. Google Cromeのインストール

今回はGoogle Chromeを使うので、インストールしていない場合はGoogle Chromeをインストールします。

でもブラウザならなんでもいいです。

 

4. Chrome Driverのダウンロード

SeleniumのHPからChromeのドライバをダウンロードします。

ドライバはプログラムからブラウザを操作するために必要です。

ダウンロードしたドライバーは任意のフォルダに入れておいてください。

どこに置けばいいのか悩む方はC:\driverフォルダでも作ってそこに入れてください。

pythonで使用するドライバの置き場所はこちら。

pypi.org

 

5. Beautiful Soupのインストール

以下のコマンドでBeautiful Soupをインストールします。

 

pip install beautifulsoup4

BeautifulSoupはXMLやHTMLからデータを抽出するために使用します。

 

これで事前準備は完了です。

 

プログラム

# Preparation
# pip install beautifulsoup4
# pip install selenium
# get web driver

####################################################################################

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from bs4 import BeautifulSoup

# driver path
driver_path = "C:\\driver\\chromedriver.exe"

# URL of Google top
retrip_url = "https://retrip.jp/"

# Activation headless mode
options = Options()
# options.add_argument('--headless')

# open Retrip top
driver = webdriver.Chrome(chrome_options=options, executable_path=driver_path)
driver.get(retrip_url)

# get HTML
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

# get and show article's titles
latest_3_artcles = soup.find_all("a", class_="contentSlider")
for i in range(len(latest_3_artcles)):
    s = latest_3_artcles[i].div.div.h1.text.replace(" ", "").replace(" ", "").replace("\n", "")
    print(s)

# close google chrome
driver.quit()

 

上記を実行したら以下の動作をします。

1. Google Chromeを立ち上げ、RETRIPのTOPページを表示

2. RETRIPのTOPページのHTMLを取得

3. HTMLからRETRIPの最新記事3つのタイトルがを取得し出力

4. Google Chromeを終了

 

解説

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from bs4 import BeautifulSoup

このプログラムに必要なライブラリをimportしています。

 

# driver path
driver_path = "C:\\driver\\chromedriver.exe"

# URL of Google top
retrip_url = "https://retrip.jp/"

Google Chromeのドライバの場所とRETRIPトップページのURLを定義しています。

 

# Activation headless mode
options = Options()
#options.add_argument('--headless')

ブラウザ操作時のオプションを選択できます。

 

#options.add_argument('--headless')

のコメントアウトを外せばheadlessモードでGoogle Chromeが起動します。

HeadlessモードではGUIのブラウザは起動しません。 

 

# open Retrip top
driver = webdriver.Chrome(chrome_options=options, executable_path=driver_path)
driver.get(retrip_url)

Google Chromeを起動して、get()メソッドで指定されたURLを開きます。

 

# get HTML
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

RETRIPトップページのHTMLを取得し、HTMLパーサー(Beautiful Soup)のインスタンスを作ります。

 

# get and show article's titles
latest_3_artcles = soup.find_all("a", class_="contentSlider")
for i in range(len(latest_3_artcles)):
    s = latest_3_artcles[i].div.div.h1.text.replace(" ", "").replace(" ", "").replace("\n", "")
    print(s)

RETRIPトップページの新着3件の記事タイトルを取得し表示します。

 

latest_3_artcles = soup.find_all("a", class_="contentSlider")

この処理でRETRIPトップページのHTMLから、新着3件のタイトルが含まれている要素のリストが取得できます。

find_allをfindにするとHTMLの頭から探していって合致した最初の要素が取得できます。

 

f:id:amistad06-k:20180927193321p:plain

 

検索に使ったclass名はブラウザで探します。

F12ボタンを押すとそのページのソースが表示されるので、取得したい部分がどういう構成になっているのかを探します。

 

HTML部分を拡大したのがこちら。

f:id:amistad06-k:20180927193956p:plain

 

新着3記事のタイトルが<a>要素で、class="contentSlider"という要素に書かれているのが分かります。

find_all("a", class="contentSlider")

はclass名がcontentSliderの<a>要素をリスト形式で抜き出してくれます。

 

for i in range(len(latest_3_artcles)):
    s = latest_3_artcles[i].div.div.h1.text.replace(" ", "").replace(" ", "").replace("\n", "")
    print(s)

ここは抜き出した<a>要素の中からさらに記事タイトルのみを抜き出します。

ここの記載を変更することでタイトルだけでなく、リンクなども取得することが可能です。

 

f:id:amistad06-k:20180927194702p:plain

 

titleは<a>要素の子要素<div>のさらにまた子要素の<div>の、さらにまた子要素の<h1>に書かれていることが分かります。

ここの文字列を取得しているわけです。

正直、この取得処理はもうちょっと綺麗にできる方法を知りたいところ。

 

文字列の中には改行や空白文字などが含まれているのでreplace関数でそれらを消しています。

また、記事が3つあるのでfor文で取得処理と表示を繰り返しています。

 

# close google chrome
driver.quit()

取得した文字列を表示した後、この処理でブラウザを閉じて終わりです。

 

以上です。

HTMLの要素を探すところはちょっと面倒ですが簡単にスクレイピングをすることができました。

 

自分のための勉強を兼ねて、ブログにまとめておきます。

 

おわり。

【スポンサーリンク】