Ein genaues Ergebnis einer Webseite kann nicht mithilfe von Anforderungen analysiert werden

8

Ich habe ein Skript in Python erstellt, um zwei Felder von einer Webseite zu analysieren - total revenueund 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.

Webseiten-Link

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.

MITHU
quelle
3
Wenn die Daten um höchstens einen Tag verschoben sind, würde ich zunächst vermuten, dass der Unterschied aus der Zeitzonenumrechnung resultiert.
Janne Karila
1
Ich habe versucht, VPN an einem anderen Ort zu aktivieren, um das Ergebnis zu sehen, aber die Variation ist immer noch da @Janne Karila.
MITHU
Ich habe gerade Ihren Code ausprobiert und die Ausgabe der Druckanweisung war dieselbe wie auf der Seite (30.06.2019).
Jack Fleeting
Ja, richtig, Sie sind @ Jack Fleeting, aber andere Ticker werden sicherlich variieren. In der Tat können Sie ein anderes Mal ein anderes Ergebnis erhalten. An diesem Punkt scheint es, dass Janne Karila in seiner ersten Vermutung Recht hatte. Ich nehme an, es gibt eine Möglichkeit, das zu beheben.
MITHU
Könnten Sie bitte weitere Aktiensymbole mit den richtigen Daten und solche mit den falschen Daten angeben?
Leben ist komplex

Antworten:

2

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:

import re
import json
import requests
from datetime import datetime, timezone
from dateutil import tz

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']

EST = tz.gettz('EST')
raw_date = datetime.fromtimestamp(container[0]['endDate']['raw'], tz=EST)
concerning_date = raw_date.date().strftime('%d-%m-%Y')
print(total_revenue, concerning_date)
Setzen Sie Monica wieder ein
quelle
Es scheint das Ergebnis zu sein, das ich erwartet hatte. Kann ich das Datum nicht wie 06-29-2019statt formatieren 2019-06-29 19:00:00-05:00? Vielen Dank.
MITHU
1
@MITHU Ich habe dies in einem Update hinzugefügt. Zuerst müssen Sie das Datum / Uhrzeit-Objekt mit in ein Datum konvertieren .date(), dann müssen Sie es verwenden .strftime, um es in das gewünschte Format zu konvertieren.
Stellen Sie Monica
2
Wenn ich es mit diesem Ticker versuche, NVDAder zu diesem Link führt , stelle ich fest, dass der Unterschied noch größer ist.
MITHU
@MITHU Seltsam. Das bedeutet, dass TZ wahrscheinlich nicht das Problem ist, da NVIDIAes auch in EST ist. Ich werde nach einer Lösung suchen, aber ich weiß jetzt nicht, warum dies geschieht.
Stellen Sie Monica
2

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:

concerning_date_fmt = container[0]['endDate']['fmt']
concerning_date_raw = container[0]['endDate']['raw']
print(f'{concerning_date} -- {concerning_date_raw}')
# output 
2019-07-28 -- 1564272000 

'endDate': {'fmt': '2019-07-28', 'raw': 1564272000}

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

from datetime import datetime
unix_timestamp = int('1548547200')

converted_timestamp = datetime.utcfromtimestamp(unix_timestamp).strftime('%Y-%m-%dT%H:%M:%SZ')
print (converted_timestamp)
# output Coordinated Universal Time (or UTC)
2019-07-28T00:00:00Z

reformatted_timestamp = datetime.strptime(converted_timestamp, '%Y-%m-%dT%H:%M:%SZ').strftime('%d-%m-%Y')
print (reformatted_timestamp)
# output
28-07-2019

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.

  1. 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 .

  2. 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:

    • 'exchangeTimezoneName': 'America / New_York'
    • 'exchangeTimezoneShortName': 'EDT'
  3. 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.

NVIDIA JSON-DATEI: 'endDate': {'raw': 1561766400, 'fmt': '2019-06-29'}

Spalte NVIDIA Associated Total Revenue: 30.06.2019

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.

DELL JSON-DATEI: {"raw": 1564704000, "fmt": "2019-08-02"}

Spalte DELL Associated Total Revenue: 31.07.2019

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

  • Apple Inc. (AAPL)
  • Atlassian Corporation Plc (TEAM)
  • Arrowhead Pharmaceuticals, Inc. (ARWR):

Ihre Spaltendaten sind:

  • 30.06.2019
  • 31.03.2019
  • 31.12.2008
  • 30.09.2008

Diese Daten stimmen mit diesen Geschäftsquartalen überein.

  • 1. Quartal (1. Quartal): 1. Januar - 31. März.
  • 2. Quartal (2. Quartal): 1. April - 30. Juni.
  • 3. Quartal (3. Quartal): 1. Juli - 30. September.
  • 4. Quartal (4. Quartal): 1. Oktober - 31. Dezember

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:

Wann endet das Geschäftsjahr von Dell Technologies?

  • Unser Geschäftsjahr ist der 52- oder 53-wöchige Zeitraum, der am Freitag, dem 31. Januar, endet. Unser Geschäftsjahr 2020 endet am 31. Januar 2020. Für frühere Geschäftsjahre siehe Liste unten: Unser Geschäftsjahr 2019 endete am 1. Februar. 2019 Unser Geschäftsjahr 2018 endete am 2. Februar 2018 Unser Geschäftsjahr 2017 endete am 3. Februar 2017 Unser Geschäftsjahr 2016 endete am 29. Januar 2016 Unser Geschäftsjahr 2015 endete am 30. Januar 2015 Unser Geschäftsjahr 2014 endete am 31. Januar 2014 Unser Geschäftsjahr 2013 endete am 1. Februar 2013

dells Geschäftsquartale

HINWEIS: Die Daten 05-03-19 und 08-02-19.

Diese stammen aus den JSON-Quartalsdaten für DELL:

  • {'raw': 1564704000, 'fmt': '2019-08-02'}
  • {'raw': 1556841600, 'fmt': '2019-05-03'}

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.

Das Leben ist komplex
quelle
1

Statt die das Erhaltens fmtder concerning_date, Es ist besser , den Zeitstempel zu erhalten.

concerning_date = container[0]['endDate']['raw']

Im obigen Beispiel erhalten Sie das Ergebnis, 1561852800das Sie in ein Datum mit einer bestimmten Zeitzone übertragen können. (Hinweis: verwenden datetimeund pytz). Dieser Zeitstempel liefert die folgenden Ergebnisse basierend auf der Zeitzone:

Date in Los Angeles*: 29/06/2019, 17:00:00
Date in Berlin* :30/06/2019, 02:00:00
Date in Beijing*: 30/06/2019, 07:00:00
Date in New York* :29/06/2019, 19:00:00
Mohammed Abuiriban
quelle