Einzelnen Beitrag anzeigen
  #7  (Permalink
Alt 09.08.2020, 10:23
ghor ghor ist offline
Senior Mitglied
 
Registriert seit: 30.10.2006
Beiträge: 643
Provider: 1&1
Standard AW: Script für Verkaufs- und Verschenke-Anzeigen auf ebay-Kleinanzeigen

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.

Geändert von ghor (09.08.2020 um 10:28 Uhr)
Mit Zitat antworten