見出し画像

PythonでYahoo!ニュースをスクレイピングしてみた

スクレイピングの基本を理解するために、Pythonを使用してYahoo!ニュースの「ピックアップ」記事の情報を取得し、CSVファイルに保存するコードを作ってみました。

では早速、いきましょう。



コード全体

コードは以下で全てです。

import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import re
import time

# URL
url = "https://www.yahoo.co.jp/"

# URLにアクセスする 
req = requests.get(url)

# res.textをBeautifulSoupで扱うための処理
soup = BeautifulSoup(req.content, "html.parser")

# href属性に特定の文字が含まれているものを検索
elems = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))

# 取得した情報の数
num = len(elems)

# numpyライブラリで初期化
news = np.zeros((num,3), dtype='object')

# 保存するときにタイトル行は要れるので、データのみ格納
i = 0
for elem in elems:

    # ハイライト記事の取得
    res_detail = requests.get(elem.attrs['href'])
    soup_detail = BeautifulSoup(res_detail.content, "html.parser")
    elems_detail = soup_detail.find(class_=re.compile("highLightSearchTarget"))

    # データの格納

    news[i][0] = elem.text
    news[i][1] = elem.attrs['href']
    news[i][2] = elems_detail.text

    # サーバに負荷をかけないように待機(秒)
    time.sleep(1)

    i = i + 1

df = pd.DataFrame(news, columns=["title", "url", "highlight"])
df.to_csv("data_pandus.csv", index=False, encoding="utf-8-sig"

以下、それぞれ詳しく解説します。

import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import re
import time

ライブラリのインポート:

  • この部分では、Pythonの各種ライブラリをインポートしています。

  • requestsライブラリは、Webサイトにアクセスするための機能を提供します。

  • BeautifulSoupライブラリは、HTMLやXMLの解析を手軽に行えるようにしてくれます。

  • numpyライブラリは、数値計算に便利な機能を備えています。

  • pandasライブラリは、データ分析に役立つ機能を多数持っています。

  • reライブラリは、正規表現を使用するための機能を提供します。

  • timeライブラリは、時間関連の処理を行うための機能を備えています。


# URL
url = "https://www.yahoo.co.jp/"

URLの設定:


# URLにアクセスする 
req = requests.get(url)

# res.textをBeautifulSoupで扱うための処理
soup = BeautifulSoup(req.content, "html.parser")

Webサイトにアクセス:

  • requests.get(url)を使用して、指定したURLにアクセスし、レスポンスを取得しています。

  • BeautifulSoup(req.content, "html.parser")を使用して、取得したレスポンスの内容をHTML解析用オブジェクトに変換しています。


# href属性に特定の文字が含まれているものを検索
elems = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))

記事のリンクを抽出:

  • soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))を使用して、HTMLドキュメント内のhref属性に"news.yahoo.co.jp/pickup"が含まれる要素を抽出しています。

  • これにより、Yahoo!ニュースの「ピックアップ」記事のリンクが取得できます。


# 取得した情報の数
num = len(elems)

# numpyライブラリで初期化
news = np.zeros((num,3), dtype='object')

抽出した記事の情報を保存:

  • `numpy.zeros((num,3), dtype='object')`:抽出した記事の数だけ行を持つ3列の配列を作成しています。


# 保存するときにタイトル行は入れるので、データのみ格納
i = 0
for elem in elems:

    # ハイライト記事の取得
    res_detail = requests.get(elem.attrs['href'])
    soup_detail = BeautifulSoup(res_detail.content, "html.parser")
    elems_detail = soup_detail.find(class_=re.compile("highLightSearchTarget"))

    # データの格納

    news[i][0] = elem.text
    news[i][1] = elem.attrs['href']
    news[i][2] = elems_detail.text

    # サーバに負荷をかけないように待機(秒)
    time.sleep(1)

    i = i + 1

保存するときにタイトル行は入れるので、データのみ格納:

  • for elem in elems:のループ内で、各記事のリンクにアクセスし、ハイライト部分を抽出しています。

  • news[i][0] = elem.textで記事のタイトルを、news[i][1] = elem.attrs['href']で記事のURLを、news[i][2] = elems_detail.textでハイライト部分の内容を、それぞれ配列に格納しています。

  • print("Getting : " + elem.text)で、現在取得している記事のタイトルを出力しています。

  • time.sleep(1)で1秒待機することで、サーバへの負荷を軽減しています。


df = pd.DataFrame(news, columns=["title", "url", "highlight"])
df.to_csv("data_pandus.csv", index=False, encoding="utf-8-sig"

CSVファイルに保存:

  • pd.DataFrame(news, columns=["title", "url", "highlight"])を使用して、取得した情報をPandasのデータフレームに変換しています。

  • df.to_csv("data_pandus.csv", index=False, encoding="utf-8-sig")を使用して、データフレームの内容をCSVファイルに保存しています。


データサンプル

成功すると以下のようにデータを取得できます。

csvサンプル


まとめ

というわけで、今回はPythonYahoo!ニュースをスクレイピングする手順を解説してみました。

これからも日々のヒントになるような事を発信したいと思いますので、フォローしていただけると嬉しいです。

ではまた。

この記事が気に入ったらサポートをしてみませんか?