Ich habe ein Skript in Python erstellt, um zwei Felder von einer Webseite zu analysieren - total revenue
und es geht darum date
. Die Felder, nach denen ich suche, sind mit Javascript verschlüsselt. Sie sind in der Seitenquelle innerhalb des JSON-Arrays verfügbar. Das folgende Skript kann diese beiden Felder entsprechend analysieren.
Das Problem ist jedoch, dass sich das auf dieser Seite sichtbare Datum von dem in der Seitenquelle verfügbaren unterscheidet.
Das Datum in dieser Webseite ist wie diese
Das Datum der Seite Quelle ist wie diese
Es gibt eindeutig eine Variation von einem Tag.
Nachdem Sie diese Webseite besucht haben und auf diese Registerkarte geklickt haben Quarterly
, können Sie dort die Ergebnisse sehen:
Ich habe versucht mit:
import re
import json
import requests
url = 'https://finance.yahoo.com/quote/GTX/financials?p=GTX'
res = requests.get(url)
data = re.findall(r'root.App.main[^{]+(.*);',res.text)[0]
jsoncontent = json.loads(data)
container = jsoncontent['context']['dispatcher']['stores']['QuoteSummaryStore']['incomeStatementHistoryQuarterly']['incomeStatementHistory']
total_revenue = container[0]['totalRevenue']['raw']
concerning_date = container[0]['endDate']['fmt']
print(total_revenue,concerning_date)
Ergebnis bekomme ich (Umsatz in Millionen):
802000000 2019-06-30
Ergebnis, das ich erhalten möchte:
802000000 2019-06-29
Wenn ich es mit diesem Ticker versuche AAPL
, erhalte ich das genaue Datum, sodass das Subtrahieren oder Hinzufügen eines Tages keine Option ist.
Wie kann ich das genaue Datum von dieser Site erhalten ?
Übrigens weiß ich, wie man sie mit Selen bekommt, also möchte ich mich nur daran halten requests
.
Antworten:
Wie in den Kommentaren erwähnt, müssen Sie das Datum in die entsprechende Zeitzone (EST) konvertieren
dateutil
. Dies kann mit datetime und erfolgen .Hier ist ein Arbeitsbeispiel:
quelle
06-29-2019
statt formatieren2019-06-29 19:00:00-05:00
? Vielen Dank..date()
, dann müssen Sie es verwenden.strftime
, um es in das gewünschte Format zu konvertieren.NVDA
der zu diesem Link führt , stelle ich fest, dass der Unterschied noch größer ist.NVIDIA
es auch in EST ist. Ich werde nach einer Lösung suchen, aber ich weiß jetzt nicht, warum dies geschieht.Der aktualisierte Abschnitt dieser Antwort beschreibt die Hauptursache für die Datumsunterschiede.
URSPRÜNGLICHE ANTWORT
Einige der Rohwerte in Ihrem JSON sind UNIX-Zeitstempel.
Verweis aus Ihrem Code mit Änderungen:
1564272000 ist die Anzahl der seit dem 01. Januar 1970 verstrichenen Sekunden. Dieses Datum war der Beginn der Unix-Epoche und die Zeit ist in der koordinierten Weltzeit (UTC). 1564272000 entspricht: 28.07.2019 00:00 Uhr (UTC).
Sie können diese Zeitstempel mithilfe der integrierten Python-Funktionen in ein Standard- Datums- / Uhrzeitformat umwandeln
Dies löst Ihr ursprüngliches Problem in Bezug auf JSON-Daten und Spaltendaten, die manchmal unterschiedlich sind, immer noch nicht. Aber hier ist meine aktuelle Hypothese in Bezug auf die auftretenden Datumsunterschiede.
Das json- Datum (fmt und raw), das aus root.App.main extrahiert wird, befindet sich in der koordinierten Weltzeit (UTC). Dies ist aufgrund des UNIX-Zeitstempels in raw klar .
Die in den Tabellenspalten angezeigten Daten scheinen in der Zeitzone Eastern Standard Time (EST) zu liegen. EST ist derzeit UTC-4. Dies bedeutet, dass 2019-07-28 22:00 (10pm) EST 2019-07-29 02:00 (2am) UTC sein würde. Die Server - Hosting finance.yahoo.com Blicke in den Vereinigten Staaten zu sein , auf der Grundlage der trace Ergebnisse. Diese Werte befinden sich auch in der JSON- Datei:
Es besteht auch die Möglichkeit, dass einige der Datumsunterschiede mit dem zugrunde liegenden Reaktionscode verknüpft sind , den die Site verwendet. Dieses Problem ist schwerer zu diagnostizieren, da der Code nicht sichtbar ist.
Derzeit glaube ich, dass die beste Lösung darin besteht, den UNIX-Zeitstempel als Referenz für die Grundwahrheit zu verwenden. Diese Referenz könnte verwendet werden, um das Datum der Tabellenspalte zu ersetzen.
Es gibt definitiv eine Art von Konvertierung zwischen der JSON-Datei und den Spalten.
ABER das Datum der Spalte "Gesamteinnahmen" sollte der 28.06.2019 (EDT) sein, da der UNIX-Zeitstempel für 1561766400 der 29.06.2019, 12:00 Uhr (UTC) ist.
Die Ungleichheit mit DELL ist größer als bei einem einfachen UNIX-Zeitstempel und einer EDT-Zeitstempelkonvertierung.
Wenn wir den UNIX-Zeitstempel in einen EDT-Zeitstempel konvertieren, wäre das Ergebnis der 01.08.2019, aber das ist im DELL-Beispiel vom 31.07.2019 nicht der Fall. Etwas in der Yahoo-Codebasis muss diesen Unterschied verursachen.
Ich fange an zu glauben, dass React der Schuldige an diesen Datumsunterschieden sein könnte, aber ich kann nicht sicher sein, ohne mehr Nachforschungen anzustellen.
Wenn React die Hauptursache ist, besteht die beste Option darin, die Datumselemente aus den JSON-Daten zu verwenden.
AKTUALISIERTE ANTWORT 17.10.2019
Dieses Problem ist sehr interessant, da diese Spaltendaten anscheinend mit dem offiziellen Ende des Geschäftsquartals eines Unternehmens verknüpft sind und nicht mit einem Datum der Konversation.
Hier sind einige Beispiele für
Ihre Spaltendaten sind:
Diese Daten stimmen mit diesen Geschäftsquartalen überein.
Diese Enddaten für das Geschäftsquartal können sehr unterschiedlich sein, wie dieses DELL-Beispiel zeigt.
DELL (veröffentlicht in NASDAQ) Ende des Geschäftsquartals: Juli 2019
Datum der Yahoo Finance- Spalte: 31.07.2019
JSON-Datum: 02.08.2019
Von der Website des Unternehmens:
HINWEIS: Die Daten 05-03-19 und 08-02-19.
Diese stammen aus den JSON-Quartalsdaten für DELL:
Es scheint, dass diese Spaltendaten mit den Enddaten des Geschäftsquartals eines Unternehmens verknüpft sind. Daher würde ich empfehlen, dass Sie entweder das JSON-Datum als primäres Referenzelement oder das entsprechende Spaltendatum verwenden.
PS: Bei Yahoo gibt es eine Art von Datums-Voodoo, da diese Spaltenquartalsdaten anscheinend basierend auf Feiertagen, Wochenenden und Monatsende verschoben werden.
quelle
Statt die das Erhaltens
fmt
derconcerning_date
, Es ist besser , den Zeitstempel zu erhalten.Im obigen Beispiel erhalten Sie das Ergebnis,
1561852800
das Sie in ein Datum mit einer bestimmten Zeitzone übertragen können. (Hinweis: verwendendatetime
undpytz
). Dieser Zeitstempel liefert die folgenden Ergebnisse basierend auf der Zeitzone:quelle