InhaltsverzeichnisReicheltwarenkorb zu WikiUm 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
SteuerungDas Script wird über die Variablen im oberen Teil gesteuert.
BenutzungScript 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
Wiki zu ReicheltwarenkorbVoraussetzung
SteuerungDas Script nimmt als Argument die URL zur Sammelbestellung hier im Wiki. BenutzungScript 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:
Vergl. z.B. 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") |