Pythonのスクレイピングについて
あるHTMLから複数データを抽出し、pandasのDataFrameに格納しました。
そのDataFrameをExcelシートに出力したところ、上手くはいくのですが毎回データが書き換わってしまいます。
実装したい運用としては、都度別シートに抽出したデータを更新(保存)していくイメージです。
個人的に調べてみても、
pandasのExcelWriterでは、データを上書きしてしまうみたいなので、
openpyxlを使ってみましたが、上手くいきませんでした…
対象のソースコードです。
Python
1 2import requests 3from bs4 import BeautifulSoup 4import pandas as pd 5import xlsxwriter 6import openpyxl as opx 7 8pages = 1 9 10data = [] 11data1 = [] #デイリー 12data2 = [] #週刊 13data3 = [] #月間 14data4 = [] #年間 15genre = "" 16path = r"C:パス" 17wb = opx.load_workbook(path) 18 19#メイン処理を行う 20def mainData(baseURL,pages): 21 while pages <= 5: 22 url = baseURL + str(pages) 23 OpenURL = requests.get(url) 24 content = OpenURL.content 25 soup = BeautifulSoup(content, 'html.parser') 26 27 for div in soup.select("div.desc"): 28 title = div.a.string 29 users = div.select_one(".info-users").span.get_text(strip=True) 30 author = div.select_one(".itemInfoElmBox").a.string 31 32 data.append( 33 { 34 "title": title, 35 "users": users, 36 "author": author, 37 } 38 ) 39 next 40 41 pages += 1 42 return data 43 44#データ4回*4(ジャンル) 45for i in range(4): 46 if i == 0: 47 genre = "book" 48 49 elif i == 1: 50 genre = "bunko" 51 52 elif i == 2: 53 genre = "shinsho" 54 55 elif i == 3: 56 genre ="comic" 57 58 for config in range(4): 59 if config == 0: 60 baseURL = "https://booklog.jp/ranking/" + genre + "?page=" 61 data1 = mainData(baseURL,1) 62 data = [] #初期化 63 64 elif config == 1: 65 baseURL ="https://booklog.jp/ranking/weekly/201908/1/" + genre + "?page=" 66 data2 = mainData(baseURL,1) 67 data = [] #初期化 68 69 elif config == 2: 70 baseURL ="https://booklog.jp/ranking/monthly/201907/" + genre + "?page=" 71 data3 = mainData(baseURL,1) 72 data = [] #初期化 73 74 elif config == 3: 75 baseURL = "https://booklog.jp/ranking/annual/2018/" + genre + "?page=" 76 data4 = mainData(baseURL,1) 77 data = [] #初期化 78 79 books1 = pd.DataFrame(data1) 80 books2 = pd.DataFrame(data2) 81 books3 = pd.DataFrame(data3) 82 books4 = pd.DataFrame(data4) 83 84 with pd.ExcelWriter(path)as writer: 85 books1.to_excel(xlsxwriter, sheet_name=genre+'デイリー') 86 books2.to_excel(xlsxwriter, sheet_name=genre+'週間') 87 books3.to_excel(xlsxwriter, sheet_name=genre+'月間') 88 books4.to_excel(xlsxwriter, sheet_name=genre+'年間') 89 90 91 92 93 94
上記ソースコードみたく、DataFrameを対象シートのA1にそのまま出力し、
次に実行した際にもpathにあるExcelの別シートに更新する方法は可能でしょうか。
ご教示いただきたく存じます。
「openpyxlを使ってみましたが、上手くいきませんでした…」とのことですが、何をトライされて
どう上手くいかなかったのでしょうか?
ご質問ありがとうございます。
openpyxlで対象のExcelを開き、pandasのTo_Excelで書き込もうと試みましたが、
オブジェクトが存在しないとエラーが起きてしまいました。
ファイルパスの指定に誤りがあるのではないかと推察しましたが、
試しにopenpyxlで開いたExcelのA1セルに文字を出力するコードを書いたら問題なく実行できたので、
pandasのDataFrameを扱う場合、特殊なコードが必要ではないかと考えています。。
openpyxlのチュートリアルを呼んで書き込み処理のコードを書きましょう。
openpyxlでは2つのブック間でのシートのコピーは出来ないようです。残念!(出来ればxlsxwriterで作成して、それをopenpyxlでコピーすれば良いと思ったのですが・・・)
何度もご回答頂きありがとうございます。
openpyxlで指定したエクセルに新規でシートを追加することはできるのですが、
pandasのDataFrameの書き込みの処理を加えるとオブジェクトエラーが発生してしまいます。汗
もう少しopenpyxlについて調べてみます。
回答にも追記しましたが、ExcelWriterをmode='a'で作成しても書き込み出来ませんでしたか?(すみませんがこちらで試してはないです)
コメント頂きありがとうございます。
一旦修正前の赤裸々のソースコードを載せました。
mode='a'でも実行できなかったため、根本的なところが誤っている可能性が考えられました。。
(いろいろとインポートしていますが、wb等の変数は使っていません。)