SyntaxError: can't assign to function call

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.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

Pythagon hat geschrieben: Samstag 13. Juli 2019, 15:31
kbr hat geschrieben: Samstag 13. Juli 2019, 15:21 Zumindest die while-Schleife kannst Du schon einmal ersetzen durch:

Code: Alles auswählen

start = index + 22
cookiecrumb = html[start:html.index('"', start)]
Darufhin bekomme ich folgende Fehlermeldung:
cookiecrumb = html[start:html.index('"', start)][/code]
^
SyntaxError: invalid syntax
Bitte ignorieren. Habe die while Schleife nun erfolgreich ersetzt. Funktioniert wunderbar! Besten Dank!
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

Kann es sein, dass ich den Cookiecrumb nicht nur in den Link einfügen muss sondern irgendwie zusätzlich mit dem Http-Request übergeben muss damit Yahoo erkennt, dass es die selbe Session ist?
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pythagon: Wie und wo autorisierst Du Dich denn? Da wird doch wohl mehr erforderlich sein als vorher eine andere Seite abzurufen und da einen Parameter aus JavaScript-Code zu fischen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

Ich war jetzt davon ausgegangen es würde genügen den Cookiecrumb mit dem Link zu übergeben aber anscheinend erkennt Yahoo nicht, dass es sich um ein und die selbe Http-Session handelt und generiert bei jedem neuen Zugriff erneut einen anderen Cookiecrumb. Grundsätzlich sind diese csv files frei zugänglich. Man muss sich also weder einloggen, noch anderweitig authorisieren. Es muss lediglich die Cookieabfrage von Yahoo bestätigt werden wenn man das ganze mit einem Browser vornimmt.

Muss ich eine Session ID festlegen und diese mit übergeben mit jeder Anfrage?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Evtl mal mit mechanize probieren. Ein paar Codebeispiele:
https://mechanize.readthedocs.io/en/latest/#quickstart

Das verhält sich noch ein bißchen ähnlicher wie ein Browser und löst das Problem mit den Cookies möglicherweise.

An welche Daten möchtest du denn genau kommen? Ich spreche hier natürlich vom eigentlichen Ziel und nicht von deinen Versuchen mit dem Cookiecrumb. Vielleicht liefert dir dann jemand eine Lösung oder zumindest entscheidende Schritte zum Weiterkommen....
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

snafu hat geschrieben: Samstag 13. Juli 2019, 17:33 Evtl mal mit mechanize probieren. Ein paar Codebeispiele:
https://mechanize.readthedocs.io/en/latest/#quickstart

Das verhält sich noch ein bißchen ähnlicher wie ein Browser und löst das Problem mit den Cookies möglicherweise.

An welche Daten möchtest du denn genau kommen? Ich spreche hier natürlich vom eigentlichen Ziel und nicht von deinen Versuchen mit dem Cookiecrumb. Vielleicht liefert dir dann jemand eine Lösung oder zumindest entscheidende Schritte zum Weiterkommen....
Hallo Snafu,

mechanize wollte ich zunächst auch dafür verwenden aber es ist leider ungeeignet da es nicht in der Lage ist den HTML Code des PopUp-Fenster für die Cookieabfrage , welches beim Öffnen von Yahoo auftaucht, zu identifizieren.

Ich möchte csv-Files für historische Dividenden und Kursdaten bei Yahoo-Finance ziehen. Ich habe das jahre lang mit VBA gemacht aber seit Kurzem wird IE11 nicht mehr vollständig unterstützt bei Yahoo und somit muss ich einen Teil des Codes auslagern in Python.

Mir wurde im VBA Forum mitgeteilt ein Http-Session Objekt, wie Python es bietet, würde das Problem lösen weil die Cookie Information beständig wäre für alle Reuqests, die über das Session-Objekt stattfinden. Ich möchte praktisch mit dem Session-Objekt eine Browser-Session imitieren wenn man so will. Allerdings nehme ich an, dass ich der Session in irgendeiner Weise noch einen Wert für ein Attribut hinzufügen muss damit dieser dieses bei jeder Anfrage mit übergibt, so dass die Webseite jedes mal erkennt es ist die gleiche Http-Session.

Für Tipps wäre ich dankbar denn alles was ich dazu finde ist schwer verständlich wenn man von Http-Requests wenig Ahnung hat.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Pythagon hat geschrieben: Samstag 13. Juli 2019, 17:48 Ich habe das jahre lang mit VBA gemacht aber seit Kurzem wird IE11 nicht mehr vollständig unterstützt bei Yahoo und somit muss ich einen Teil des Codes auslagern in Python.
Das heißt, du hast eine Schnittstelle zum IE über VBA benutzt? So etwas ähnliches gibt es für Python auch. Es ist eine Anbindung an Selenium. Dabei wird auch JavaScript automatisch ausgeführt.

https://pypi.org/project/selenium/
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

Ich hatte in VBA zunächst auch versucht das Problem mit Selenium und Firefox zu lösen aber Firefox benötigt seit einer der neueren Versionen einen Treiber, der von Selenium nicht unterstützt wird. Aber wie ich auf dem Link von Dir sehe unterstützt Python noch andere Browser, die ich dafür vielleicht verwenden könnte. ich werde das auf jeden Fall später versuchen.

Trotzdem fände ich es immer noch interessant zu wissen wie man das Problem mit einem Session Objekt und Http Requests lösen kann denn das Objekt bietet eine ganze Reihe von Methoden in Bezug auf Cookies mit denen es vermutlich möglich ist. Ich weiß nur nicht welche davon relevant sind und wie man sie anwendet und auch Googlen hat bis jetzt nicht weiter geholfen.
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pythagon: Als erstes müsste man schauen was der Browser macht, also was der so alles bekommt und sendet, und dann wie man diese Information nachbasteln kann. Wobei wenn das schon Sachen aus JavaScript gefischt werden müssen, ist auch nicht auszuschliessen, das man auch tatsächlich das JavaScript ausführen muss, damit es funktioniert. Yahoo mag keine automatisierten Zugriffe und wehrt sich sehr wahrscheinlich dagegen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

__blackjack__ hat geschrieben: Samstag 13. Juli 2019, 19:24 @Pythagon: Als erstes müsste man schauen was der Browser macht, also was der so alles bekommt und sendet, und dann wie man diese Information nachbasteln kann. Wobei wenn das schon Sachen aus JavaScript gefischt werden müssen, ist auch nicht auszuschliessen, das man auch tatsächlich das JavaScript ausführen muss, damit es funktioniert. Yahoo mag keine automatisierten Zugriffe und wehrt sich sehr wahrscheinlich dagegen.
Ich hab noch ein wenig gegoogelt und bin tatsächlich schlauer geworden. Die Lösung ist trivial. Einfach beim zweiten Http-Request das "get" durch "post" ersetzen.

Code: Alles auswählen

#Get Yahoo Finance CSV-File
 
import requests

session = requests.session()

page = session.get("https://de.finance.yahoo.com/quote/DAI.DE/history?period1=1405116000&period2=1562882400&interval=div%7Csplit&filter=div&frequency=1d")

cookiecrumb1 = page.cookies.get

print(cookiecrumb1)

#session.cookies.set_cookie(cookiecrumb1)
#
link = "https://query1.finance.yahoo.com/v7/finance/download/DAI.DE?period1=1405202400&period2=1562968800&interval=1d&events=div&crumb=%s/" % (cookiecrumb1)
#    
#print(link)
#    
csvfile = session.post(link)
#
print(csvfile.text)

session.close
Das Ganze sieht dann so aus in der Konsole:
runfile('C:/Users/Public/Geldanlage & Börse/Pivot Tabellen & Auswertungen/Dividendenbewertung/DivTool 1.5 - CSV Scraper.py', wdir='C:/Users/Public/Geldanlage & Börse/Pivot Tabellen & Auswertungen/Dividendenbewertung')
<bound method RequestsCookieJar.get of <RequestsCookieJar[Cookie(version=0, name='B', value='16qm4qdeikft3&b=3&s=in', port=None, port_specified=False, domain='.yahoo.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1594585891, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>>
Date,Dividends
2015-04-02,2.45
2017-03-30,3.25
2016-04-07,3.25
2019-05-23,3.25
2018-04-06,3.65
Ich bin happy, dass es endlich geklappt hat! =)

Vielen Dank an alle für eure Unterstützung!
Antworten