#1  (Permalink
Alt 01.08.2020, 12:44
ghor ghor ist offline
Senior Mitglied
 
Registriert seit: 30.10.2006
Beiträge: 556
Provider: 1&1
Beitrag Script für Verkaufs- und Verschenke-Anzeigen auf ebay-Kleinanzeigen

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:
Kategorie:
Kleinanzeigen_Marburg Auto,_Rad_&_Boot Fahrräder_&_Zubehör
-----------------------------------
Titel:
****** Fahrrad 28 Zoll ******
-----------------------------------
Preis:
***** 35 â<U+0082>¬ *****
-----------------------------------
Art:
* Art Damen
Text:
***** Beschreibung *****
Hallo
Verkaufe ein Fahrrad
Alles funktioniert einwandfrei
Sofort fahrbereit

35â<U+0082>¬ VB

***** Nachricht schreiben *****
-----------------------------------
Bilder: 3

Vielleicht hat ja jemand Verwendung dafür? Ist nichts dolles, nicht perfekt und kann man bestimmt noch besser machen, erfüllt aber seinen Zweck.

Umlaute und Euro-Zeichen sind falsch und muss man sich denken. Man benötigt die Pakete/Programme wget und html2text.


Hier das Script:

Zitat:
#!/bin/bash

rm *.jpg 2>/dev/null

wget -q -O test.html $1

html2text test.html > test.txt
echo "Kategorie: " > info.txt
grep "^Kleinanzeigen" test.txt >> info.txt
echo "-----------------------------------" >> info.txt
echo "Titel: " >> info.txt
grep "^\*\*\*\*\*\*" test.txt >> info.txt
echo "-----------------------------------" >> info.txt
echo "Preis: " >> info.txt
grep "^\*\*\*\*\* " test.txt | head -1 >> info.txt
echo "-----------------------------------" >> info.txt
echo "Art: " >> info.txt
grep " * Art " test.txt >> info.txt
echo "Text: " >> info.txt
grep -A 22 "^\*\*\*\*\* Be" test.txt |grep -B 100 "^\*.* Nach" >> info.txt

a=`cat test.html | grep "url.*_59" | cut -d"'" -f2`
n=1
for i in $a; do
wget -q -O $n.jpg $i
n=`expr $n + 1`
done

n=`expr $n - 1`
echo "-----------------------------------" >> info.txt
echo "Bilder: $n" >> info.txt

rm test.html test.txt

Ein Verzeichnis anlegen und reinwechseln. Dort das Script speichern z.B. als eka-dl.sh und ausführbar machen (chmod u+x eka-dl.sh)
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 Zitat antworten
  #2  (Permalink
Alt 01.08.2020, 14:28
ghor ghor ist offline
Senior Mitglied
 
Registriert seit: 30.10.2006
Beiträge: 556
Provider: 1&1
Standard AW: Script für Verkaufs- und Verschenke-Anzeigen auf ebay-Kleinanzeigen

Mit dem Umlauten etc. klappt es auch, wenn man die Zeile mit html2text ändert in:
Code:
html2text -ascii test.html > test.txt
Und die mit "grep -A" besser ändern in:
Code:
grep -A 100 "^\*\*\*\*\* Be" test.txt |grep -B 100 "^\*.* Nach" >> info.txt
Mit Zitat antworten
  #3  (Permalink
Alt 03.08.2020, 10:18
ghor ghor ist offline
Senior Mitglied
 
Registriert seit: 30.10.2006
Beiträge: 556
Provider: 1&1
Standard AW: Script für Verkaufs- und Verschenke-Anzeigen auf ebay-Kleinanzeigen

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("----------------------------------------------------")
Man braucht MechanicalSoup: https://mechanicalsoup.readthedocs.i...l#installation
Infos werden nicht in Datei geschrieben, nur ausgegeben.
Mit Zitat antworten
  #4  (Permalink
Alt 06.08.2020, 20:49
Pornstar Pornstar ist offline
Senior Mitglied
 
Registriert seit: 21.04.2017
Ort: 192.26
Beiträge: 2.810
Standard AW: Script für Verkaufs- und Verschenke-Anzeigen auf ebay-Kleinanzeigen

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.
Mit Zitat antworten
  #5  (Permalink
Alt 07.08.2020, 08:51
ghor ghor ist offline
Senior Mitglied
 
Registriert seit: 30.10.2006
Beiträge: 556
Provider: 1&1
Standard AW: Script für Verkaufs- und Verschenke-Anzeigen auf ebay-Kleinanzeigen

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
Mit Zitat antworten
  #6  (Permalink
Alt 07.08.2020, 10:02
ghor ghor ist offline
Senior Mitglied
 
Registriert seit: 30.10.2006
Beiträge: 556
Provider: 1&1
Standard AW: Script für Verkaufs- und Verschenke-Anzeigen auf ebay-Kleinanzeigen

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())
Also so:
Code:
if len(page.soup.find_all("div",class_="outcomemessage-warning")) > 0:
    print("Problem mit Anzeige")
    exit(1)

print(page.soup.prettify())

print("----------------------------------------------------")
Mit Zitat antworten
  #7  (Permalink
Alt 09.08.2020, 10:23
ghor ghor ist offline
Senior Mitglied
 
Registriert seit: 30.10.2006
Beiträge: 556
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
 
Anzeige
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
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


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:06 Uhr.


Basiert auf vBulletin®
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.