2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cookpadのレシピから材料抽出してみた【スクレイピング】

Last updated at Posted at 2023-04-21

Pythonでのスクレイピング

この記事では, PythonのBeautifulsoupを使ったスクレイピングと, mecabを用いた形態素解析をしています.
これらのインストールが済んでいない場合はpip等でインストールしてください.(Macだとmecabのインストールにhomebrewが必要だったかも)

早速本題

コード
import requests
from bs4 import BeautifulSoup
import MeCab

m = MeCab.Tagger('-Owakati')

url = "レシピのURL"
response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')

recipe_title = soup.find('h1', class_='recipe-title').text.strip()
print(recipe_title)

ingredients_list = []
for ingredient in soup.find_all('div', class_='ingredient_row'):
    ingredient_quantity = ingredient.find('div', class_='ingredient_quantity')
    ingredient_name = ingredient.find('div', class_='ingredient_name')
    if ingredient_quantity is not None:
        ingredient_quantity = ingredient_quantity.text.strip()
        parsed_ingredient_quantity = m.parse(ingredient_quantity).rstrip('\n')
    else:
        parsed_ingredient_quantity = None
        
    if ingredient_name is not None:
        ingredient_name = ingredient_name.text.strip()
        parsed_ingredient_name = m.parse(ingredient_name).rstrip('\n')
    else:
        parsed_ingredient_name = None

    ingredients_list.append({'name': parsed_ingredient_name, 'quantity': parsed_ingredient_quantity})

print(ingredients_list)

この方法では, ingredients_listの中身は辞書型で表示されます.
ちなみにこれはChatGPTに聞きながら書きました.(この記事自体も, ChatGPTにコードを書かせたのも初だったりする)

少し解説

requestsを通じて, CookpadのwebページからHTMLのデータを取得して, その中からbeautifulsoupを使って, レシピのタイトルや材料一覧(材料名と分量)の要素を抽出しています.

例えばrecipe_title = soup.find('h1', class_='recipe-title').text.strip()では, HTML内の見出し要素であるh1の中から, recipe-titleというクラスを探して, そこのテキスト部分のみを抽出している訳ですね.
find内のclass等の指定は, デベロッパーツールを使って実際のHTMLを覗く必要があります.

mecabについては, ここではあまり大きな効力はなかったと考えていますが, 例えば「たまねぎとにんじん」と記載があった際に「たまねぎ」「と」「にんじん」のように分けてくれてハッピーになれるときがあるかもしれません.

is not Noneについては, たまにレシピ内の材料に材料でない単語が混ざっていたりするので, とりあえず書いといたほうが適用範囲が増えるよって感じですね.

このまま実験等のデータに使えるか

結論から言うと, 加工は必要だと思います.

まず, 今回は一つのURLのみからデータを取ってきていますが, 一つのレシピだけからのデータで済むことも中々ないと思います.

そうなると複数のレシピが必要になりますし, その中で「たまねぎ」と「玉ねぎ」等, 記事によって表記ゆれがあるため, そこも修正しないといけません. (これはreplaceとかが有効かもしれません)

私がぱっと思いつくだけでもこれくらいの課題点はありますし, 実際にはもっと変えるべき箇所はあると思います.

最後に

スクレイピングについては, サイトの利用規約に目を通してから行ってください.
念のため, cookpad利用規約のURLのリンクを張っておきます.

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?