Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

【Python学習中】 スクレイピング実践 表のデータをcsvファイルに保存する方法2

引き続きスクレイピングした表のデータをcsvに保存する方法を説明していきます。
今回は、前回取得した「市区町村名」と「市区町村名のリンク」を
表の形にしてcsvファイルに格納します。

◆目次◆

pandasについて

pandasとは、データ分析の手助けをしてくれる外部ライブラリです。

pandasには非常に多くの機能があり、
説明しきれないため、今回は詳細の説明は割愛します。

今回行いたい「リスト型や辞書型のデータを、表の形にしてcsvファイルに格納する」
に必要な部分のみ紹介します。
(また別の機会にpandasモジュールは記事にしたいと思います)

なお、pandasモジュールはサードパーティ製のライブラリのため
Anacondaに含まれていません。
初めてpandasモジュールを使用するときは
以下のページの「外部ライブラリのモジュールのインストール方法」を
参考にして、モジュールをインストールしてください。
Python スクレイピングをするための準備 Requestsモジュール1 - Kの備忘録(仮)

・df = pd.DataFrame(list)
  リスト型や辞書型のデータをデータフレームワーク型にはめる

今回の内容に編集すると、以下のコードになる
(後述の手順2のコード)

df = pd.DataFrame(city_list)


・df.to_csv('aaa.csv')
  csvファイル名を指定
・index = None
  データフレームの1列目に表示されるインデックスを削除
・encoding='utf-8-sig
  エンコードの種類をUTF-8(BOMあり)に指定

※BOM とは、 Byte Order Mark の略です。
 「これは Unicode で書かれたファイルデータである」ということを
 明示しています。
 BOMなし(encoding='utf-8')だと、エクセルで開いたときに文字化けする場合があります。

この3つを今回の内容に編集すると、以下のコードになる
(後述の手順3のコード)

df.to_csv('city.csv', index = None, encoding='utf-8-sig')

今回の スクレイピングのお題

Yahoo! Japan 天気・災害」のトップページの検索窓で「東京」した結果の画面
https://weather.yahoo.co.jp/weather/search/?p=東京」の
「市区町村名」と「市区町村名のリンク」の情報をcsvファイルに保存する。

手順1(前回の記事の部分)

https://weather.yahoo.co.jp/weather/search/?p=東京」の
市区町村の表のtableタグの情報を取得し 変数city_listに「市区町村名」と「市区町村名のリンク」を格納する。
※前回の記事のリンクは、末尾の関連記事にあります。

手順2

変数city_listをデータフレーム型にはめる。
(Jupyter Notebookでデータフレーム型にはめた変数city_listを確認すると
 以下のように表示される)

f:id:lbibouroku:20210606234021p:plain

手順3

csvファイルに保存する。
(保存したcsvファイルをExcelで開くと以下のように表示される)

f:id:lbibouroku:20210606235432p:plain

実際のコード

from bs4 import BeautifulSoup
import requests

# pandasモジュールをインポートする
import pandas as pd

url = 'https://weather.yahoo.co.jp/weather/search/?p=東京'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')


city_table = soup.select_one('#rsltmuni table')
city_cells = city_table.find_all('td')

# 変数d_listに空のリストを作成する
city_list = []

# 各行に対して市区町村名とリンクを取得する
for city_cell in city_cells:  
    city_name = city_cell.text
    city_link = city_cell.find('a').get('href')
    
    city = {
            '市区町村名': city_name,
            'リンク': city_link,
            }
    city_list.append(city)
# ---------ここまでpandasモジュール以外は前回と同じ----------- 

# 手順2のコード
df = pd.DataFrame(city_list)

# 手順3のコード
df.to_csv('city.csv' ,index = None, encoding='utf-8-sig')

これでスクレイピングした表の情報をcsvファイルに保存することができました。
次回は、他の表をcsvファイルに保存をしたいと思います。

関連記事

【Python学習中】 スクレイピング実践 表のデータをcsvファイルに保存する方法1 - Kの備忘録(仮)