【Webスクレイピング】YahooニュースをSeleniumとBeautifulSoupを使用して取得する

Yahooニュースのスクレイピング

今回はYahooニュースの「ニュース」タブの部分の取得、
それぞれのニュースの詳細(記事全文を読む)の部分を
SeleniumとBeautifulSoupを使用して取得してみたいと思います。
今回の記事を作成するにあたり、こちらのサイトをご参考にさせていただきました。

取得する内容

以下の順番でコーディングしたいと思います。
1. Yahooニュースの「ニュース」タブ、タイトルを取得
2. 取得したタイトル1つ1つへアクセスする
3. アクセスした記事内容の「記事全文を読む」をクリックする
4. 表示された本文を取得
5. タイトル、本文、URLをリストへ格納する
6. 格納したリストをCSVへ書き込む


1.Yahooニュースの「ニュース」タブ、タイトルを取得


2,3. アクセスした記事内容の「記事全文を読む」をクリックする


4. 表示された本文を取得


5,6 タイトル、本文、URLをリストへ格納し、CSVへ出力する
  最終的に、このようなCSVファイルを取得します。
  ※書き込み直後は書式設定されていません。


ソースコード

実行するとヘッドレスモード(ブラウザが起動しない)で実行されます。
ブラウザの動きを見ながら実行したい場合は、
24行目の「driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)」
をコメントアウトして、
25行目の「# driver = webdriver.Chrome(ChromeDriverManager().install())」
のコメントアウトを外してください。

ソースコード解説

最初はmainの処理から走り出します。

get_driver()関数を呼び出して
yahooのトップページ表示。
返ってきたdriverを元にBeautifulSoupで解析を行い、
最後にCSVへ書き込み。
となります。


続いてget_driver関数が呼び出されます。
「https://www.yahoo.co.jp/」へWebブラウザでアクセスして
トップページを表示しているだけです。
URLの起動はChromeDriverを使用して、Seleniumを起動させています。


続いてget_data_from_source(driver)が呼び出されます。
ここが処理のメイン部分ですね。

まずWebサイトはYahooのトップページを開いている状態なので
BeautifulSoupで解析を行います。

 # 表示しているWebサイトのHTMLデータをBeautifulSoupで解析する
    soup = BeautifulSoup(driver.page_source,'html.parser')

次にニュースタブのタイトルを取得します。
ニュースタブのタイトルには「news.yahoo.co.jp/pickup」が
含まれている。という法則があります。

以下を行ってnews_list 変数に絞り込んだ結果を格納します。

# URLに news.yahoo.co.jp/pickup が含まれるものを抽出する。
    news_list = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))

この時点でnews_list 変数をデバッグすると
8つ格納されていることが分かります。

これでタイトル部分の要素の取得が完了しました!
現在格納しているnews_list 変数からURL部分を取り出します。
URL部分を取り出したら、詳細ページへ遷移可能になるためです。
以下でURL部分を取り出しています。

# 見出しのURLをリスト形式にして返す
    news_link_lists = [data.attrs["href"] for data in news_list]

ではこの時点でnews_link_lists変数を確認してみましょう!

上手く取得出来ているみたいですね。
試しに黄色の線を引いたURLへアクセスしてみます。

リンク先も問題ないようです。
では「記事全文を読む」をクリックして、詳細ページへと移動しましょう。


ここでSeleniumの出番ですね。

        # 記事全文を読むボタンの要素
        search_btn = driver.find_element_by_xpath('//*[@id="uamods-pickup"]/div[2]/div/p/a')

        # 記事全文を読むボタンをクリック
        search_btn.click()
        time.sleep(2)

driver.find_element_by_xpath(‘//*[@id=”uamods-pickup”]/div[2]/div/p/a’)
でxpathで探し出した「記事全文を読む」の要素を格納し、
クリック処理を行っています。
xpathの探し方は↓になります。
・記事全文を読むにカーソルを当てる
・右クリック > 検証
・検証ツールからcopy > xpathをコピー

後の処理は先ほどと同じ要領で
・画面に表示されている内容をBeautifulSoupで解析
・欲しい情報を取得
するだけです。

情報を取得したらリスト関数へ追加していきます。

# 取得した内容をリスト変数へ書き込む
        if detail is not None:
            i = i + 1
            title_detail.append([i,summary_soup.title.text,detail.text,detail_Url[0]["content"]])

ここまできたら、後はCSVへ出力して完成ですね!

今回も最後は駆け足気味となってしまいましたが、
SeleniumとBeautifulSoupを使用してYahooニュースの記事を取得することが出来ました。
BeautifulSoupだけでも出来たかと思いますが!
クリックイベントの処理などはSeleniumの方が分かり易いな。
と感じた内容でした。

以上です。
最後までお読みいただきありがとうございました!