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のリンクを張っておきます.