【Python】スクレイピングの取得結果をエクセルに出力する
Table of Contents
ぜひ読んでほしい方
・Pythonスクレイピングで取得した結果をエクセルに表でまとめたい方
・定期的に会計報告のような資料をエクセルにまとめて作る必要があり、それを自動化したいと考えている方
全体コード提示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import requests from bs4 import BeautifulSoup url = 'https://produce-web.net' #取得したいサイトのURLに変える html = requests.get(url) soup = BeautifulSoup(html.content, "html.parser") num = [] titles = [] tmp_num = 1 for element in soup.select('.entry-title'): #取得したい要素名に変える num.append(tmp_num) #配列numに1から始まる整数を格納 titles.append(element.text) #配列titleに取得した記事タイトルを格納 tmp_num += 1 ##以下、エクセル出力に関する部分 import openpyxl wb = openpyxl.Workbook() #エクセルファイルを新規作成 sheet = wb.active sheet.title = 'blog_title' #excelシート名を「blog_title」に sheet["A1"].value = '新着順' sheet["B1"].value = '記事タイトル' for i in range(1, tmp_num): sheet.cell(column=1, row=i+1, value=num[i-1]) #配列numの要素をA列に出力 sheet.cell(column=2, row=i+1, value=titles[i-1]) #配列titleの要素をB列に出力 wb.save('scraping_excel.xlsx') #「scraping_excel.xlsx」というファイル名で保存 wb.close() |
上のコードでは、このブログのトップページ(1ページ目のみ)にある記事のタイトルを取得するデータとしています。皆さんは各々が取得したいデータに合わせてコードを変えてください。
データを取得し、配列に格納
まず、エクセルに出力するための準備として、取得したデータを配列に格納しておく必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import requests from bs4 import BeautifulSoup url = 'https://produce-web.net' #取得したいサイトのURLに変える html = requests.get(url) soup = BeautifulSoup(html.content, "html.parser") num = [] titles = [] tmp_num = 1 for element in soup.select('.entry-title'): #取得したい要素名に変える num.append(tmp_num) #配列numに1から始まる整数を格納 titles.append(element.text) #配列titleに取得した記事タイトルを格納 tmp_num += 1 |
numという配列には取得した記事タイトルの順番を、titlesという配列には取得した記事タイトル部分に相当する「テキスト」を格納します。
これで、エクセルに出力する準備は完了です。
エクセルに出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
##以下、エクセル出力に関する部分 import openpyxl wb = openpyxl.Workbook() #エクセルファイルを新規作成 sheet = wb.active sheet.title = 'blog_title' #excelシート名を「blog_title」に sheet["A1"].value = '新着順' sheet["B1"].value = '記事タイトル' for i in range(1, tmp_num): sheet.cell(column=1, row=i+1, value=num[i-1]) #配列numの要素をA列に出力 sheet.cell(column=2, row=i+1, value=titles[i-1]) #配列titleの要素をB列に出力 wb.save('scraping_excel.xlsx') #「scraping_excel.xlsx」というファイル名で保存 wb.close() |
ここからは、エクセルに出力する部分の解説をします。
まずコメントアウトでも示してある通り、エクセルファイルを新規作成します。その後、エクセルのA1セル、B1セルに列のタイトルを指定します。(列タイトルは任意で変えて構いません。)
そうしたらfor文のところで、いよいよ取得したデータを出力していきます。
まず、繰り返すiの範囲の最終値ですが、始めに示した全体コードの13行目から始まるfor文を見ると、ループ終了時のtmp_numは「記事数+1」になっています。for rangeの仕様上、iが「第2引数 – 1」になるまで繰り返すので、第2引数に「tmp_num」を入れることで、ちょうど「記事数」ぶんだけ繰り返すことになります。
次にfor文の中で繰り返す処理ですが、sheet.cellの引数columnにはエクセルの列の番号を数字で指定(A→1、B→2、等)、同様にrowには行の数字を指定します。valueには、columnとrowで指定したcellの中身を指定します。
上のコードでは、iはちょうど取得した記事の順番(番目)と一致しますので、1番目の記事は2行目(1行目には「新着順」「記事タイトル」が入っている)、2番目は3行目、・・・といった具合になるように、row=i+1を指定しています。一方valueには、配列numやtitleの内容を指定します。この際、配列のインデントは0から始まるので[i-1]で指定します。