Desejo acessar as tabelas do seguinte site:
https://www.marketbeat.com/ratings/
No entanto, as páginas só podem ser alteradas definindo a "Data do Relatório".
Eu sei que posso alterar a data via automação do navegador... mas é muito lento e fiquei curioso para saber se existe uma maneira mais rápida. Tentei acessar o endpoint XHR, mas o payload para a data não está funcionando.
Ao inspecionar a aba Rede, vejo que há uma solicitação de postagem XHR. No entanto, se eu tentar solicitar o endpoint com um payload que define a data, recebo apenas dados do dia atual, como se eu não tivesse definido uma data. Acho que o payload não está funcionando corretamente.
from bs4 import BeautifulSoup
import pandas as pd
import requests
payload = {
"ctl00$cphPrimaryContent$txtStartDate": "09/17/2024",
}
r = requests.post('https://www.marketbeat.com/ratings/', json=payload)
soup = BeautifulSoup(r.text, 'html.parser')
tables = pd.read_html(str(soup))
Posso estar enganado e esse ponto final é de alguma forma oculto ou somente para uso interno?
Além disso, se eu usar o Selenium para alterar a "Data do Relatório", depois de usar .clear() no input_element, a página será recarregada, outro element_id será atribuído ao campo de entrada e o valor não será apagado, mas redefinido para seu valor inicial.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('https://www.marketbeat.com/ratings/')
input_element = driver.find_element(By.ID, "cphPrimaryContent_txtStartDate")#.sendKeys("value", "1/1/2023");
if(input_element.is_displayed()):
input_element.clear()
input_element.send_keys("1/1/2023")
Então isso também não funciona. Qualquer sugestão seria super útil. Obrigado.
Com
requests
isso precisa de mais obras.Primeiro ele envia como
FORM
precisadata=payload
em vez dejson=payload
Mas ele também precisa de outros valores no payload.
Não testei se ele precisa de todos os valores, mas o navegador envia todos eles.
Também precisa de outros valores que provavelmente podem mudar quando você recarrega a página.
Primeiro: eu uso
Session
aGET
página principal comCookies
.Segundo: Eu também o uso para obter valores de todos
<input>
que começam com__
Ele também precisa de um cabeçalho
X-MicrosoftAjax
para enviar novos valores.Às vezes, a conexão trava quando não tenho,
User-Agent
mas não tenho certeza se realmente preciso. Mas o servidor pode usar esse valor para detectar se é um navegador real, então eu o mantenho.Ele envia apenas esta parte que precisa ser substituída em HTML no navegador (mais alguns valores separados por
|
), masread_html
carrega sem problemas.Código funcional completo que usei para testes.