ebay webscraping

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
blubb1810
User
Beiträge: 4
Registriert: Freitag 23. April 2021, 20:00

Hallo erstmal zu meiner Idee. Ich hätte gerne ein Programm, dass bei eBay direkt den Durchschnittspreis der letzten 5 verkauften Produkte berechnet. Außerdem soll es mir noch anzeigen vor wie vielen Tagen das 5. der fünf letzten Produkte verkauft wurde. Hintergrund ist ,dass ich gerne abschätzen würde für wie viel ich etwas verkaufen kann und wie oft dieses Produkt verkauft wird. Normalerweise mache ich dies mit der Filter Funktion "bereits verkauft" und schaue dann manuell nach den beiden Faktoren. Ich habe mich mittlerweile informiert und bin auf das Web scraping gekommen. Ich habe mir dazu diverse Video angeschaut und auch schon einiges ausprobiert.
ich kenne mich dennoch nur so bedingt mit Python aus. Habt ihr deshalb irgendwelche Buch Empfehlungen o.ä.?

Mein bisheriger Code(funktioniert leider nicht):

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup

page = requests.get('https://www.ebay.de/sch/i.html?_from=R40&_nkw=mario+kart+ds&_sacat=0&LH_TitleDesc=0&rt=nc&LH_Sold=1&LH_Complete=1')
soup = BeautifulSoup(page.content, 'html.parser')
game = soup.find_all(class_='s-item__info clearfix')
geld = game.find_all(class_='s-item__price')
print(geld)

Wenn jemand lust hätte mir zu helfen mein Ziel umzusetzen würde ich mich sehr Freuen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Macht idealo das nicht schon für dich?
blubb1810
User
Beiträge: 4
Registriert: Freitag 23. April 2021, 20:00

__deets__ hat geschrieben: Freitag 23. April 2021, 21:30 Macht idealo das nicht schon für dich?
Kann man dort auch nach verkauften Artikeln filtern? Aber nichts desto trotz ist es mein Ziel das selber umsetzten zu können. Bei einigen Tutorials wurden auch verschiedene Daten ausgelesen und das häufig mit sehr wenig Code. Aufgrund dessen dachte ich, dass das eigentlich recht einfach zu übertragen wäre. Nur Leider war mir das bisher nicht möglich. Ein weiteres Problem bei meinem Code ist, dass er manchmal funktioniert und manchmal nicht. Teilweise wird sehr viel ausgegeben und teilweise kommt einfach "[]".
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@blubb1810: Ich habe mir mal den Beispiel-Link angeschaut und zweifele ein bisschen, dass das so funktioniert. Da sind die ersten 5 Preise (ohne Versand) gerade:

3,44
895,00
12,99
14,00
15,50

Was einen Durchsnittswert von 188,19 ergibt. Und für den Median sind 5 Werte wohl ein bisschen wenig.

Standardmässig scheinen da 50 Ergebnisse auf einer Ergebnisseite zu kommen, die könnte man wenn man sie sowieso schon geliefert bekommt, auch verwenden. Allerdings wird man dann wohl früher oder später auf das Problem treffen, dass irgendwann Suchtreffer kommen, die sich immer weiter von dem wonach man sucht, entfernen.

Bücher sind mir persönlich bei den meisten Programmiersprachen zu schnell veraltet. In der Python-Dokumentation gibt es ein Grundlagentutorial das parallel zur Sprache aktuell gehalten wird. Das sollte man mal durchgearbeitet haben, unabhängig davon was man sonst noch so an Lernmaterial verwendet.

Für das Thema Deines Projekts müsste man noch wissen wie HTTP funktioniert, und HTML und CSS, und eventuell auch ein bisschen JavaScript, wenn die zu scrapende Seite(n) dynamisch Inhalte nachladen und/oder generieren. Eine IMHO ganz brauchbare Quelle für diese ganzen Themen ist https://developer.mozilla.org/en-US/

Konkret zum Quelltextschnippsel: Die Parameter in der URL würde ich `requests` zusammensetzen lassen. Das ist übersichtlicher wenn man die als Datenstrukur im Programm hat, und man kann dann auch einfacher einzelne Werte setzen.

`page` ist kein so guter Name für ein `Response`-Objekt. Da kann auch was anderes als eine Seite drin sein, und da ist mehr als nur der Seiteninhalt drin.

Man sollte auch immer prüfen ob das keine Fehlerantwort war, bevor man den Inhalt verarbeitet. Vielleicht verrät Dir das ja auch schon warum es manchmal funktoniert und manchmal nicht.

