Python

【Python】Yahooニュースをスクレイピングしてトップニュースを取得する

皆さんこんにちは。いし(@ishilog2)です。

今回はPythonを用いて、Yahoo天気からデータ取得したいと思います。

スクレイピングが禁止されているWEBページもあるのでお気を付けください。

事前準備

今回のサンプルではrequestsとBeautifulSoup,Pandasを使用します。
インストールしていない方はインストールして下さい。

pip install requests 
pip install beautifulsoup4
pip install pandas

実践

実施すること

YahooニュースからトップニュースのタイトルとURLを取得します。
https://news.yahoo.co.jp/

上記画像の黄色の枠内をスクレイピングします。

サンプルコード

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re

def main():
    url = "https://news.yahoo.co.jp/" 
    r = requests.get(url)
    soup = BeautifulSoup(r.text, "html.parser")
    rs = soup.find_all(href=re.compile('news.yahoo.co.jp/pickup'))
    df = pd.DataFrame(index=[], columns=['text', 'link'])
    for i in rs:
        text = i.getText()
        link = i.attrs['href']
        index = pd.Series([text, link], index=df.columns)
        df = df.append(index, ignore_index=True)
    print(df)

if __name__=="__main__":
    main()

このサンプルを使用すると次のような結果が取得できます。

             text                                     link
0  制限緩和どこまで 実証実験開始  https://news.yahoo.co.jp/pickup/6406326
1   感染者減少も「弱毒化はない」  https://news.yahoo.co.jp/pickup/6406322
2   池袋の飲食店で爆発 3人搬送  https://news.yahoo.co.jp/pickup/6406327
3  絞首刑の縄? ジバンシィに批判  https://news.yahoo.co.jp/pickup/6406317
4  インド電力不足の恐れ 需要急増  https://news.yahoo.co.jp/pickup/6406319
5  設計ミス 北大トイレ「丸見え」  https://news.yahoo.co.jp/pickup/6406321
6   燕・中村「阪神をやっつける」  https://news.yahoo.co.jp/pickup/6406320
7  サウジ戦 森保J完全アウェーか  https://news.yahoo.co.jp/pickup/6406318

解説

① requestsを用いてHTMLを取得
url = "https://news.yahoo.co.jp/" 
r = requests.get(url)

requests.get(‘URL’)でYahoo天気のHTML情報を全て取得します。取得した内容を変数rに格納しています。

② BeautifulSoupを使用してhtml形式にパース
soup = BeautifulSoup(r.text, 'html.parser')

①で習得したHTMLからBeautifulSoupオブジェクトを作成します。

③ データの抽出
rs = soup.find_all(href=re.compile('news.yahoo.co.jp/pickup'))

“news.yahoo.co.jp/pickup'”というリンクが付いている内容を変数rsに格納します。

④ 空のデータフレームの作成
df = pd.DataFrame(index=[], columns=['text', 'link'])

保存用するためのデータフレームを作成します。

⑤ データフレームへ見出しとURLを追加
for i in rs:
        text = i.getText()
    link = i.attrs['href']
    index = pd.Series([text, link], index=df.columns)
    df = df.append(index, ignore_index=True)
ABOUT ME
ishi
こんにちは。IshiLog.com管理人です。 趣味は食事とゲーム、ガジェットを買うこと。 業務推進部にてRPA等による業務効率化やWebアプリ開発等を行なっています。 このブログではPython等のプログラミングに関する備忘録として技術や知識、趣味に関することを紹介していきます。