====== Reicheltwarenkorb zu Wiki ====== Um nicht den kompletten Warenkorb von Reichelt per C&P in eine Sammelbestellung übertragen zu müssen hier ein kleines Pythonscript welches den entsprechenden Wikieintrag in der Konsole oder einer Datei ausgibt. ===== Voraussetzung ===== *Selenium [[https://pypi.python.org/pypi/selenium/2.43.0]] *lxml [[https://pypi.python.org/pypi/lxml/3.4.0]] *Firefox (Müsste sich aber relativ einfach(tm) an andere Browser anpassen lassen.) ===== Steuerung ===== Das Script wird über die Variablen im oberen Teil gesteuert. ^ Variable ^ Funktion ^ |outfile | Ausgabedatei, leer für keine Ausgabe in Datei)| |profil | Kompletter Pfad zu demm Firefoxprofil mit dem der Warenkorb angelegt wurde. Wichtig! Cookies und so.| |username | Name der in der Sammelbestellung erscheinen soll| |quiet | Aktiviert/Deaktiviert Konsolenausgabe (True/False)| |new | Aktiviert/Deaktiviert das Anlegen der Kopfzeile einer Sammelbestellung (True/False)| ===== Benutzung ===== Script kopieren, Variablen anpassen, ausführen. Der Firefoxbrowser öffnet sich, navigiert automatisch in den Warenkorb und schließt sich automatisch. Je nach den gewählten Einstellungen erfolgt die Ausgabe in die Konsole bzw. in eine Datei. ===== Code ===== #!/usr/bin/env python # -*- coding: utf-8 -*- ######################################################################## outfile = "/home/foo/bar.txt" profil = "/home/foo/.mozilla/firefox/foo/" username = "foo" quiet = True new = True ######################################################################## url = "http://reichelt.de" from selenium.webdriver import Firefox # pip install selenium from selenium.webdriver.support.ui import WebDriverWait from selenium import webdriver from lxml import html import requests import codecs """Profile setzen""" fp = webdriver.FirefoxProfile(profil) browser = webdriver.Firefox(fp) """Warenkorb runterladen und in page_source speichern""" browser.get(url) button = browser.find_element_by_id('basketamount') button.click() page_source = browser.page_source browser.close() """Parsen und Aufräumen""" tree = html.fromstring(page_source) artno = tree.xpath('//a[@xmlns=""]/text()') artno = [x for x in artno if not x.startswith('\n')] besch = tree.xpath('//li[@class="al_gall_liste_article_besch"]/text()') anz = tree.xpath('//input[@type="text"]/@value') while True: try: anz.remove("") except ValueError: break epreis = tree.xpath('//span[@itemprop="price"]/text()') summe = tree.xpath('//li[@class="PriceSum"]/text()') """Liste erstellen""" def output(quiet,pfad,new): if pfad: f = codecs.open(pfad, "wb",encoding='utf-8') if new: f.write('^Wer^Stk^Artikelnummer^Beschreibung^Einzelpreis^Gesamt^Bemerkung^\n') for i in range(0,len(artno)): f.write('|'+username+'|') f.write(anz[i]) f.write('|') f.write(artno[i]) f.write('|') f.write(besch[i]) f.write('|') f.write(epreis[i]) f.write('|') f.write(summe[i]) f.write('|') f.write(' ') f.write('|') f.write('\n') f.close() if quiet == False: if new: print '^Wer^Stück^Artikelnummer^Beschreibung^Einzelpreis^Gesamt^Bemerkung^' for i in range(0,len(artno)): print '|'+username+'|', print anz[i], print '|', print artno[i], print '|', print besch[i], print '|', print epreis[i], print '|', print summe[i], print '|', print ' ', print '|', print '\n', output(quiet,outfile,new) ===== Bugs ===== Öffnet sich beim Start von Firefox automatisch ein neuer Tab (durch die Aktualisierung von Plugins z.B. Ghostery) kann es passieren, dass der "Reichelttab" nicht richtig geöffnet wird. Fenster schließen, noch mal probieren. ===== Todo ===== * Steuerung über Argumente * Code aufräumen ====== Wiki zu Reicheltwarenkorb ====== ===== Voraussetzung ===== *Selenium [[https://pypi.python.org/pypi/selenium/2.43.0]] *lxml [[https://pypi.python.org/pypi/lxml/3.4.0]] *Firefox (Müsste sich aber relativ einfach(tm) an andere Browser anpassen lassen.) ===== Steuerung ===== Das Script nimmt als Argument die URL zur Sammelbestellung hier im Wiki. ===== Benutzung ===== Script kopieren und ausführen. Der Firefoxbrowser öffnet sich, navigiert automatisch zur URL die als 1. Argument übergeben wurde (dies sollte ein Sammelbestellung im Wiki sein!) Danach navigiert der Browser automatisch zu Reichelt und legt alle Artikel in den Warenkorb ===== !Wichtig! ===== Das Script funktioniert nur wenn eine Tabelle für die Sammelbestellung verwendet wurde. Die Tabelle muss so aufgebaut sein: ^1 Spalte ^ Stück ^ Artikelnummer ^Beliebig viele weitere Spalten^ Vergl. z.B. [[projekte:sammelbestellungen:reichelt_20150114]] ===== Code ===== #!/usr/bin/env python # -*- coding: utf-8 -*- from selenium.webdriver import Firefox # pip install selenium from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver from lxml import html from os import sys url="https://www.reichelt.de/" wiki=sys.argv[1] browser = webdriver.Firefox() """Wiki Seite öffnen, Tabelle parsen""" browser.get(wiki) page_source = browser.page_source tree = html.fromstring(page_source) artno = tree.xpath('//td[@class="col2 leftalign"]/text()') artno = [x.strip() for x in artno] menge = tree.xpath('//td[@class="col1 leftalign"]/text()') menge = [x.strip() for x in menge] """Reichelt Warenkorb öffnen, Eingabe finden""" browser.get(url) button = browser.find_element_by_id('basketamount') button.click() field_artnr = browser.find_element_by_id("DirectInput_1") field_menge = browser.find_element_by_id("DirectInput_1_count") for i in range(0,len(artno)): field_artnr.send_keys(''.join(artno[i])) field_menge.send_keys(''.join(menge[i]),Keys.ENTER) field_artnr = browser.find_element_by_id("DirectInput_1") field_menge = browser.find_element_by_id("DirectInput_1_count")