Eu criei um script em python para analisar dois campos de uma página da web - total revenue
e é preocupante date
. Os campos que eu busco são javascript criptografados. Eles estão disponíveis na fonte da página dentro da matriz json. O script a seguir pode analisar esses dois campos de acordo.
No entanto, o problema é que a data visível nessa página é diferente daquela disponível na origem da página.
A data em que a página web é como este
A data no código fonte da página é como este
Existe claramente uma variação de um dia.
Depois de visitar a página da Web, quando você clica nessa guia, Quarterly
pode ver os resultados:
Eu tentei com:
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 recebo (receita em milhões):
802000000 2019-06-30
Resultado que desejo obter:
802000000 2019-06-29
Quando tento com esse ticker AAPL
, obtenho a data exata, portanto, subtrair ou adicionar um dia não é uma opção.
Como posso obter a data exata desse site ?
Btw, eu sei como obtê-los usando selênio, então eu só gostaria de manter requests
.
Respostas:
Conforme mencionado nos comentários, você precisa converter a data no fuso horário apropriado (EST), o que pode ser feito com datetime e
dateutil
.Aqui está um exemplo de trabalho:
fonte
06-29-2019
vez de2019-06-29 19:00:00-05:00
? Obrigado..date()
, então você precisa usá.strftime
-lo para convertê-lo no formato desejado.NVDA
que levará a esse link , acho que a diferença é ainda maior.NVIDIA
também está no EST. Vou procurar uma solução, mas agora não tenho noção do por que isso está acontecendo.A seção atualizada desta resposta descreve a causa raiz das diferenças de data.
RESPOSTA ORIGINAL
Alguns dos valores brutos em seu JSON são carimbos de data e hora do UNIX.
Referência do seu código com modificações:
1564272000 é o número de segundos decorridos desde 01 de janeiro de 1970. Esta data foi o início da época do Unix e a hora está no Tempo Universal Coordenado (UTC). 1564272000 é o equivalente a: 28/07/2019 00:00 (UTC).
Você pode ocultar esses registros de data e hora em um formato padrão de data e hora usando funções Python internas
Isso ainda não resolve o problema original relacionado às datas JSON e às datas da coluna sendo diferentes às vezes. Mas aqui está minha hipótese atual relacionada às disparidades de data que estão ocorrendo.
A data json (fmt e raw) que está sendo extraída do root.App.main está no Tempo Universal Coordenado (UTC). Isso fica claro devido ao carimbo de data e hora do UNIX em bruto .
As datas exibidas nas colunas da tabela parecem estar no fuso horário da hora padrão do leste (EST). EST é atualmente UTC-4. O que significa que 2019-07-28 22:00 (22:00) EST seria 2019-07-29 02:00 (02:00) UTC. O servidor que hospeda o finance.yahoo.com parece estar nos Estados Unidos, com base nos resultados do traceroute . Esses valores também estão no arquivo json :
Também existe a possibilidade de que algumas diferenças de data estejam vinculadas ao código React subjacente , usado pelo site. Esse problema é mais difícil de diagnosticar, porque o código não está visível.
No momento, acredito que a melhor solução seria usar o registro de data e hora do UNIX como referência de hora da verdade. Esta referência pode ser usada para substituir a data da coluna da tabela.
Definitivamente, existe algum tipo de conversão acontecendo entre o arquivo JSON e as colunas.
MAS a data da coluna Receita total deve ser 28/06/2019 (EDT), porque o registro de data e hora UNIX para 1561766400 é 29/06/2019 00:00 (UTC).
A disparidade com a DELL é maior que um registro de data e hora básico do UNIX e uma conversão de registro de data e hora do EDT.
Se convertermos o registro de data e hora do UNIX em um registro de data e hora de EDT, o resultado será 1/8/2019, mas esse não é o caso no exemplo da DELL, que é 31/07/2019. Algo na base de códigos do Yahoo deve estar causando essa diferença.
Estou começando a acreditar que o React pode ser o culpado com essas diferenças de datas, mas não posso ter certeza sem fazer mais pesquisas.
Se React for a causa raiz, a melhor opção seria usar os elementos de data dos dados JSON.
RESPOSTA ATUALIZADA 10-17-2019
Esse problema é muito interessante, porque parece que essas datas da coluna estão vinculadas ao final oficial do trimestre fiscal de uma empresa e não a um problema de conversação de data.
Aqui estão vários exemplos para
As datas das colunas são:
Essas datas correspondem a esses trimestres fiscais.
Essas datas de término do trimestre fiscal podem variar bastante, como mostra o exemplo da DELL.
DELL (publicado na NASDAQ) Fim do trimestre fiscal: julho de 2019
Data da coluna do Yahoo Finance : 31/07/2019
Data do JSON: 2019-08-02
No site da empresa:
NOTA: As datas 05-03-19 e 08-02-19.
Estes são dos dados trimestrais JSON da DELL:
Parece que essas datas da coluna estão vinculadas às datas de término do trimestre fiscal de uma empresa. Portanto, recomendo que você use a data JSON como elemento de referência principal ou a data da coluna correspondente.
PS: Existe algum tipo de vodu de data no Yahoo, porque eles parecem mover essas datas do trimestre da coluna com base em feriados, fins de semana e final de mês.
fonte
Em vez de obter o
fmt
deconcerning_date
, é melhor obter o carimbo de data e hora.No exemplo acima, você obterá o resultado
1561852800
que pode ser transferido para uma data com um determinado fuso horário. (Dica: usedatetime
epytz
). Esse registro de data e hora produzirá os seguintes resultados com base no fuso horário:fonte