見出し画像

Pythonで食品のリコール情報をスクレイピング

Pythonで食品のリコール情報をスクレイピングしてみました。

利用させていただいたWebは、リコールプラスです。選定理由は、一番初めに目について、スクレイピングしやすそう?な気がしたからです。

それにしても、食品のリコール情報は収集が大変です。食品表示法・景品表示法絡みの回収→消費者庁管轄(このサイト)食品衛生法関係の回収→厚生労働省(ここ)での確認になります。正直、メンドクサイ。一元化してもらいたいもんです。

import requests
import bs4
import re
import csv
import time

recall_list = []

for i in range(1,19):
    url ="https://www.recall-plus.jp/category/1?page={0}".format(i)
    res = requests.get(url)
    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    recall_soup = soup.findAll("tr",{"class":{"return","info","apology"}})
    #print(recall_soup)
    for j in range(len(recall_soup)):
        #データ構造 [会社名、リコール内容、対応方法、発生日]
        recall_data = []
        #会社名を取得
        recall_data.append(recall_soup[j].find("a", href=re.compile("/company/*")).get_text())
        #リコール内容
        recall_data.append(recall_soup[j].find("a", {"style":"float:left"}).get_text())
        #対応方法
        keyword = re.compile(r'回収|回収&返金|回収&返金/交換|回収&交換|返金|交換|点検&交換|お知らせ|景品表示法違反|お詫び|返金/交換|送付')
        recall_reaction = re.search(keyword, str(recall_soup[j])).group()
        recall_data.append(recall_reaction)
        #発生日
        recall_data.append(recall_soup[j].find("td", {"class":"day"}).get_text().replace("\n        ","20"))
        recall_list += recall_data
    time.sleep(10)
    print(recall_list)
    print("now got {0} page ".format(i))

#スクレイピング結果をcsvに保存する
output_file = open('recall.csv', 'w', newline='')
output_writer = csv.writer(output_file)
output_writer.writerow(recall_list)
output_file.close()

作ってみたコードです。

可読性やら、処理のスマートさはいっさい無視(と言うより、そこまで考えてプログラム作れない)の素人感丸出しもっさりコードです。

「退屈なことはPython にやらせよう」を参考にしているので、BeautifulSoup4と、requestを使用しています。後は、スクレイピング結果をcsvファイルに保存するための、csv、正規表現を使うためのre、処理の間を取るためtimeをインポートしています。

recall_list = []

for i in range(1,19):
    url ="https://www.recall-plus.jp/category/1?page={0}".format(i)
    res = requests.get(url)
    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    recall_soup = soup.findAll("tr",{"class":{"return","info","apology"}})

欲しい情報を一時保管するために、recall_listというリストを作成しました。次に、現在のリコール情報のページは、1−18ページでしたので、for文で繰り返し処理を行ってみました。

urlを見てみると、https://www.recall-plus.jp/category/1?page=(ページ数)となっているので、page=の後に数字を1〜18まで入れれるように、fomat関数を使ってみました。ここも自動化できそうだけど、今の僕の能力では思いつかないので、とりあえず愚直に数字を指定して入れ込む事にしてみました。 

res = requests.get(url)で、HTMLファイルをダウンロード出来るようです。

soup = bs4.BeautifulSoup(res.text, 'html.parser')で、解析するhtmlファイルを準備します。'html.parser'は無くても動くのですが、何やら注意喚起されるので、とりあえず明示してみました。

recall_soup = soup.findAll("tr",{"class":{"return","info","apology"}})で、リコール情報が書いてある行を抜き出せます。

    for j in range(len(recall_soup)):
        #データ構造 [事業者、リコール内容(タイトル)、種別、発表日]
        recall_data = []
        #事業者を取得
        recall_data.append(recall_soup[j].find("a", href=re.compile("/company/*")).get_text())
        #リコール内容(タイトル)
        recall_data.append(recall_soup[j].find("a", {"style":"float:left"}).get_text())
        #種別を取得
        keyword = re.compile(r'回収|回収&返金|回収&返金/交換|回収&交換|返金|交換|点検&交換|お知らせ|景品表示法違反|お詫び|返金/交換|送付')
        recall_reaction = re.search(keyword, str(recall_soup[j])).group()
        recall_data.append(recall_reaction)
        #発表日を取得
        recall_data.append(recall_soup[j].find("td", {"class":"day"}).get_text().replace("\n        ","20"))
        recall_list += recall_data
    time.sleep(10)
    print(recall_list)
    print("now got {0} page ".format(i))

目的行のタグで囲まれた部分を取り出せたので、後は種別、事業者、タイトル、発表日の内容のみを取り出します。

種別は、タグの中に情報が書き込まれており、どう頑張ってもBeautifulSoupでは取り出せませんでした。よって、文字列として処理し、正規表現で種別を取り出すことにしました。マッチするパターンをとりあえず、目視でしらみつぶしに作りました。パターン以外の種別が出てくると、noneが入ってしまい、次の行の.group()でエラーが出て止まってしまうので、ここは要改善。


#スクレイピング結果をcsvに保存する
output_file = open('recall.csv', 'w', newline='')
output_writer = csv.writer(output_file)
output_writer.writerow(recall_list)
output_file.close()

一時保管していたリストの内容を、csvファイルに書き出します。このコードは、「退屈なことはPython にやらせよう」に載っていたコードほぼそのままです。

作成できたデータ。

回収情報のデータが手に入ったので、回収の回数を数値化してみたり、何月に回収が多いのか、リコール内容をテキストマイニング??してみて、どんな回収が多いのか、などのデータ分析をしてみたいですね。

たった40行にも満たないコードを描くのに、8時間ぐらい試行錯誤していました。本職のプログラマーの人は、何千・何万行も書くのか、すごいな・・としみじみ感じました。

以前の職場で、ECサイト上の価格調査(確かうなぎだった気がする)をほぼ強制的に手伝わされた時、人力で目視価格チェック→エクセルで手動入力 みたいな事を4〜5人がかりで、数日かけてやった事を思い出しました。(そして、そのデータは役に立たなかったし、依頼者にはさんざん文句を言われる始末・・・)

一度きっちりプログラムを組んでしまえば、一瞬で終わるので、プログラミングの強力さ(処理能力の高さ)を実感出来ました。

何とか使いこなしたいものだ。

食品工場を渡り歩いています。品質管理担当。世の中の食糧事情・食品衛生管理に貢献できる人物を目指して日々勉強。ITツールを活用すべく、色々試しています。