Inverse-Rezeptsuche/mine.py

139 lines
4.7 KiB
Python
Raw Normal View History

2020-04-09 12:26:24 +00:00
# -*- coding: utf-8 -*-
2020-04-03 17:29:15 +00:00
from urllib.parse import urljoin
from lxml import html
import requests
import json
from time import sleep
import random
2020-04-09 12:26:24 +00:00
import traceback
2020-04-10 14:14:34 +00:00
import cv2
import base64
from application.db import Session, Recipe, Ingredient, Link
2020-04-03 17:29:15 +00:00
2020-04-05 12:05:45 +00:00
header_values = {
'name': 'Michael Foord',
'location': 'Northampton',
'language': 'English',
'User-Agent': 'Mozilla 4/0',
'Accept-Encoding': 'gzip',
'Accept-Language': 'en-US,en;q=0.9,es;q=0.8',
'Upgrade-Insecure-Requests': '0',
'Referrer': 'https://www.google.com/'
}
2020-04-03 17:29:15 +00:00
def getLinks():
links = []
with requests.Session() as session:
root = "https://www.chefkoch.de/rs/s0/Rezepte.html"
site = session.get(root, headers=header_values)
tree = html.fromstring(site.content)
# converts: 344.621 Ergebnisse to int(344621)
2020-04-05 12:05:45 +00:00
#max = int(tree.xpath(
# '/html/body/main/div[1]/h1/span/text()')[0].split(" ")[0].replace(".", ""))
max = 2000 # get 2000 recepies :)
2020-04-03 17:29:15 +00:00
for i in range(0, max, 30):
try:
root = "https://www.chefkoch.de/rs/s" + \
str(i) + "/Rezepte.html"
site = session.get(root, headers=header_values)
tree = html.fromstring(site.content)
# converts: 344.621 Ergebnisse to int(344621)
max = int(tree.xpath(
'/html/body/main/div[1]/h1/span/text()')[0].split(" ")[0].replace(".", ""))
# only add new links
for x in tree.xpath('/html/body/main/article/a/@href'):
if x not in links:
links.append(x)
print(i)
except Exception as e:
# retry after 3 seconds
print(e)
i -= 30
sleep(10)
sleep(random.randint(0, 5))
print(links)
return links
2020-04-05 12:05:45 +00:00
def getRecipe(links):
recs = dict()
with requests.Session() as session:
2020-04-09 12:26:24 +00:00
counter = 0
2020-04-10 14:14:34 +00:00
for link in links:
2020-04-09 12:26:24 +00:00
counter += 1
2020-04-05 12:05:45 +00:00
try:
site = session.get(link, headers=header_values)
tree = html.fromstring(site.content)
namePath = "/html/body/main/article[1]/div/div[2]/h1/text()"
ingredPath = "/html/body/main/article[2]/table/tbody/tr/td" # TODO: fix this
2020-04-05 12:05:45 +00:00
recipPath = "/html/body/main/article[3]/div[1]/text()"
2020-04-10 14:14:34 +00:00
imgPath = './data/images.jpeg'
2020-04-05 12:05:45 +00:00
name = tree.xpath(namePath)[0]
ingred = tree.xpath(ingredPath)
resip = tree.xpath(recipPath)
2020-04-10 14:14:34 +00:00
image = cv2.imread(imgPath)
ret, jpeg = cv2.imencode(".jpeg", image)
img = base64.b64encode(jpeg)
2020-04-05 12:05:45 +00:00
resString = ""
for x in resip:
2020-04-10 14:14:34 +00:00
resString += x
2020-04-05 12:05:45 +00:00
2020-04-10 14:14:34 +00:00
dbSession = Session()
r = Recipe(name=name, instructions=resString, url=link, img=img)
ingredDict = {}
2020-04-05 12:05:45 +00:00
for i in range(0, len(ingred)-1, 2):
#print(ingred[i+1][0].text)
2020-04-09 12:26:24 +00:00
if ingred[i+1][0] is not None:
if ingred[i+1][0].text is None:
2020-04-09 12:26:24 +00:00
textFromLink = ingred[i+1][0][0].text.strip().replace(" ", "")
#print(textFromLink)
stuff = textFromLink
else:
stuff = ingred[i+1][0].text.strip().replace(" ", "")
2020-04-09 12:26:24 +00:00
if ingred[i] is not None:
try:
amount = ingred[i][0].text.strip().replace(" ", "")
2020-04-09 12:26:24 +00:00
except:
amount = ""
#print(stuff, amount)
2020-04-10 14:14:34 +00:00
a = Link(ingredient_amount=amount)
a.ingredient = Ingredient(name=stuff)
r.ingredient.append(a)
dbSession.add(r)
dbSession.commit()
ingredDict[stuff] = amount
2020-04-10 14:14:34 +00:00
recs[name] = [resString, ingredDict, link, img.decode("utf-8")]
2020-04-05 12:05:45 +00:00
print("")
except Exception as e:
2020-04-09 12:26:24 +00:00
print(traceback.format_exc())
2020-04-10 14:14:34 +00:00
print(format(counter/len(links), '.2f'), link)
2020-04-05 12:05:45 +00:00
sleep(random.randint(0, 5))
return recs
2020-04-05 12:05:45 +00:00
#links = getLinks()
#with open('./data/links.json', 'w') as file:
# jsonString = json.dumps(links)
# file.write(jsonString)
links = ""
2020-04-05 12:05:45 +00:00
with open('./data/links.json') as file:
links = json.load(file)
2020-04-03 17:29:15 +00:00
recs = getRecipe(links)
2020-04-09 12:26:24 +00:00
with open('./data/recs.json', 'w', encoding="utf-8") as file:
json.dump(recs, file, ensure_ascii=False)