#!/usr/bin/env python3 """ usage: arafetch [options] Options: --db FILE path to db [Default: db.json] --cantine NAME name of the cantine (matches mein.aramark.de/NAME/) [Default: thales-deutschland] """ import sys from docopt import docopt import requests from bs4 import BeautifulSoup import logging import json from datetime import datetime logging.basicConfig(level=logging.DEBUG) log = logging.getLogger() from itertools import tee cantinedb = { 'thales-deutschland': 'aramark_menu2-2', 'buerocampus-wangen': 'aramark_menu2-3', 'ibm-boeblingen': 'aramark_menu2-3', 'metabo-nuertingen': 'aramark_menu2-3', 'vodafone-campus': 'aramark_menu2-2', 'continental-villingen': 'aramark_menu2-3' } def get_data(cantine): headers = { 'User-Agent': 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0', 'Referer': f'http://mein.aramark.de/{cantine}/menuplan/', 'X-Requested-With': 'XMLHttpRequest', 'Cache-Control': 'max-age=0' } data = { 'action': 'aramark_menu2_content', 'id': cantinedb[cantine] } ret = requests.post(f'https://mein.aramark.de/{cantine}/wp-admin/admin-ajax.php',data=data) if ret.status_code != 200: log.error(ret) raise ValueError('Return code is not 200') return ret.content.decode() def get_data_test(): return open("./test.html").read() def get_things(row): for item in row.select('.aramark_menu2-counter'): try: thing = { "allergies": {}, "additives": {}, "type" : item.select_one('.aramark_menu2-countertitletop').find(text=True), "description" : item.select_one('.aramark_menu2-menutext > p').find(text=True), } try: price = float(item.select_one('.aramark_menu2-menuprice > .aramark_menu2-menuprice').find(text=True).replace(',','.').replace('EUR','').strip()) except: price = float(thing['description']) thing['price'] = price try: thing['title'] = item.select_one('.aramark_menu2-countermenu h4').find(text=True) except: thing['title'] = thing['type'] entries = item.select('.aramark_menu2-menuinfoallergenes li span') for i in range(0,len(entries),2): thing['allergies'] = { entries[i].find(text=True): entries[i+1].find(text=True) } additives = { } entries = item.select('.aramark_menu2-menuinfoadditives li span') for i in range(0,len(entries),2): thing['additives'] = { entries[i].find(text=True): entries[i+1].find(text=True) } yield thing except Exception as e: log.error(f"problem with {e}") log.debug(item.prettify()) def main(): args = docopt(__doc__) dbname = args['--db'] cantine = args['--cantine'] try: with open(dbname,'r+') as f: db = json.load(f) except: log.info('creating new db') db = {} updated = datetime.now().isoformat().split('T')[0] soup = BeautifulSoup(get_data(cantine), 'html.parser') # soup = BeautifulSoup(get_data_test(), 'html.parser') for row in soup.select('.aramark_menu2-menus > div'): day = row.get('data-aramark_menu2-day') things = list(get_things(row)) db[day] = things log.info(f'writing db {dbname}') with sys.stdout if dbname == '-' else open(dbname,'w+') as f: json.dump(db,f,indent=2,sort_keys=True) if __name__ == '__main__': main()