[GO] [Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!

Einführung

Hallo, das ist HanBei.

Vorheriger Artikel befasste sich mit der Datenerfassung für maschinelles Lernen, aber wir werden diesmal fortfahren.

Verwenden Sie weiterhin Google Colaboratory.

Bei Interesse bitte ** Kommentar ** oder ** LGTM **!

1-1. Zweck

Ich benutze die Rezeptseite, aber ** "Es ist viel" **, ** "Ist das wirklich empfohlene Gericht köstlich? (Entschuldigung)" **, also werde ich das Rezept finden, das ich will.

1-2. Ziel (Grund, diesen Artikel zu lesen)

Wir hoffen, dass dies für diejenigen nützlich ist, die Daten für maschinelles Lernen mithilfe der Daten im Web ** erhalten möchten.

1-3. Achtung

Schaben ist ein Verbrechen, wenn Sie die Verwendung und Dosierung nicht korrekt befolgen.

"Ich möchte kratzen, also mach dir keine Sorgen!" Für diejenigen, die optimistisch oder besorgt sind, empfehlen wir, dass Sie mindestens die beiden folgenden Artikel lesen.

miyabisun: "Stellen Sie auf der Q & A-Website keine Fragen zum Schaben" nezuq: "Liste der Vorsichtsmaßnahmen für das Web-Scraping"

1-4. Zu überprüfende Punkte

Dieser Artikel zeigt Ihnen, wie man kratzt, aber ** wir übernehmen keine Verantwortung **.

Denken Sie selbst und verwenden Sie es mit der richtigen Ethik.

2. Vorbereitung

2-1. Prüfung der Rezeptstelle

Empfohlen wie Cookpad, Nadia, White Rice.com Es gibt eine Rezeptseite für, aber dieses Mal verwenden wir ** Rakuten-Rezept **.

Grund, ・ Es gibt quantitative Daten wie "Ich möchte wiederholen", "Es war einfach" und "Ich habe gespeichert". ・ Viele Rezepte

ist.

2-2. Google Colaboratory verfügbar machen

Wenn Sie kein Google-Konto für die Verwendung von Google Colaboratory erstellt haben, erstellen Sie eines.

So erstellen Sie ein neues Notizbuch ...

  1. Klicken Sie auf Google Colaboratory, um zu beginnen
  2. Erstellen Sie eine neue in Google Drive Referenz: shoji9x9 "Zusammenfassung der Verwendung von Google Colab"

3. Üben

Von hier aus werde ich den Inhalt der Implementierung schreiben.

3-1. Einführung

Importieren Sie zunächst die Bibliothek.

from bs4 import BeautifulSoup
from google.colab import drive
from google.colab import files
import urllib
import urllib.parse
import urllib.request as req
import csv
import random
import pandas as pd
import numpy as np
import time
import datetime

Entscheiden Sie sich für den Namen des Gerichts, das Sie nachschlagen möchten!

#Der Name des Gerichts, nach dem Sie suchen möchten
food_name = 'Curry'

3-2. Holen Sie sich die Rezept-URL

Erstellen Sie eine Funktion, um die URL des Rezepts abzurufen.

#Speichern Sie die URL jedes Rezepts
recipe_url_lists = []

def GetRecipeURL(url):
  res = req.urlopen(url)
  soup = BeautifulSoup(res, 'html.parser')

  #Wählen Sie eine Reihe von Rezeptlisten
  recipe_text = str(soup.find_all('li', class_= 'clearfix'))
  #Teilen Sie den erfassten Text zeilenweise und speichern Sie ihn in der Liste
  recipe_text_list = recipe_text.split('\n')

  #Lesen Sie die Liste Zeile für Zeile und extrahieren Sie nur die Zeilen, die dem Namen des Gerichts entsprechen
  for text in recipe_text_list:
    #Holen Sie sich die URL für jedes Rezept
    if 'a href="/recipe/' in text:
      #Geben Sie ein bestimmtes Teil an und fügen Sie es in die URL ein
      recipe_url_id = text[16:27]
      #URL kombinieren
      recipe_url_list = 'https://recipe.rakuten.co.jp/recipe/' + recipe_url_id + '/?l-id=recipe_list_detail_recipe'
      #URL speichern
      recipe_url_lists.append(recipe_url_list)  

    #Holen Sie sich den Titel jedes Rezepts
    if 'h3' in text:
      print(text + ", " + recipe_url_list)

Überprüfen Sie die Rezepte in der Reihenfolge ihrer Beliebtheit

#Anzahl der Seiten, die Sie nachschlagen möchten
page_count = 2

#Codieren Sie, um den Namen des Gerichts in die URL einzufügen
name_quote = urllib.parse.quote(food_name)

#URLs kombinieren (nur eine Seiten-URL)
#In der Reihenfolge der Popularität
base_url = 'https://recipe.rakuten.co.jp/search/' + name_quote
#Neuankömmlingsbestellung
# base_url = 'https://recipe.rakuten.co.jp/search/' + name_quote + '/?s=0&v=0&t=2'

for num in range(page_count):
  #Um nach einer bestimmten Seite zu kommen
  # num = num + 50

  if num == 1:
    #URLs kombinieren (nur eine Seiten-URL)
   GetRecipeURL(base_url)

  if num  > 1:
    #Kombinieren Sie URLs (URLs ab Seite 2)
    #In der Reihenfolge der Popularität
    base_url_other =  'https://recipe.rakuten.co.jp/search/' + name_quote + '/' + str(num) + '/?s=4&v=0&t=2'
    #Neuankömmlingsbestellung
    # base_url_other =  'https://recipe.rakuten.co.jp/search/' + name_quote + '/' + str(num) + '/?s=0&v=0&t=2'
    GetRecipeURL(base_url_other)

  #Wenden Sie eine 1-Sekunden-Regel zum Schaben an
  time.sleep(1)

Anschließend werden Titel und Rezept-URL angezeigt. Searching_of_Delicious_Food_ipynb_Colaboratory.png

Lassen Sie uns die Anzahl der hier erhaltenen Rezepte überprüfen!


#Anzahl der erworbenen Rezepte
len(recipe_url_lists)

Bei der Ausführung werden 17 Elemente angezeigt.

Als nächstes werden wir die notwendigen Daten aus jedem Rezept erfassen.


data_count = []
recipe_data_set = []

def SearchRecipeInfo(url, tag, id_name):
  res = req.urlopen(url)
  soup = BeautifulSoup(res, 'html.parser')

  for all_text in soup.find_all(tag, id= id_name):
    # ID
    for text in all_text.find_all('p', class_= 'rcpId'):
      recipe_id = text.get_text()[7:17]
      
    #Veröffentlichungsdatum
    for text in all_text.find_all('p', class_= 'openDate'):
      recipe_date = text.get_text()[4:14]

    #Es hat sehr gut geschmeckt,Es war einfach,Ich konnte 3 Arten von Briefmarken speichern
    for text in all_text.find_all('div', class_= 'stampHead'):
      for tag in text.find_all('span', class_= 'stampCount'):
        data_count.append(tag.get_text())

    #Ich habe die Anzahl der Berichte gemacht
    for text in all_text.find_all('div', class_= 'recipeRepoBox'):
      for tag in text.find_all('h2'):
        #Wenn die Anzahl der Berichte 0 ist
        if tag.find('span') == None:
          report = str(0)
        else:
          for el in tag.find('span'):
            report = el.replace('\n							', '').replace('Fall', '')

  print("ID: " + recipe_id + ", DATE: " + recipe_date + ",Nummer gemacht: " + report + 
        ",Ich möchte wiederholen: " + data_count[0] +
        ",Es war einfach: " + data_count[1] +
        ",Ich konnte retten: " + data_count[2]+
        ", url: " + url)

  #Speichern, um in eine CSV-Datei zu schreiben
  recipe_data_set.append([recipe_id, recipe_date, data_count[0], data_count[1], data_count[2], report, url])

  #Leeren Sie das Array mit der Anzahl der Stempel
  data_count.clear()

  #Einschränkungen beim Schaben
  time.sleep(1)

Überprüfen Sie hier die erfassten Daten.


for num in range(len(recipe_url_lists)):
  SearchRecipeInfo(recipe_url_lists[num], 'div', 'detailContents')

Wenn Sie es ausführen, können Sie sehen, dass es ordnungsgemäß erfasst wurde. Searching_of_Delicious_Food_ipynb_Colaboratory (1).png

3-3 CSV-Datei an Google Drive ausgeben

Erstellen Sie eine Tabelle in Google Drive und geben Sie die Daten aus

#Hängen Sie das Verzeichnis ein, das Sie verwenden möchten
drive.mount('/content/drive')

Wählen Sie einen beliebigen Ordner in Google Drive aus und geben Sie den Dateinamen an Bitte geben Sie "○○○" an.

#Erstellen Sie einen Ordner auf Google Drive und geben Sie das Speicherziel an
save_dir = "./drive/My Drive/Colab Notebooks/〇〇〇/"
#Wählen Sie einen Dateinamen
data_name = '〇〇〇.csv'
#Speichern Sie die CSV-Datei im Ordner
data_dir = save_dir + data_name

#Element zur CSV-Datei hinzufügen
with open(data_dir, 'w', newline='') as file:
  writer = csv.writer(file, lineterminator='\n')
  writer.writerow(['ID','Release Date','Repeat','Easy','Economy','Report','URL'])

  for num in range(len(recipe_url_lists)):
    writer.writerow(recipe_data_set[num])

#Speichern Sie die erstellte Datei
with open(data_dir, 'r') as file:
  sheet_info = file.read()

Bei der Ausführung wird XX.csv in das angegebene Verzeichnis ausgegeben. Bitte beachten Sie den bisherigen Inhalt in einer einfachen Folie.

2020_05_22_レシピ検索_Google_スライド.png 2020_05_22_レシピ検索_Google_スライド (1).png

3-4 Gewichtung der Rezeptdaten

Überprüfen Sie die von Pandas ausgegebene CSV-Datei.


#Laden Sie csv
rakuten_recipes = pd.read_csv(data_dir, encoding="UTF-8")

#Bereit zum Hinzufügen zur Spalte
df = pd.DataFrame(rakuten_recipes)

df

Das Ausgabebild wird weggelassen.

Berechnen Sie als Nächstes die Anzahl der Tage, die vom Veröffentlichungsdatum des Rezepts bis heute vergangen sind.


# rakuten_recipes.Veröffentlichungsdatum aus csv extrahieren
date = np.array(rakuten_recipes['Release Date'])
#Holen Sie sich das aktuelle Datum
today = datetime.date.today()

#Passen Sie die Form an
df['Release Date'] = pd.to_datetime(df['Release Date'], format='%Y-%m-%d')
today = pd.to_datetime(today, format='%Y-%m-%d')

df['Elapsed Days'] = today - df['Release Date']

#Ich werde nur den Wert der Anzahl der verstrichenen Tage herausnehmen
for num in range(len(df['Elapsed Days'])):
  df['Elapsed Days'][num] = df['Elapsed Days'][num].days

#Überprüfen Sie nur 5 Zeilen von oben
df.head()

Anschließend wird die Anzahl der verstrichenen Tage neben der URL-Spalte angezeigt.

Als nächstes sei die Anzahl der verstrichenen Tage ** Gewicht ** und die drei Arten von Briefmarken gewichtet: Wiederholen, Einfach und Wirtschaftlich. Fügen Sie die gewichteten Daten zur vorhandenen Rezeptspalte hinzu.

2020_05_22_レシピ検索_Google_スライド (2).png


#Behoben, nicht zu klein zu sein
weighting = 1000000

#Extrahieren Sie 3 Arten von Briefmarken und melden Sie Werte
repeat_stamp = np.array(rakuten_recipes['Repeat'])
easy_stamp = np.array(rakuten_recipes['Easy'])
economy_stamp = np.array(rakuten_recipes['Economy'])
report_stamp = np.array(rakuten_recipes['Report'])

#Summe aller Stempel und Berichte
repeat_stamp_sum = sum(repeat_stamp)
easy_stamp_sum = sum(easy_stamp)
economy_stamp_sum = sum(economy_stamp)
report_stamp_sum = sum(report_stamp)

#Eine Spalte mit gewichteten Werten wurde hinzugefügt
'''
Gewichtung wiederholen= (Anzahl der Wiederholungsstempel ÷ Gesamtwiederholung) × (Korrigierter Wert ÷ Anzahl der Tage, die seit dem Veröffentlichungsdatum vergangen sind)
'''
df['Repeat WT'] = (df['Repeat'] / repeat_stamp_sum) * (weighting / df['Elapsed Days'])
df['Easy WT'] = (df['Easy'] / easy_stamp_sum) * (weighting / df['Elapsed Days'])
df['Economy WT'] = (df['Economy'] / economy_stamp_sum) * (weighting / df['Elapsed Days'])

#Wichtigkeit melden (Bereich 0 bis 1)
proportions_rate = 0.5

#Eine Spalte mit gewichteten Werten wurde hinzugefügt
'''
Gewichtung wiederholen= (Gewichtung wiederholen× (1 -Bedeutung)) × ((Anzahl der Berichte ÷ Gesamtzahl der Berichte) ×Bedeutung[%])
'''
df['Repeat WT'] = (df['Repeat WT'] * (1 - proportions_rate)) * ((df['Report'] / report_stamp_sum) * proportions_rate)
df['Easy WT'] = (df['Easy WT'] * (1 - proportions_rate)) * ((df['Easy WT'] / report_stamp_sum) * proportions_rate)
df['Economy WT'] = (df['Economy WT'] * (1 - proportions_rate)) * ((df['Economy WT'] / report_stamp_sum) * proportions_rate)

Über Gewichtung ... Angenommen, es gibt Artikel vor einem Monat und vor einem Jahr, und die gleichen 100 Briefmarken sind beigefügt. Welches für das Rezept mehr empfohlen wird, ist vor einem Monat. Daher ist die Punktzahl für Artikel, die die Anzahl der Tage überschritten haben, niedriger.

Ändern Sie den Bereich der Maximal- und Minimalwerte der gewichteten Werte von 0 auf 1. Ich werde die Seite veröffentlichen, die ich als Referenz verwendet habe.

QUANON: "Konvertieren einer Nummer in einem Bereich in eine Nummer in einem anderen Bereich"


df['Repeat WT'] = (df['Repeat WT'] - np.min(df['Repeat WT'])) / (np.max(df['Repeat WT']) - np.min(df['Repeat WT']))
df['Easy WT'] = (df['Easy WT'] - np.min(df['Easy WT'])) / (np.max(df['Easy WT']) - np.min(df['Easy WT']))
df['Economy WT'] = (df['Economy WT'] - np.min(df['Economy WT'])) / (np.max(df['Economy WT']) - np.min(df['Economy WT']))

df.head()

Dies ist das Ausführungsergebnis. Wenn Sie df.head () ausführen, werden nur die obersten 5 Zeilen angezeigt. Searching_of_Delicious_Food_ipynb_Colaboratory (2).png

3-5. Empfohlene Rezepte anzeigen

Die vom Benutzer geflogene Punktzahl wird auf einer 5-Punkte-Skala ausgewertet und die Suche durchgeführt.


#Wird verwendet, um den Bereich anzugeben (1: 0-0.2, 2: 0.2-0.4, 3: 0.4-0.6, 4: 0.6-0.8, 5: 0.8-1)
condition_num = 0.2

def PlugInScore(repeat, easy, economy):
  #Argument innerhalb des angegebenen Bereichs
  if 1 >= repeat:
    repeat = 1
  if 5 <=repeat:
    repeat = 5
  if 1 >= easy:
    easy = 1
  if 5 <= easy:
    easy = 5
  if 1 >= economy:
    economy = 1
  if 5 <= economy:
    economy = 5

  #Grenzen Sie die Rezepte aus 3 Arten von Partituren ein
  df_result =  df[((repeat*condition_num) - condition_num <= df['Repeat WT']) & (repeat*condition_num >= df['Repeat WT']) &
                  ((easy*condition_num) - condition_num <= df['Easy WT']) & (easy*condition_num >= df['Easy WT']) &
                  ((economy*condition_num) - condition_num <= df['Economy WT']) & (economy*condition_num >= df['Economy WT'])]
  # print(df_result)

  CsvOutput(df_result)

Geben Sie die Suchergebnisse in eine CSV-Datei aus. Bitte geben Sie einen beliebigen Namen für 〇〇〇 ein!


#Wählen Sie einen Dateinamen
data_name = '〇〇〇_result.csv'
#Speichern Sie die CSV-Datei im Ordner
data_dir_result = save_dir + data_name

#Ausgabe csv
def CsvOutput(df_result):
  #Geben Sie das eingegrenzte Ergebnis in eine CSV-Datei aus
  with open(data_dir_result, 'w', newline='') as file:
    writer = csv.writer(file, lineterminator='\n')
    #Titel
    writer.writerow(df_result)
    #Jeder Wert
    for num in range(len(df_result)):
      writer.writerow(df_result.values[num])

  #Speichern Sie die erstellte Datei
  with open(data_dir, 'r') as file:
    sheet_info = file.read()
  
  AdviceRecipe()

Deklariert eine Funktion zur Anzeige des Ergebnisses.


def AdviceRecipe():
  #Laden Sie csv
  rakuten_recipes_result = pd.read_csv(data_dir_result, encoding="UTF-8")

  #Bereit zum Hinzufügen zur Spalte
  df_recipes_res = pd.DataFrame(rakuten_recipes_result)

  print(df_recipes_res)

  print("für dich empfohlen" + food_name + " 」")
  print("Entry No.1: " + df_recipes_res['URL'][random.randint(0, len(df_recipes_res))])
  print("Entry No.2: " + df_recipes_res['URL'][random.randint(0, len(df_recipes_res))])
  print("Entry No.3: " + df_recipes_res['URL'][random.randint(0, len(df_recipes_res))])

Geben Sie abschließend dem Rezept, das Sie erstellen möchten, eine Punktzahl und zeigen Sie die Empfehlungen an.


'''

plug_in_score(repeat, easy, economy)Ersatz
  
  repeat :Willst du es wieder machen?
  easy   :Ist es einfach zu machen?
  economy:Können Sie Geld sparen und es machen?

Bewerten Sie die Subjektivität in 5 Schritten von 1 bis 5 und ersetzen Sie eine Ganzzahl.

1 ist negativ, 5 ist Position

'''

PlugInScore(1,1,1)

3 Arten von Punkten ** 1 **: Willst du es wieder schaffen? ** 1 **: Ist es einfach zu machen? ** 1 **: Können Sie Geld sparen?

Das Ausführungsergebnis ist ... Searching_of_Delicious_Food_ipynb_Colaboratory (3).png

4. Probleme / Probleme

・ Prüfung der Bewertungsmethode Die drei gewichteten Werte werden nach dem höchsten Rezept gezogen, was zu extremen Ergebnissen führt. Daher ist es entweder auf 1 oder 5 vorgespannt.

・ Es sind nur wenige Artikel gestempelt Ungefähr ** 10 **% der Rezepte haben Stempel und Berichte und ungefähr ** 90 **% aller Nullen Daher kann es Unsinn sein, das Rezept nach Punkten zu bewerten. In All 0 sollte es ein großartiges Rezept geben.

5. Überlegung

Ich habe dieses System verwendet, um nach "Schweinefleisch Kimchi" zu suchen und habe versucht, es zu machen. Es war köstlich, weil es ein empfohlenes Rezept war ^^

Es war interessant, weil ich das Rezept entdecken konnte, das begraben wurde.

Vielen Dank an alle, die bisher gelesen haben. Ich wäre Ihnen dankbar, wenn Sie uns Ihre Kommentare und Ratschläge geben könnten ^^

Recommended Posts

[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich möchte viele Prozesse von Python aus starten
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte ein System erstellen, um zu verhindern, dass vergessen wird, den Schlüssel 1 festzuziehen
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Python-Umgebung erstellen
Ich möchte nur ein Signal vom Sub-Thread zum Haupt-Thread senden
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich möchte mit Python ein Fenster erstellen
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte ein Spiel mit Python machen
Ich möchte Ceres Solver aus Python verwenden
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte mit Python in eine Datei schreiben
Ich möchte den Fortschritt in Python anzeigen!
[LINE Messaging API] Ich möchte eine Nachricht vom Programm an alle LINE senden
Ich habe eine Bibliothek zum Betreiben des AWS CloudFormation-Stacks über CUI (Python Fabric) erstellt.
Ich habe ein Tool zum Generieren von Markdown aus der exportierten Scrapbox-JSON-Datei erstellt
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Ich möchte R-Datensatz mit Python verwenden
Ich möchte einen Quantencomputer mit Python betreiben
Ich möchte Leuten sagen, die mit Python direnv aus einem höheren Verzeichnis importieren möchten
Ich möchte einen Screenshot der Site in Docker mit einer beliebigen Schriftart erstellen
Ich habe einen Python-Text gemacht
maya Python Ich möchte die gebackene Animation wieder reparieren.
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
[Python] Ich möchte einen gemeinsamen Satz zwischen numpy erhalten
Ich habe ein Tool erstellt, um eine Wortwolke aus Wikipedia zu erstellen
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich möchte die zulässige Ausfallzeit aus der Betriebsrate berechnen
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich habe Sie dazu gebracht, Befehle über einen WEB-Browser auszuführen
Ich möchte vorerst eine Docker-Datei erstellen.
Extrahieren Sie den Wert, der einem Wert am nächsten kommt, aus einem Listenelement in Python
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen