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()
Mein Firefox zeigt mir gelegentlich keine Preise in den Bestandslisten an. Nach Löschen von Cookies- und Website-Daten geht es dann wieder.