概要
Pythonを用いてNHKオンラインニュースから重要な時事ニュースと科学記事を取得し、タイトルとURLをcsvに保存する。
当初は、requests及びBeautiful Soupを利用してスクレイピングをする予定であったが、対象サイトがjavascriptを使用して動的にデータを表示していたため、seleniumを利用することにした。
全体のコード
scraping.py
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
def fetch_news(url, news_category, css_selector, css_selector_url, count):
# ドライバーの設定
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(url)
# ニュースタイトルを取得
titles = driver.find_elements(By.CSS_SELECTOR, css_selector)
# ニュースのURLを取得
urls = driver.find_elements(By.CSS_SELECTOR, css_selector_url)
# news_dataに必要な情報をリスト形式で保存
news_data = []
for i in range(count):
news_data.append([news_category, i + 1, titles[i].text, urls[i].get_attribute('href')])
# ドライバーを修了し、取得したデータを返す
driver.quit()
return news_data
with open('./scraping.csv', 'w', encoding='utf-8-sig', newline='') as csvfile:
csv_writer = csv.writer(csvfile)
# csvのヘッダー行を追加
csv_writer.writerow(['category', 'No', 'title', 'url'])
# アクセス数の多いニュースのタイトルとurlを10件追加
topic_news = fetch_news('https://www3.nhk.or.jp/news/ranking/access.html', "トピック",
'#main > article > section > section > ol > ul > li > a > dl > dd > em',
'#main > article > section > section > ol > ul > li > a', 10)
# 科学・文化に関するニュースのタイトルとurlを5件追加
science_news = fetch_news('https://www3.nhk.or.jp/news/cat03.html', "科学・文化",
'#main > article.module.module--list-items > section > div > ul > li > dl > dd > a > em',
'#main > article.module.module--list-items > section > div > ul > li > dl > dd > a', 5)
# fetch_news関数で保存したニュースのリストを追加
for news in topic_news + science_news:
csv_writer.writerow(news)
CSS SELECTORの入手方法
1.目的のサイトへ行き、ニュースのタイトル部分を右クリックし、「検証」を選択する。
2.「検証」をクリックすると開発者ツールが表示され、選択箇所のHTMLコードがハイライトされる。
3.ハイライトされたHTMLコードを右クリックし、 Copy > Copy selector の順に選択。
4.コピーされたコードのli部分がli:nth-child(1)となるが、今回はliの要素全体を取得したいため、liに変更する。
# 変更前
'#main > article > section > section > ol > ul > li:nth-child(1) > a > dl > dd > em'
# 変更後
'#main > article > section > section > ol > ul > li > a > dl > dd > em'