He creado un script en Python para analizar dos campos de una página web, total revenue
y es preocupante date
. Los campos que busco están encriptados con JavaScript. Están disponibles en la fuente de la página dentro de json array. El siguiente script puede analizar esos dos campos en consecuencia.
Sin embargo, el problema es que la fecha visible en esa página es diferente de la disponible en la fuente de la página.
La fecha en que la página web es como esta
La fecha en la fuente de la página es como esta
Claramente hay una variación de un día.
Después de visitar esa página web cuando hace clic en esta pestaña Quarterly
, puede ver los resultados allí:
He intentado con:
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)
Resultado que obtengo (ingresos en millones):
802000000 2019-06-30
Resultado que deseo obtener:
802000000 2019-06-29
Cuando trato con este ticker AAPL
, obtengo la fecha exacta, por lo que no es una opción restar o agregar un día.
¿Cómo puedo obtener la fecha exacta de ese sitio ?
Por cierto, sé cómo usarlos con selenio, así que solo me gustaría seguir requests
.
Respuestas:
Como se menciona en los comentarios, debe convertir la fecha a la zona horaria apropiada (EST), que se puede hacer con datetime y
dateutil
.Aquí hay un ejemplo de trabajo:
fuente
06-29-2019
lugar de2019-06-29 19:00:00-05:00
? Gracias..date()
, luego debe usar.strftime
para convertirlo al formato deseado.NVDA
que me llevará a este enlace , encuentro que la diferencia es aún mayor.NVIDIA
que también está en EST. Buscaré una solución, pero ahora no tengo idea de por qué sucede esto.La sección actualizada de esta respuesta describe la causa raíz de las diferencias de fechas.
RESPUESTA ORIGINAL
Algunos de los valores sin formato en su JSON son marcas de tiempo UNIX.
Referencia de su código con modificaciones:
1564272000 es el número de segundos transcurridos desde el 1 de enero de 1970. Esta fecha fue el inicio de la época de Unix y la hora está en hora universal coordinada (UTC). 1564272000 es el equivalente a: 28/07/2019 12:00 am (UTC).
Puede convertir estas marcas de tiempo a un formato de fecha y hora estándar utilizando las funciones integradas de Python
Esto todavía no resuelve su problema original relacionado con las fechas JSON y las fechas de columna que a veces son diferentes. Pero aquí está mi hipótesis actual relacionada con las disparidades de fechas que están ocurriendo.
La fecha json (fmt y raw) que se extraen de root.App.main están en Tiempo Universal Coordinado (UTC). Esto está claro debido a la marca de tiempo de UNIX en bruto .
Las fechas que se muestran en las columnas de la tabla parecen estar en la zona horaria de la hora estándar del este (EST). EST es actualmente UTC-4. Lo que significa que 2019-07-28 22:00 (10pm) EST sería 2019-07-29 02:00 (2am) UTC. El servidor que aloja finance.yahoo.com parece estar en los Estados Unidos, según los resultados de traceroute . Estos valores también están en el archivo json :
También existe la posibilidad de que algunas de las diferencias de fecha estén vinculadas con el código React subyacente , que utiliza el sitio. Este problema es más difícil de diagnosticar porque el código no es visible.
En este momento, creo que la mejor solución sería utilizar la marca de tiempo UNIX como referencia de tiempo de verdad. Esta referencia podría usarse para reemplazar la fecha de la columna de la tabla.
Definitivamente, hay algún tipo de conversión entre el archivo JSON y las columnas.
PERO la fecha de la columna de Ingresos totales debe ser 28/06/2019 (EDT), porque la marca de tiempo UNIX para 1561766400 es 29/06/2019 12:00 am (UTC).
La disparidad con DELL es mayor que una marca de tiempo UNIX básica y una conversión de marca de tiempo EDT.
Si convertimos la marca de tiempo UNIX en una marca de tiempo EDT, el resultado sería 8/1/2019, pero ese no es el caso en el ejemplo de DELL, que es 31/07/2019. Algo dentro de la base del código de Yahoo tiene que estar causando esta diferencia.
Estoy empezando a creer que React podría ser el culpable de estas diferencias de fechas, pero no puedo estar seguro sin investigar más.
Si React es la causa raíz, entonces la mejor opción sería utilizar los elementos de fecha de los datos JSON.
RESPUESTA ACTUALIZADA 10-17-2019
Este problema es muy interesante, porque parece que las fechas de estas columnas están vinculadas al final oficial del trimestre fiscal de una empresa y no a un problema de conversación de fecha.
Aquí hay varios ejemplos para
Sus fechas de columna son:
Estas fechas coinciden con estos trimestres fiscales.
Estas fechas de finalización del trimestre fiscal pueden variar mucho, como lo muestra este ejemplo de DELL.
DELL (publicado en NASDAQ) Fin del trimestre fiscal: julio de 2019
Fecha de la columna de Yahoo Finance : 31/07/2019
Fecha JSON: 2019-08-02
Desde el sitio web de la compañía:
NOTA: Las fechas 05-03-19 y 08-02-19.
Estos son de los datos del trimestre JSON para DELL:
Parece que estas fechas de columna están vinculadas a las fechas de finalización del trimestre fiscal de una empresa. Por lo tanto, recomendaría que use la fecha JSON como elemento de referencia principal o la fecha de columna correspondiente.
PD: Hay algún tipo de vudú de fechas en Yahoo, porque parecen mover estas fechas de trimestre de columna en función de días festivos, fines de semana y fines de mes.
fuente
En lugar de obtener el
fmt
deconcerning_date
, es mejor obtener la marca de tiempo.En el ejemplo anterior, obtendrá el resultado
1561852800
que puede transferir a una fecha con una determinada zona horaria. (Sugerencia: usodatetime
ypytz
). Esta marca de tiempo arrojará los siguientes resultados según la zona horaria:fuente