Du erwähnst die Ausnahme gar nicht, die der Code auslöst. `game` ist eine Liste und Listen haben keine `find_all()`-Methode. Die Elemente *in* der Liste haben jeweils so eine Methode. Allerdings ist `find_all()` da dann auch nicht so zielführend, denn jeder Artikal hat ja nur *einen* Preiseintrag.

Letztlich will E-Bay nicht, dass Du so etwas machst. Denn wenn keine Ergebnisse kommen, solltest Du mal auf den Seitenquelltext schauen der da ausgeliefert wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
blubb1810
User
Beiträge: 4
Registriert: Freitag 23. April 2021, 20:00

__blackjack__ hat geschrieben: Samstag 24. April 2021, 01:00 @blubb1810: Ich habe mir mal den Beispiel-Link angeschaut und zweifele ein bisschen, dass das so funktioniert. Da sind die ersten 5 Preise (ohne Versand) gerade:

3,44
895,00
12,99
14,00
15,50

Was einen Durchsnittswert von 188,19 ergibt. Und für den Median sind 5 Werte wohl ein bisschen wenig.

Standardmässig scheinen da 50 Ergebnisse auf einer Ergebnisseite zu kommen, die könnte man wenn man sie sowieso schon geliefert bekommt, auch verwenden. Allerdings wird man dann wohl früher oder später auf das Problem treffen, dass irgendwann Suchtreffer kommen, die sich immer weiter von dem wonach man sucht, entfernen.
Eine Idee um das zu verhindern wäre die EAN Nummer zu verwenden. Dadurch kommt bei der Suche auch wirklich nur das genau gleiche Produkt.
Bücher sind mir persönlich bei den meisten Programmiersprachen zu schnell veraltet. In der Python-Dokumentation gibt es ein Grundlagentutorial das parallel zur Sprache aktuell gehalten wird. Das sollte man mal durchgearbeitet haben, unabhängig davon was man sonst noch so an Lernmaterial verwendet.

Für das Thema Deines Projekts müsste man noch wissen wie HTTP funktioniert, und HTML und CSS, und eventuell auch ein bisschen JavaScript, wenn die zu scrapende Seite(n) dynamisch Inhalte nachladen und/oder generieren. Eine IMHO ganz brauchbare Quelle für diese ganzen Themen ist https://developer.mozilla.org/en-US/

Konkret zum Quelltextschnippsel: Die Parameter in der URL würde ich `requests` zusammensetzen lassen. Das ist übersichtlicher wenn man die als Datenstrukur im Programm hat, und man kann dann auch einfacher einzelne Werte setzen.

Die python Dokumentation werde ich durcharbeiten und deinen Link werde ich mir auch anschauen. Wie genau würde man die URL dann in der Praxis mit requests zusammensetzen?
`page` ist kein so guter Name für ein `Response`-Objekt. Da kann auch was anderes als eine Seite drin sein, und da ist mehr als nur der Seiteninhalt drin.

Man sollte auch immer prüfen ob das keine Fehlerantwort war, bevor man den Inhalt verarbeitet. Vielleicht verrät Dir das ja auch schon warum es manchmal funktoniert und manchmal nicht.

Du erwähnst die Ausnahme gar nicht, die der Code auslöst. `game` ist eine Liste und Listen haben keine `find_all()`-Methode. Die Elemente *in* der Liste haben jeweils so eine Methode. Allerdings ist `find_all()` da dann auch nicht so zielführend, denn jeder Artikal hat ja nur *einen* Preiseintrag.

Letztlich will E-Bay nicht, dass Du so etwas machst. Denn wenn keine Ergebnisse kommen, solltest Du mal auf den Seitenquelltext schauen der da ausgeliefert wird.
Wie kann man denn innerhalb einer Liste nach dem Preis suchen?
Was genau meinst du damit, dass ich auf den Seitenquelltext schauen soll? Kann man dort irgendetwas einbauen, was das Web scraping verhindern soll?
Schonmal vielen Dank für deine bisherigen Antworten, die mich schon ein Stück weiter gebracht haben.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das du keine Antworten bekommst liegt daran, dass sie deine Anfragen drosseln oder gar nicht mehr beantworten, weil sie eben genau dieses abgreifen verhindern wollen. Und das steht im Quelltext.
blubb1810
User
Beiträge: 4
Registriert: Freitag 23. April 2021, 20:00

__deets__ hat geschrieben: Samstag 24. April 2021, 14:06 Das du keine Antworten bekommst liegt daran, dass sie deine Anfragen drosseln oder gar nicht mehr beantworten, weil sie eben genau dieses abgreifen verhindern wollen. Und das steht im Quelltext.
Okay das war mir nicht bewusst. Das heißt also, dass sich meine Idee nicht umsetzen lässt :/ .
Vielen Dank für die Antwort!
Antworten