Hallo,
wie kann man mit Python auf z.B. Amazon die Suchfunktion mit einem bestimmten Keyword ausführen und sich die Ergebnisse ausgeben lassen? Vielen Dank für die Hilfe!
MfG
Web Formular (Such Funktion ausführen)
- __blackjack__
- User
- Beiträge: 13099
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sooster: Das kommt auf die Website an. Als erstes sollte man schauen ob es eine offizielle API gibt, damit man sich das scrapen der Webseite sparen kann. Die gibt es bei Amazon. Falls es keine API gibt, sollte man erst einmal klären ob es denn erlaubt ist. Viele Websites verbieten automatisierte Anfragen in ihrer AGB und machen das technisch dann in der Regel auch in der robots.txt deutlich. Und dann kommt es letztlich darauf an wie die Website die Suche technisch löst und wie sehr sie sich dagegen wehrt automatisiert verwendet zu werden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@__blackjack__ Ja, es soll die Website Amazon sein. Wie würde man so etwas denn machen?__blackjack__ hat geschrieben: ↑Mittwoch 18. Juli 2018, 10:06 @sooster: Das kommt auf die Website an. Als erstes sollte man schauen ob es eine offizielle API gibt, damit man sich das scrapen der Webseite sparen kann. Die gibt es bei Amazon. Falls es keine API gibt, sollte man erst einmal klären ob es denn erlaubt ist. Viele Websites verbieten automatisierte Anfragen in ihrer AGB und machen das technisch dann in der Regel auch in der robots.txt deutlich. Und dann kommt es letztlich darauf an wie die Website die Suche technisch löst und wie sehr sie sich dagegen wehrt automatisiert verwendet zu werden.
- __blackjack__
- User
- Beiträge: 13099
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sooster: Wie gesagt, die haben eine API. Und Dokumentation. Für Abfragen würde ich das `requests`-Modul verwenden und für XML `lxml`.
Edit: Und natürlich erst einmal schauen ob es für die API schon ein Python-Modul gibt, bevor man selbst etwas programmiert.
Edit: Und natürlich erst einmal schauen ob es für die API schon ein Python-Modul gibt, bevor man selbst etwas programmiert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Eine andere Möglichkeit wäre es, einfach deine Suche via URL abzugeben wie folgt:
Die Amazon URL ist wie folgt aufgebaut: https://www.amazon.de/s/&page=1&keywords=SUCHBEGRIFF
Nach dem "keywords" gibst du einfach deinen Suchbegriff ein und bei "page" kannst du je nachdem dir die gewünschte Seite ausgeben lassen.
(Ich habe die URL verkürzt.)
Die Amazon URL ist wie folgt aufgebaut: https://www.amazon.de/s/&page=1&keywords=SUCHBEGRIFF
Nach dem "keywords" gibst du einfach deinen Suchbegriff ein und bei "page" kannst du je nachdem dir die gewünschte Seite ausgeben lassen.
(Ich habe die URL verkürzt.)
Ja, danke, das habe ich jetzt auch bemerkt *selbst-facepalm*. Wenn ich jetzt die Seite mit den Suchergebnissen habe, wie kann ich die Titel der Suchergebnisse ausgeben?addi hat geschrieben: ↑Donnerstag 19. Juli 2018, 14:43 Eine andere Möglichkeit wäre es, einfach deine Suche via URL abzugeben wie folgt:
Die Amazon URL ist wie folgt aufgebaut: https://www.amazon.de/s/&page=1&keywords=SUCHBEGRIFF
Nach dem "keywords" gibst du einfach deinen Suchbegriff ein und bei "page" kannst du je nachdem dir die gewünschte Seite ausgeben lassen.
(Ich habe die URL verkürzt.)
- __blackjack__
- User
- Beiträge: 13099
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sooster: Da benutzt man dann eine Bibliothek wie BeautifulSoup um das HTML zu parsen und sich die interessanten Elemente heraus zu picken.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Code: Alles auswählen
from bs4 import BeautifulSoup
import requests
with open('lol.html') as html_file:
soup = BeautifulSoup(html_file, 'lxml')
source = requests.get('https://www.amazon.de/xxxxxxxxxxxxxxx').text
article = soup.find('article')
summary = article.find('a', class_='a-link-normal a-text-normal').p.text
print(summary)
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Users\xxx\Desktop\Test.py", line 11, in <module>
summary = article.find('a', class_='a-link-normal a-text-normal').p.text
AttributeError: 'NoneType' object has no attribute 'find'
Zuletzt geändert von Damaskus am Montag 23. Juli 2018, 07:58, insgesamt 1-mal geändert.
from bs4 import BeautifulSoup
import requests
source = requests.get('https://www.amazon.de/xxxxxxxxxxxxxxx').text
soup = BeautifulSoup(source, 'lxml')
article = soup.find('article')
summary = article.find('div', class_='a-row a-spacing-none').p.text
print(summary)
Sorry, so meinte ich das!
Zuletzt geändert von Damaskus am Montag 23. Juli 2018, 07:59, insgesamt 1-mal geändert.
Grund: Linnk Details gelöscht
Grund: Linnk Details gelöscht
- __blackjack__
- User
- Beiträge: 13099
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sooster: Es gibt halt kein <article>-Tag in dem HTML. Und während ich in der ”normalen” Suche, also die URL die addi vorgeschlagen hatte noch <div>-Tags nach Deinem zweiten Muster finde, sind auch solche nicht in der Antwort zu Deiner verwendeten URL enthalten.
Die beiden Klassen auf <div>-Elementen wären mir persönlich auch ein bisschen zu unsicher um damit eindeutig die Suchergebnisse zu identifizieren. Die sind ja in einer ungeordneten Liste mit einer eindeutigen ID für das Suchergebnis. Sich im ersten Schritt daran zu orientieren ist deutlich sicherer. Und dann könnte man sich darin Links suchen die eine Klasse haben die auf eine Detailseite hinweisen und ein `title`-Attribut welches den Titel/Namen des Produkts enthält.
Die beiden Klassen auf <div>-Elementen wären mir persönlich auch ein bisschen zu unsicher um damit eindeutig die Suchergebnisse zu identifizieren. Die sind ja in einer ungeordneten Liste mit einer eindeutigen ID für das Suchergebnis. Sich im ersten Schritt daran zu orientieren ist deutlich sicherer. Und dann könnte man sich darin Links suchen die eine Klasse haben die auf eine Detailseite hinweisen und ein `title`-Attribut welches den Titel/Namen des Produkts enthält.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Danke für die Antwort, ich habe es jetzt auf andere Weise hinbekommen:__blackjack__ hat geschrieben: ↑Freitag 20. Juli 2018, 15:49 @sooster: Es gibt halt kein <article>-Tag in dem HTML. Und während ich in der ”normalen” Suche, also die URL die addi vorgeschlagen hatte noch <div>-Tags nach Deinem zweiten Muster finde, sind auch solche nicht in der Antwort zu Deiner verwendeten URL enthalten.
Die beiden Klassen auf <div>-Elementen wären mir persönlich auch ein bisschen zu unsicher um damit eindeutig die Suchergebnisse zu identifizieren. Die sind ja in einer ungeordneten Liste mit einer eindeutigen ID für das Suchergebnis. Sich im ersten Schritt daran zu orientieren ist deutlich sicherer. Und dann könnte man sich darin Links suchen die eine Klasse haben die auf eine Detailseite hinweisen und ein `title`-Attribut welches den Titel/Namen des Produkts enthält.
Code: Alles auswählen
import bs4 as bs
import urllib.request
import time
source = urllib.request.urlopen('https://www.amazon.de/xxxxxxxxxxxxxxx').read()
soup = bs.BeautifulSoup(source, 'lxml')
#print(soup.h2.text)
for ergebnisse in soup.find_all('h2'):
if not ergebnisse.get("data-attribute") is None:
x = ergebnisse.get('data-attribute')
print("lal" + x)
time.sleep(100)
Zuletzt geändert von Damaskus am Montag 23. Juli 2018, 08:00, insgesamt 1-mal geändert.
Grund: Link Details gelöscht
Grund: Link Details gelöscht
Du könntest die Ergebnisse in eine Liste laden und diese dann alle ausgeben:
Achja das pausieren des Programms ist völlig sinnlos, da du damit nur das beenden verhinderst. Und was möchtest du eigentlich mit dem Programm anfangen?
Code: Alles auswählen
import bs4 as bs
import urllib.request
source = urllib.request.urlopen('https://www.amazon.de/xxxxxxxxxxxxxxx').read()
soup = bs.BeautifulSoup(source, 'lxml')
#print(soup.h2.text)
x = []
for ergebnisse in soup.find_all('h2'):
if not ergebnisse.get("data-attribute") is None:
x.append(ergebnisse.get('data-attribute'))
print("lal" + "".join(x))