実際のWebページから情報を読み取る!

このエントリーをはてなブックマークに追加
python
Python
ースポンサーリンクー

参考文献

¥2,398 (2024/04/18 21:11時点 | 楽天市場調べ)
\楽天ポイント4倍セール!/
楽天市場

今度はインターネット上のWebページからCSSセレクタを考え、情報を読み取ります
情報が日付ごとに並んでいるものを参照し、最新の日付の新着情報だけを検索します

CSSセレクタを考える(最新日付の要素を取り出す)

まずこれらの要素を検索するためのCSSセレクタを考える
ここでは、最新の日付の箇所を右クリックして、「検証」を選択し、Chromeでデベロッパーツールを画面表示させる
すると、Elementsタブの画面の要素から、id属性がnewsのdiv要素のなかにdt要素が並んでいて、その中の1番目が最新日付に該当することがわかる
このようにおねじ種類の要素が複数並んでいて、そこから「n番目」の要素を取得するには、CSSセレクタは「要素名:nth-of-type(n)」と指定する。
今回は1番目のdt要素なので、dt:nth-of-type(1)で取得できる
したがって、Ctrl+Fキーで表示される検索BOXにCSSセレクタを入力すれば、この要素が1つだけ検索されるのを確認できる

次に新着情報のリンクの部分のCSSセレクタを調べる
同じくデベロッパーツールを使って、要素を見ると、id属性が”news”のdiv要素のなかにdd要素が並んでいて、最新情報はその1番目の中にあるのがわかる。
その1番目のdd要素は日付の要素と同様でCtrl+Fで表示される表示される検索BOXに#news dd:nth-of-type(1) li a を指定するば最新の新着情報のa要素を特定できる

要素から情報を読み取る

取得したCSSセレクタを使って、要素を取得して情報を読み取る!
(web_gaimu_news.py コード前半)※Mac使用

from selenium import webdriver
from selenium.webdriver.common.by import By
import openpyxl

# chromedriverがある場所
driver_path = "driver/chromedriver"

# webdriverの作成
driver = webdriver.Chrome(executable_path=driver_path)

# 要素が見つからない場合は10秒待つように設定
driver.implicitly_wait(10)

# 総務省の新着情報を開く
driver.get("https://www.mofa.go.jp/mofaj/shin/index.html")

# 最新の日付
date_elem = driver.find_element(By.CSS_SELECTOR, "#news dt:nth-of-type(1)")
date_text = date_elem.text

# 最新の新着情報のa要素
links = driver.find_elements(By.CSS_SELECTOR, "#news dd:nth-of-type(1) li a")

# 読み取り結果のリスト(ここに読み取り結果を入れる)
data_list = []

for link in links:
    # テキスト
    link_text = link.text
    # リンク先
    link_url = link.get_attribute("href")
    
    # リストに登録
    data_list.append([date_text, link_text, link_url])
    # 確認表示
    print(date_text, link_text, link_url)

# ブラウザを閉じる
driver.quit()

▼結果
すごい!ちゃんと、Chrome表示され、データの読み取りもできた!

(ポイント)

  1. 最初に外務省の新着情報のページを開く
  2. 1から、find_elements()でCSSセレクタを用いて、最新の日付の要素を取得して、日付のテキストを.textで読み取る
  3. 次に、最新の新着情報のa要素は複数の場合があるので、find_elements()で取得し、その結果をfor文で繰り返し処理し、a要素からテキスト(内容)とリンク先(href属性の値)を読み取り、日付と一緒にdata_listに追加する。同時に確認のために、追加した内容をprint()で出力
    ※今回はインターネット上のWebページを読み取るため、読み込み2時間がかかる場合を考慮して、driver.implicitlly_wait(10)により、要素が見つかるまでの待機時間を10秒に設定しておく

読み取った情報をExcelに保存する

(ポイント)

  1. openpyxl.Workbook()で新規に作成したブックに保存
  2. Excelファイルに1行ずつ書き込めるよう、行番号のrow_numをループ毎に1つづつ増やすことで、1行ずつ「日付、テキスト、リンク先」を書き込む
  3. 全てのデータを書き込んだらファイル名をつけて保存(web_gaimu_news.py コード全体)※Mac使用
from selenium import webdriver
from selenium.webdriver.common.by import By
import openpyxl

# chromedriverがある場所
driver_path = "driver/chromedriver"

# webdriverの作成
driver = webdriver.Chrome(executable_path=driver_path)

# 要素が見つからない場合は10秒待つように設定
driver.implicitly_wait(10)

# 総務省の新着情報を開く
driver.get("https://www.mofa.go.jp/mofaj/shin/index.html")

# 最新の日付
date_elem = driver.find_element(By.CSS_SELECTOR, "#news dt:nth-of-type(1)")
date_text = date_elem.text

# 最新の新着情報のa要素
links = driver.find_elements(By.CSS_SELECTOR, "#news dd:nth-of-type(1) li a")

# 読み取り結果のリスト(ここに読み取り結果を入れる)
data_list = []

for link in links:
    # テキスト
    link_text = link.text
    # リンク先
    link_url = link.get_attribute("href")
    
    # リストに登録
    data_list.append([date_text, link_text, link_url])
    # 確認表示
    print(date_text, link_text, link_url)

# ブラウザを閉じる
driver.quit()

# 新しいブックに保存
wb_new = openpyxl.Workbook()
ws_new = wb_new.worksheets[0]

row_num = 1

for data in data_list:
    # 日付
    ws_new.cell(row_num, 1).value = data[0]
    # テキスト
    ws_new.cell(row_num, 2).value = data[1]
    # リンク先
    ws_new.cell(row_num, 3).value = data[2]

    row_num = row_num + 1

wb_new.save("外務省新着情報.xlsx")

▼結果

ちゃんと出力され、Excelにも書き込みと保存がされてた🎶😄
珍しくスムーズに行って怖いくらいww

requestsとBeautifulSoupによる方法

今回はSeleniumを使っているが、Webから情報を収集するには、requestsとBeautifulSoupという2つのモジュールを使う方法の方が一般によく使われる
これらの方法は、Webブラウザを使わないで、直接WebサーバーからWebページのHTMLをrequestsを用いて受信する。その内容を
BeautifulSoupで解析して情報を収集する。
しかし、Webページにはコンテンツを部分的に読み込みながら表示するものもあるため、Webブラウザを使うのがいちばん確実。
ただし、SeleniumのWebブラウザを操作すれば、表示できるWebページなら基本的にページ内のどこからでも情報を読み取れるが、Webページを毎回表示するため、requestsに比べて処理が遅くなる。それを解消するために、画面なしで動作ヘッドレスブラウザをSeleniumで操作する方法もあるとのこと

次は・・・

次はWebからの情報収集を自動化するを学びます!

今回はここまで🌸

suno
suno

それではまた!

sunoでした

コメント

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