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 **!
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.
Wir hoffen, dass dies für diejenigen nützlich ist, die Daten für maschinelles Lernen mithilfe der Daten im Web ** erhalten möchten.
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"
Dieser Artikel zeigt Ihnen, wie man kratzt, aber ** wir übernehmen keine Verantwortung **.
Denken Sie selbst und verwenden Sie es mit der richtigen Ethik.
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.
Wenn Sie kein Google-Konto für die Verwendung von Google Colaboratory erstellt haben, erstellen Sie eines.
So erstellen Sie ein neues Notizbuch ...
Von hier aus werde ich den Inhalt der Implementierung schreiben.
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'
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.
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.
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.
Ü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.
#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.
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 ...
・ 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.
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 ^^