pythonの学習記録をつけてみようと思い、Qittaを始めてみました。
仕事は非IT企業なので、、pythonは本当に趣味・・・というか、興味本位で学習しています。
今は、食品衛生に関わる仕事をしているので、pythonを使って何か出来ないかな〜と思い、食品のリコール情報をデータ分析してみよう!と思い立ちました。
その第一段階として、スクレイピングで食品リコール情報のデータフレームを作ってみました。データの元はリコールプラスというサイト。
from bs4 import BeautifulSoup
import requests
import re
import csv
import time
import pandas as pd
def recalls(url):
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
recall_soup = soup.findAll("tr",{"class":{"return","info","apology"}})
campany_list = []
recall_list = []
action_list = []
recall_date = []
for j in range(len(recall_soup)):
#会社名を取得
campany_list.append(recall_soup[j].find("a", href=re.compile("/company/*")).get_text())
#リコール内容
recall_list.append(recall_soup[j].find("a", {"style":"float:left"}).get_text())
#対応方法
keyword = re.compile(r'回収|回収&返金|回収&返金/交換|回収&交換|返金|交換|点検&交換|お知らせ|景品表示法違反|お詫び|返金/交換|送付')
action_list.append(re.search(keyword, str(recall_soup[j])).group())
#発生日
recall_date.append(recall_soup[j].find("td", {"class":"day"}).get_text().replace("\n ","20"))
return campany_list,recall_list,action_list,recall_date
campany_lists = []
recall_lists = []
action_lists = []
recall_dates = []
for i in range(1,20):
resl = recalls("https://www.recall-plus.jp/category/1?page={}".format(i))
campany_lists.extend(resl[0])
recall_lists.extend(resl[1])
action_lists.extend(resl[2])
recall_dates.extend(resl[3])
recall_df = pd.DataFrame({'会社名':campany_lists,'リコール内容':recall_lists,'対応':action_lists,'発生日':recall_dates})
実行結果
recall_df.head()
会社名 リコール内容 対応 発生日
0 神戸物産 業務スーパー ほしいもスティック一部商品に樹脂片の混入 回収 2020/03/17
1 丸文 丸文 国産大豆使用よせ豆腐 消費期限誤表示 回収 2020/03/17
2 イオン常陸大宮店... 豚肉ロース味付トンテキ用 アレルゲン(乳)表示欠落 お詫び 2020/03/18
3 ツルヤ 軽井沢店 おいしい白身魚フライ アレルゲン乳成分表示欠落 回収 2020/03/16
4 畑中鯉屋 畑中鯉屋 鯉甘煮 アレルゲン「小麦」の表示欠落 回収 2020/03/13
見た目上は、pandasのデータフレームに収納出来た・・・と思います。
はじめは、データフレームにその都度上場を書き込もうかと思ったけれど、やり方がわからずに断念。一先ず、それぞれの列のリストを作ってから、pandasに取り込む格好にしてみました。
ど素人なので、なんかの一つ覚えではじめはappend()で値を追加していました。しかし、それだとリスト形式で追加されてしまい、うまくpandasに取り込めませんでした。
色々調べてみると、リストの中の値だけを追加するには、extend()を使えばよいと分かりました。
一つ勉強になりました。
無事データも作れたので、データ分析をしてみたいと考えています。
今このデータで、分析出来そうな事は、
①リコールが起きた時の回収や返品の割合
②リコールが起きやすい時期はあるのか?
でしょうか。
色々試行錯誤してみたいと思います。