|
![]() |
||
|
![]() |
|
Themen-Optionen | Thema durchsuchen |
|
|||
![]()
Habe mir ein Script gebastelt, was von einer Verkaufs- oder Verschenke-Anzeige bei ebay-kleinanzeigen die Bilder runterlädt (als 1.jpg 2.jpg usw.) und die Infos der Anzeige wie Preis und Beschreibung in eine Text-Datei schreibt,
die dann z.B. so aussieht: Zitat:
Umlaute und Euro-Zeichen sind falsch und muss man sich denken. Man benötigt die Pakete/Programme wget und html2text. Hier das Script: Zitat:
Aufruf: ./eka-dl.sh <URL zur Anzeige> z.B.: ./eka-dl.sh https://www.ebay-kleinanzeigen.de/s-...92151-217-4832 Im Verzeichnis sind danach die Bilder und eine info.txt mit den Infos. Geändert von ghor (01.08.2020 um 12:58 Uhr) |
|
|||
![]()
Mit dem Umlauten etc. klappt es auch, wenn man die Zeile mit html2text ändert in:
Code:
html2text -ascii test.html > test.txt Code:
grep -A 100 "^\*\*\*\*\* Be" test.txt |grep -B 100 "^\*.* Nach" >> info.txt |
|
|||
![]()
Und hier mit Python3:
Code:
#!/usr/bin/env python3 import mechanicalsoup import requests import sys import os filelist = [ f for f in os.listdir(".") if f.endswith(".jpg") ] for f in filelist: os.remove(os.path.join(".", f)) browser = mechanicalsoup.Browser(soup_config={'features': 'lxml'},user_agent='MyBot/0.1: mysite.example.com/bot_info') if len(sys.argv) < 2: print("Parameter fehlt!") exit(1) url = sys.argv[1] page = browser.get(url) if len(page.soup.find_all("div",class_="outcomemessage-warning")) > 0: print("Problem mit Anzeige") exit(1) print("----------------------------------------------------") print("Titel:") print(page.soup.find(property="og:title").attrs['content']) print("----------------------------------------------------") print("Preis:") a = page.soup.find(id="viewad-price") if a == None: print("Kein Preis") else: print(a.text.strip()) print("----------------------------------------------------") print("Bilder:") i=1 for x in page.soup.find_all(id="viewad-image"): print(x.attrs['src']) lnk=x.attrs['src'] with open(str(i)+".jpg","wb") as f: f.write(requests.get(lnk).content) i=i+1 print("----------------------------------------------------") print("Kategorie:") for x in page.soup.find_all(itemprop="title"): print(x.text.strip()) print("----------------------------------------------------") print("Text:") s="" for x in page.soup.find(itemprop="description").contents: if isinstance(x, str): s+=x.strip() else: s+="\n" print(s) print("----------------------------------------------------") print("Details:") for x in page.soup.find_all("span",class_="addetailslist--detail--value"): print(x.text.strip()) print("----------------------------------------------------") Infos werden nicht in Datei geschrieben, nur ausgegeben. |
|
|||
![]()
Danke kann ich demnächst gut gebrauchen. Die Bilder die ich von einem Kleinanzeigen Angebot gespeichert hatte, haben mir bei einer Anzeige wegen einem geklauten Fahrrad mal die Hose gerettet. Mit Artikelbeschreibung hier noch besser.
|
|
|||
![]()
Freut mich, wenn es nützlich ist.
![]() Bin noch Anfänger mit Mechanicalsoup, daher kann man da bestimmt auch einiges verbessern. Wenn ich eine meiner EKA Anzeigen (z.B. auf anderer Plattform) neu aufgeben will, musste ich u.a. erst händisch im Browser die Bilder speichern (und den Rest). Daher wollte ich das automatisieren. Bei Github gibt es auch eine beachtliche Menge "Zeugs" zu ebay-Kleinanzeigen: https://github.com/search?q=ebay+kleinanzeigen z.B.: https://github.com/davidgengenbach/e...zeigen-crawler https://github.com/tschuehly/flathunter |
|
|||
![]()
Manchmal bekomme ich beim Testen mit meinem / den python-Scripten den Status Code 403 (oder so), also keine richtige Anzeige geliefert.
Gewisse Zeit später geht es dann wieder. Konnte noch nicht feststellen, woran das liegt, scheinbar lässt EKA manchmal scriptbasierte Anfragen nicht zu. Um sowas zu sehen, muss man sich den Quelltext der empfangenen Daten anzeigen lassen. Dazu am besten nach dem letzten exit(1) einfügen: Code:
print(page.soup.prettify()) Code:
if len(page.soup.find_all("div",class_="outcomemessage-warning")) > 0: print("Problem mit Anzeige") exit(1) print(page.soup.prettify()) print("----------------------------------------------------") |
|
|||
![]()
Habe das Script ausgehend vom ebay-kleinanzeigen-crawler bei github erweitert.
Es geht jetzt alle Anzeigen eines Users durch (z.B. https://www.ebay-kleinanzeigen.de/s-....html?userId=1) und speichert die Infos der gefundenen Anzeigen in der Datei result.txt. Die Bilder der gefundenen Anzeigen werden gespeichert als <Anzeigennr>-1.jpg, ...-2.jpg usw. Die Infos werden auch am Bildschirm angezeigt. Die gewünschten Anzeigen können eingeschränkt werden über die Parameter "--minpreis", "--maxpreis" und "--suchstr". Beispiele: - alle Anzeigen ohne Preis (z.B. "zu verschenken" oder nur "VB" als Preis) von User 1: ./eka_dl.py --minpreis 0 --maxpreis 0 --url https://www.ebay-kleinanzeigen.de/s-....html?userId=1 - alle Anzeigen mit Preis zwischen 0 und 10 von User 1, die "telefon" im Titel enthalten: ./eka_dl.py --url https://www.ebay-kleinanzeigen.de/s-....html?userId=1 --minpreis 0 --maxpreis 10 --suchstr telefon Nach Bearbeiten einer Anzeige wird 3 Sekunden gewartet, um zu vermeiden, dass ebay-kleinanzeigen keine Anzeigen mehr liefert. Passiert das, wird Script beendet mit der Meldung "Problem mit EKA". Wie zuvor, werden vorher vom Script alle jpg-Dateien im Verzeichnis gelöscht. Das folgende Script z.B. als eka_dl.py in einem leeren Verzeichnis speichern und ausführbar machen: Code:
#!/usr/bin/env python3 import mechanicalsoup import time import requests import os import html def main(): filelist = [ f for f in os.listdir(".") if f.endswith(".jpg") ] for f in filelist: os.remove(os.path.join(".", f)) if os.path.exists("./result.txt"): os.remove(os.path.join(".", "result.txt")) args = get_args() browser = mechanicalsoup.Browser(soup_config={'features': 'lxml'},user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36') url = args.url myprint("URL: " + url) urls = [] get_results(browser, url, urls, args.maxpreis, args.minpreis, args.suchstr) for x in urls: ekainfo(browser, x) time.sleep(3) def get_args(): import argparse parser = argparse.ArgumentParser(description='Crawl ebay kleinanzeigen', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--url', default='https://www.ebay-kleinanzeigen.de/s-bestandsliste.html?userId=1', help='The start url') parser.add_argument('--maxpreis', default=0, type=int, help='Maximaler Preis der Anzeigen') parser.add_argument('--minpreis', default=0, type=int, help='Minimaler Preis der Anzeigen') parser.add_argument('--suchstr', default='', help='Teilbegriff der gesuchten Anzeige') args = parser.parse_args() return args def get_results(browser, url, urls, maxpreis, minpreis, suchstr): page = browser.get(url) if not "200" in str(page): myprint("Problem mit EKA") exit(1) myprint("Maximaler Preis : ",maxpreis) myprint("Minimaler Preis : ",minpreis) myprint("Suchbegriff : ",suchstr) z = page.soup.select("span b",class_="iconlist-text")[2].text.split("/")[0] myprint("Anzahl aktive Anzeigen: ",z) akt = page.soup.find("span",class_="pagination-current") nakt = 0 if not akt == None: nakt = int(akt.text.strip()) seiten = [] if nakt == 1: for x in page.soup.find_all("a",class_="pagination-page"): purl = "https://www.ebay-kleinanzeigen.de" + x.attrs['href'] seiten.append(purl) holartikel(page, urls, maxpreis, minpreis, suchstr) for url in seiten: page = browser.get(url) if not "200" in str(page): myprint("Problem mit EKA") exit(1) else: holartikel(page, urls, maxpreis, minpreis, suchstr) myprint("Anzahl gefundene Anz. : ",len(urls)) def ekainfo(browser, url): id = url.split("/")[len(url.split("/"))-1] id = id.split("-")[0] page = browser.get(url) if not "200" in str(page): myprint("Problem mit EKA") exit(1) if len(page.soup.find_all("div",class_="outcomemessage-warning")) > 0: myprint("Problem mit Anzeige") exit(1) myprint("***************************************************************************************************************") myprint("Anzeigennr.: ",id) myprint("----------------------------------------------------") myprint("Titel:") t = page.soup.find(property="og:title").attrs['content'] myprint(html.unescape(t)) myprint("----------------------------------------------------") myprint("Preis:") a = page.soup.find(id="viewad-price") if a == None: myprint("Kein Preis") else: myprint(a.text.strip()) myprint("----------------------------------------------------") myprint("Bilder:") i=1 for x in page.soup.find_all(id="viewad-image"): lnk = x.attrs['src'] with open(id+"-"+str(i)+".jpg","wb") as f: f.write(requests.get(lnk).content) i=i+1 myprint(i-1) myprint("----------------------------------------------------") myprint("Kategorie:") for x in page.soup.find_all(itemprop="title"): myprint(x.text.strip()) myprint("----------------------------------------------------") myprint("Text:") s="" for x in page.soup.find(itemprop="description").contents: if isinstance(x, str): s+=x.strip() else: s+="\n" myprint(s) myprint("----------------------------------------------------") myprint("Details:") for x in page.soup.find_all("span",class_="addetailslist--detail--value"): myprint(x.text.strip()) def holartikel(page, urls, maxpreis, minpreis, suchstr): for el in page.soup.select('article.aditem'): aurl = "https://www.ebay-kleinanzeigen.de" + el.select('.text-module-begin a')[0].attrs['href'] addetails = el.select('.aditem-details')[0] a = addetails.select('strong') npreis = 0 preis = "Kein Preis" if len(a) > 0: x = addetails.select('strong')[0].text.strip() if len(x) > 0: preis = addetails.select('strong')[0].text.strip() if preis[0].isdigit(): npreis = int(preis.split()[0]) if npreis <= maxpreis and npreis >= minpreis: if suchstr.upper() in el.select('.text-module-begin a')[0].text.strip().upper(): urls.append(aurl) def myprint(txt1,txt2=""): f = open("result.txt","a") f.write(str(txt1) + str(txt2) + "\n") print(txt1,txt2) if __name__ == '__main__': main() Geändert von ghor (09.08.2020 um 10:28 Uhr) |
Anzeige |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | Thema durchsuchen |
|
|
![]() |
||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
auch die lokalen Anzeigenblätter + webAnzeigen schmerzen => KleinAnzeigen.ebay.de | 1cm.de | Newskommentare | 0 | 18.09.2009 14:31 |
verkaufs formular | Mib2001 | Sonstiges | 1 | 06.01.2003 17:30 |
Script für Kleinanzeigen gesucht | Athlon | Sonstiges | 3 | 05.09.2001 07:34 |
Frage an die Kreativen: Wie verschenke ich am besten eine URL? | Ehemalige Benutzer | Small Talk | 11 | 01.05.2001 20:12 |