Web Formular (Such Funktion ausführen)

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
sooster
User
Beiträge: 6
Registriert: Dienstag 17. Juli 2018, 22:46

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
Benutzeravatar
__blackjack__
User
Beiträge: 13006
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
sooster
User
Beiträge: 6
Registriert: Dienstag 17. Juli 2018, 22:46

__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__ Ja, es soll die Website Amazon sein. Wie würde man so etwas denn machen?
Benutzeravatar
__blackjack__
User
Beiträge: 13006
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
addi
User
Beiträge: 28
Registriert: Donnerstag 29. März 2018, 22:54

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.)
sooster
User
Beiträge: 6
Registriert: Dienstag 17. Juli 2018, 22:46

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.)
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?
Benutzeravatar
__blackjack__
User
Beiträge: 13006
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
sooster
User
Beiträge: 6
Registriert: Dienstag 17. Juli 2018, 22:46

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)
Das habe ich jetzt gemacht, jedoch kommt folgende Fehlermeldung:

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'
Was mache ich falsch? Im Endeffekt möchte ich, dass mir der Link zu dem Produkt ausgegeben wird. Vielen Dank für die Hilfe!
Zuletzt geändert von Damaskus am Montag 23. Juli 2018, 07:58, insgesamt 1-mal geändert.
sooster
User
Beiträge: 6
Registriert: Dienstag 17. Juli 2018, 22:46

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
Benutzeravatar
__blackjack__
User
Beiträge: 13006
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
sooster
User
Beiträge: 6
Registriert: Dienstag 17. Juli 2018, 22:46

__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.
Danke für die Antwort, ich habe es jetzt auf andere Weise hinbekommen:

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)
Jedoch gibt das Programm jetzt lal + 1 der Produkttitel aus, ich möchte jedoch 1x lal + alle Produkttitel hintereinander ausgeben. Wie kann man das machen? Sorry aber ich bin (wie man wahrscheinlich merkt) noch recht am Anfang!
Zuletzt geändert von Damaskus am Montag 23. Juli 2018, 08:00, insgesamt 1-mal geändert.
Grund: Link Details gelöscht
addi
User
Beiträge: 28
Registriert: Donnerstag 29. März 2018, 22:54

Du könntest die Ergebnisse in eine Liste laden und diese dann alle ausgeben:

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))
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?
Antworten