Webスクレイピング

PythonでスクレイピングしたデータをCSVに保存する方法【3STEPで解説】

Python スクレイピング CSV
スクレイピング学習中の人
スクレイピング学習中の人
Pythonでスクレイピングした結果を、CSVに出力して保存したいな…。

でも、どうやってやれば良いのか分からない。初心者でも分かりやすく教えて欲しい!

この記事では、上記のような悩みを解決していきます。

 

この記事の内容

  • PythonでスクレイピングしたデータをCSVに保存する方法

 

この記事を書いている僕は、Pythonをメインの言語にしている現役のフリーランスエンジニア。

過去にはデータサイエンス案件に携わっていたので、Pythonを使ったデータ操作には慣れています。

 

今回はそんな僕が『PythonでスクレイピングしたデータをCSVに保存する方法』を紹介していきます。

 

スクレイピング結果のCSV出力は、わりと使う知識です。しっかりおさえておきましょう。

なお、必要になるPythonライブラリは以下の通りです。

  • csv
  • Requests
  • Beautiful Soup

 

PythonでスクレイピングしたデータをCSVに保存する方法【3STEPで解説】

Python スクレイピング CSV

今回はタレント辞書に載っている「20代の女優一覧」から、以下のデータをスクレイピングで取得したいと思います。

  • 名前
  • 職業(モデル、女優、タレント)
  • 年齢
  • 詳細ページのURL
Python スクレイピング CSV

»参考 : 女優 20代 一覧 – タレント辞書

 

スクレイピングしてからCSVに保存するまでの手順は、以下のとおりです。

  • STEP① : スクレイピングで、データを抽出する(※いつもどおり)
  • STEP② : ヘッダー部分を作成する
  • STEP③ : 抽出したデータを、CSVに書き込む

順番に解説していきますね(`・ω・´)!

 

STEP① : スクレイピングで、データを抽出する(※いつもどおり)

 

結論、以下のコードでスクレイピングが可能です。

import requests
from bs4 import BeautifulSoup

url = 'https://talent-dictionary.com/s/jobs/3/20'
r = requests.get(url)

soup = BeautifulSoup(r.text, 'html.parser')
actors = soup.find('ul', attrs={'class': 'list'}).find_all('li')

for actor in actors:
    prof = actor.find('div', attrs={'class': 'right'})

    name = prof.find('a', attrs={'class': 'title'}).text
    url = prof.find('a', attrs={'class': 'title'}).get('href')
    occupation = prof.find('a', attrs={'class': 'job'}).text
    age = prof.find('span', attrs={'class': 'age'}).text

    print('****************')
    print(name)
    print(url)
    print(occupation)
    print(age)
    print()

 

上記を実行すると、以下のような出力になるはずです。

Python スクレイピング CSV

 

コードについては、PythonおよびBeautifulSoupの扱いに慣れていたら問題ないかなと。

 

もし、スクレイピングのコード自体が怪しい場合には、以下の記事を参考に復習してみてください(`・ω・´)!

Python Webスクレイピング
【初心者向け】PythonでWebスクレイピングする方法【コードあり】『Pythonを使ったWebスクレイピングを学習していきたいな...。どこか基礎から教えてくれるサイトはないかな...。』このような悩みを解決する記事になっています。PythonでWebスクレイピングしたい方は必見です。...

 

STEP② : ヘッダー部分を作成する

 

スクレイピングで取得したデータを、そのままCSVに書き込んでしまうと、各列に格納されているデータが何を意味するのか分からなくなってしまいます。

人名や職業なら分かるかもですが、数字だけ格納されている列に関しては、やはり説明がないと難解です。

そのため、スクレイピングで取得したデータをCSVに書き込むとき、ヘッダーを作成してあげましょう。

import requests
from bs4 import BeautifulSoup

HEADER = ['name', 'age', 'occupation', 'url'] # 追加部分

url = 'https://talent-dictionary.com/s/jobs/3/20'
r = requests.get(url)

soup = BeautifulSoup(r.text, 'html.parser')
actors = soup.find('ul', attrs={'class': 'list'}).find_all('li')

for actor in actors:
    prof = actor.find('div', attrs={'class': 'right'})

    name = prof.find('a', attrs={'class': 'title'}).text
    url = prof.find('a', attrs={'class': 'title'}).get('href')
    occupation = prof.find('a', attrs={'class': 'job'}).text
    age = prof.find('span', attrs={'class': 'age'}).text

    print('****************')
    print(name)
    print(url)
    print(occupation)
    print(age)
    print()

 

STEP③ : 抽出したデータを、CSVに書き込む

最後に抽出したデータをCSVに書き込みましょう。

結論、以下のコードが全体像になります。

import csv

import requests
from bs4 import BeautifulSoup

HEADER = ['name', 'age', 'occupation', 'url']

url = 'https://talent-dictionary.com/s/jobs/3/20'
r = requests.get(url)

soup = BeautifulSoup(r.text, 'html.parser')
actors = soup.find('ul', attrs={'class': 'list'}).find_all('li')

with open('actors.csv', 'w', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(HEADER)
    for actor in actors:
        prof = actor.find('div', attrs={'class': 'right'})

        name = prof.find('a', attrs={'class': 'title'}).text
        url = prof.find('a', attrs={'class': 'title'}).get('href')
        occupation = prof.find('a', attrs={'class': 'job'}).text
        age = prof.find('span', attrs={'class': 'age'}).text

        row = [name, age, occupation, url]
        writer.writerow(row)

 

上記のとおり。

やっていることを端的にまとめると、以下の流れになっています。

  • ① with(ステートメント)を使って、CSVファイルを開く
  • ② ファイル書き込みするために、writer = csv.writer(f)でインスタンスを作成する
  • ③ for文前でヘッダーだけ書き込んで、for文で中身を書き込んでいく

withステートメントで開くCSVファイルは、そのファイルが存在しなければ新しく作成されます。

なので、今回でいうとactors.csvは最初から作成しておく必要がありません。

逆に、既存で存在するCSVファイルに書き込みする場合、中身が消えてしまいますのでご注意ください(`・ω・´)!

 

補足 : 作成したCSVファイルの中身を、Pythonで確認する

 

作成したCSVの中身を、Pythonを使って確認しておきましょう。

CSVの読み込みはPandasを使ってデータフレームに変換してしまうのが手っ取り早いです。

import pandas as pd

df = pd.read_csv('actors.csv')
print(df)

上記のコードを書いてみましょう。

そうすると、以下のような出力結果になるかと思います。

Python スクレイピング CSV

しっかりとCSVファイルを作成できていますね(`・ω・´)!