でも、どうやってやれば良いのか分からない。初心者でも分かりやすく教えて欲しい!
この記事では、上記のような悩みを解決していきます。
この記事の内容
- PythonでスクレイピングしたデータをCSVに保存する方法
この記事を書いている僕は、Pythonをメインの言語にしている現役のフリーランスエンジニア。
過去にはデータサイエンス案件に携わっていたので、Pythonを使ったデータ操作には慣れています。
今回はそんな僕が『PythonでスクレイピングしたデータをCSVに保存する方法』を紹介していきます。
スクレイピング結果のCSV出力は、わりと使う知識です。しっかりおさえておきましょう。
なお、必要になるPythonライブラリは以下の通りです。
- csv
- Requests
- Beautiful Soup
Contents
PythonでスクレイピングしたデータをCSVに保存する方法【3STEPで解説】

今回はタレント辞書に載っている「20代の女優一覧」から、以下のデータをスクレイピングで取得したいと思います。
- 名前
- 職業(モデル、女優、タレント)
- 年齢
- 詳細ページのURL

スクレイピングしてから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およびBeautifulSoupの扱いに慣れていたら問題ないかなと。
もし、スクレイピングのコード自体が怪しい場合には、以下の記事を参考に復習してみてください(`・ω・´)!

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)
上記のコードを書いてみましょう。
そうすると、以下のような出力結果になるかと思います。

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