Python Web Scraping: Interaktiver Link / Button

OP #7503446
Lesenswert?

Hallo zusammen,

wie könnte man mit Python von der Seite https://www.onvista.de/index/einzelwerte/S-P-500-Index-4359526 die Aktien des Aktienindex S&P500 auslesen? Die erste Seite mit den ersten x Aktien sind kein Problem, aber wie kommt man auf die zweite bis elfte Seite?

1
import urllib3
2
from bs4 import BeautifulSoup
3

4
link='https://www.onvista.de/index/einzelwerte/S-P-500-Index-4359526'
5

6
user_agent='Mozilla/4.5 (Windows NT 9.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0'
7
pm = urllib3.PoolManager(10, headers={'user-agent': user_agent})
8
response = pm.urlopen('GET', link)
9
soup = BeautifulSoup(response.data, 'html.parser')
10
section = soup.find('section', {'class': 'grid'})
11
pagination = section.find('div', {'class': 'pagination--container-center'})
12
print(pagination)

In der pagination-Antwort befindet sich der Code für die 'Links' zu den Seiten zwei bis elf: Siehe Anhang (µC.net meint in dem Code Spam zu erkennen, daher nur als Screenshot)

Außerdem findet man den 'Nächste Seite' Button:

1
<div class="pagination__button pagination__button--right">
2
  <button aria-label="Nächste Seite">
3
   <span class="icon icon--SvgCdAngleRight16 icon--size-16">
4
    <svg class="icon__svg" viewbox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
5
       <path d="M6 13c-.26 0-.51-.1-.71-.29a.996.996 0 010-1.41L8.59 8l-3.3-3.29A.996.996 0 116.7 3.3l4 4c.39.39.39 1.02 0 1.41l-4 4c-.19.19-.44.29-.7.29z" fill="currentColor"></path>
6
    </svg>
7
   </span>
8
  </button>
9
</div>

Damit kommt man glaube ich nicht weiter, da die Links und der Button keinen href-Link enthalten. Hat jemand eine Idee, wie man die anderen Seiten auslesen kann?

Danke und viele Grüße

Angehängte Dateien:
#7503545
Lesenswert?

Dirac I. schrieb:

wie könnte man mit Python von der Seite https://www.onvista.de/index/einzelwerte/S-P-500-Index-4359526 die Aktien des Aktienindex S&P500 auslesen? Die erste Seite mit den ersten x Aktien sind kein Problem, aber wie kommt man auf die zweite bis elfte Seite?

Wenn Du mit Aktien $reich werden willst -- welch originelle Idee! -- dann solltest Du Dir einen Anbieter suchen, der Dir die aktuellen(!) Daten zur Verfügung stellt, zum Beispiel per REST-API. Viele Anbieter stellen ihre Daten gegen Einwurf kleiner Münzen gerne zur Verfügung. HTH, YMMV, SCNR.

#7503629
Lesenswert?

Mach die Seite mal mit dem Browser auf, öffne die Entwickler-Konsole, und schau dir die Requests an, die da per XHR gemacht werden.

Da ist einer dabei, auf 'api.onvista.de/constituents', Aufruf-Parameter u.A. "page=1, perPage=50" der ein schönes JSON-Array mit 50 Einträgen ausspuckt, mit allen Daten die du dir wünschen könntest, und noch viel mehr...

Hab die Daten des ersten Eintrags auf der zweiten Seite mal teilweise aufgeklappt, sh. Screenshot, und die Rohdaten der Seite auch angehängt.

d.H.: Mach dir nicht zuviel Arbeit mit dem Scraping aus dem HTML, greif die Daten direkt an der Quelle ab.

Angehängte Dateien:
#7503662
Lesenswert?

Mein bescheidener Senf dazu via bash, da ich auch an sowas Interesse habe.

1
for i in `seq 1 1 9` 
2
do curl -s -o tmp_${i}.json 'https://api.onvista.de/api/v2/indices/4359526/constituents?order=ASC&page='${i}'&perPage=50&pricePerformanceType=INTRADAY&sort=NAME' 
3
sleep 1 
4
done
5

6
Beispiel
7

8
cat tmp_1.json | jq -r '."list"[]."instrument"."urls"."WEBSITE"'

Markus

#7503686
Lesenswert?

Markus W. schrieb:

[pre] for i in seq 1 1 9 do curl -s -o tmp_${i}.json 'https://api.onvista.de/api/v2/indices/4359526/constituents?order=ASC&page='${i}'&perPage=50&pricePerformanceType=INTRADAY&sort=NAME' sleep 1 done

Nice: der Erste weist darauf hin, dass die Kinder der Entwickler bei Onvista hungern müssen. Wenn deren Daten geklaut werden, der nächste gibt Hinweise, wie der Api-Aufruf zum Klauen aussieht. Und der Dritte zeigt das dann gleich en Detail in grausigem Bash-Code. Die Daten sind dann zwar laut Aussage von Nr. 1 nicht aktuell, aber egal.

Ihr seid super, Leute, genau mein Humor!

OP #7503736
Lesenswert?

@Ein T.:

vielen Dank für den Hinweis. Ich werde mir die Alternativen mal anschauen.

@ Ernst und Markus:

Vielen Dank für die Hilfe! :-) Ich kann euch leider nicht folgen, wie genau ihr auf api.onvista gekommen seid. Ich habe in Mozilla, Edge und Chrome die Entwicklerkonsole auf der Seite gestartet, habe aber unter "Elemente" / "Konsole" / "Debugger" / "Quellen" die API nicht gefunden. Wo genau habt ihr den Link her?

Danke nochmal und viele Grüße

#7503763
Lesenswert?

@Dirac I.,

beim Firefox z.B. die F12 Taste zum Aufruf der DevTools starten. Reiter Network wählen. Seite neu Laden

1
https://www.onvista.de/index/einzelwerte/S-P-500-Index-4359526

und im Tab die Zeile mit dem Request 'quote_list' (Spalte File) an den Server anklicken. Auf der rechten Seite im Fenster im Tab Headers, siehst Du den

1
https://api.onvista.de/api/v1/instruments/quote_list

API Link neben Options.

Markus

#7507656
Lesenswert?

Εrnst B. schrieb:

Da ist einer dabei, auf 'api.onvista.de/constituents', Aufruf-Parameter u.A. "page=1, perPage=50" der ein schönes JSON-Array mit 50 Einträgen ausspuckt, mit allen Daten die du dir wünschen könntest, und noch viel mehr...

Statt die Seiten einzeln zu scannen, könnte es sich lohnen den PerPage auf 500 zu setzten, dann gibt es vielleicht alles auf einmal.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren