前提・実現したいこと
現在商品の価格を調べるためにpythonでスクレイピングをし、エクセルに記入書き込んでいくという作業をプログラミングしています。実現したいことは以下になります。
①エクセルでJANをpythonで読み込んでネット検索にて価格をスクレイピング。
②スクレイピングしたデータを読み込んだエクセルのJANコードと同じ行の最後(15列目)に記入。(現在この段階で躓いています。)
③価格が複数スクレイピングしてしまった場合、最安値のみ表示。
私はプログラミング歴は0~1年。趣味とスキルアップのため本やネット検索にて勉強しております。
今回いろいろ調べてみたのですがどうしても解決できなかったのでご教授をお願いいたします。
エクセル書き込み機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
'list' object is not callable Cannot convert [599] to Excel ※599は取得した価格です
該当のソースコード
python
1# -*- coding: utf-8 -*- 2import requests 3from bs4 import BeautifulSoup 4from openpyxl import load_workbook 5import datetime 6import time 7import re 8 9#エクセルを開く&各種変数設定 10wbName='中間テスト用.xlsx'#補足事項をご覧ください。 11wb = openpyxl.load_workbook(wbName) 12ss1 = wb['売れ筋 先週'] 13wb.active = ss1 14 15#対象キーワードを読み込む 16kw=[]#検索対象のキーワードを格納するリスト 17for r1 in range(100): #ここは100としていますが何行になるか実際わからないです、、、 18 if ss1.cell(row=2+r1,column=4).value!=None: 19 kw.append(ss1.cell(row=2+r1,column=4).value) 20 21#スクレイピング本体 22 23print('スクレイピングを開始します') 24for i in range(len(kw)): 25 print('キーワード:「{}」の検索結果を取得します'.format(kw[i])) 26 url='https://kakaku.com/search_results/'+kw[i]+'/' # 27 html=requests.get(url) 28 #time.sleep(1) 29 soup =BeautifulSoup(html.text,'html.parser') 30 31 #item=[]#価格格納用リスト 32 for alldata in soup.find_all(class_="p-result_list_wrap"):#全体を取得 33 #item_a.append(alldata.find_all(class_="p-item_price").text) 34 item_a=[] 35 item_b=[] 36 for a in alldata.find_all(class_="p-item_price"):#価格ある場合のclassをすべて取得 37 datatext=a.text 38 datakakaku = int(re.sub("\D", "", datatext)) 39 item_a.append(datakakaku) 40 for b in alldata.find_all(class_='p-resultNone_line'):#価格がない場合のclass取得(商品がみつからなかったときこのclassがでる) 41 item_b.append(b.text)#リスト2に追記していく 42 43 print(item_a+item_b) 44 45 #------------------------------------------------ 46 #エクセルに書き込む 47 for r3 in range(len(kw)): 48 ss1.cell(row=r3+2, column=15).value = item_a + item_b 49 r3=r+1 50 wb.save(wbName) 51print('スクレイピングが完了しました')
試したこと
最後にエクセルで書き込むときforを使わないで最初のforの変数iを入力してみましたが
書き込めませんでした。これは見当違いかもしれませんがいろいろ試したなかの1つです。
ss1.cell(row=i+2, column=15).value = item_a(i) + item_b(i)
他に
for r3 in range(len(kw)):
ss1.cell(row=r3+2, column=15).value = item_a+item_b
r3=r+1
などです。
補足事項
イメージはこのような感じです。
エクセル(中間テスト)のセル
JAN 価格
A B C D ~~~ O
111111111 500
222222222 500
続く
またスクレイピングした価格を数字化し「min(item_a)」で抽出しようとしたができませんでした。
※これは今回の質問の内容とは違うのですが解決できていない問題の一つだったので記載させていただきました。item_aのリストないの最小の値を取得しようとしてもできませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/21 00:34
2020/03/21 01:25
2020/03/21 08:47
2020/03/21 10:46
2020/03/21 10:50