如何将表单数据中的国家/地区代码发布到 url 以获得预期的网络数据?



我正在尝试在不登录的情况下从 https://tradingeconomics.com/calendar 下载特定国家的日历。

首先,为了获得所需的国家数据,我将国家代码以表格形式发布到"https://sso.tradingeconomics.com/api/UserOptions"。

其次,我刷新了网页"https://tradingeconomics.com/calendar"。但是什么都没有更新。

这是我发布国家/地区代码的代码。在此示例脚本中,我尝试仅获取澳大利亚('list[0][Value]': 'aus'(日历,但它会重新调整所有默认国家/地区的日历。

import requests
import json
session = requests.session()
url = 'https://tradingeconomics.com/calendar'
page = session.get(url)
Logincookies = page.cookies
user_opt_url = "https://sso.tradingeconomics.com"
heads= {
'authority': 'sso.tradingeconomics.com',
'method': 'POST',
'path': '/api/UserOptions',
'scheme': 'https',
'accept': 'application/json, text/javascript, */*; q=0.01',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
'content-length': '418',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'origin': 'https://tradingeconomics.com',
'referer': 'https://tradingeconomics.com/calendar',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
data = {
'list[0][Host]': 'tradingeconomics.com',
'list[0][Env]': '/calendar',
'list[0][Name]': 'te-cal-countries',
'list[0][Value]': 'aus',
'list[1][Host]': 'tradingeconomics.com',
'list[1][Env]': "/calendar",
'list[1][Name]': 'te-cal-range',
'list[1][Value]': '1',
'list[2][Host]': 'tradingeconomics.com',
'list[2][Env]': '/calendar',
'list[2][Name]': 'te-cal-importance',
'list[2][Value]': '1',
}
page = session.post(user_opt_url, headers = heads, data= json.dumps(data), cookies = Logincookies)
page = session.get(url)

然后我把网页放到一个表格中,它会重新调整所有默认国家的日历。

from bs4 import BeautifulSoup
doc = BeautifulSoup(page.text, 'lxml')
ntr = doc.find_all('table')[1].select('tr[data-url^=""]')
lst = []
for n in ntr:
if n.select('th'):
lst = lst + [n.select('th')[0].get_text().strip(),  # date
None,  # time
None,  # lvl
None,  # country
None,  # event
None,  # actual
None,  # previous
None,  # revised
None,  # consensus
None,  # forecast
]
elif n.select('td'):
lst = lst + [None,  # date
n.select('span[class^="calendar-date"]')[0].get_text().strip() if n.select(
'span[class^="calendar-date"]') else None,  # time
n.select('span[class^="calendar-date"]')[0]['class'][0].strip() if n.select(
'span[class^="calendar-date"]') else None,  # lvl
n.select('div[class^="flag"]')[0]['title'].strip() if n.select('div[class^="flag"]') else None,
# country
n.select('a[class="calendar-event"]')[0].get_text().strip() if n.select(
'a[class="calendar-event"]') else
n.select('span')[1].get_text().strip() if n.select('span') else None,  # event,这个筛选条件很弱
n.select('span[id="actual"]')[0].get_text().strip() if n.select('span[id="actual"]') else None,
# actual
n.select('span[id="previous"]')[0].get_text().strip() if n.select(
'span[id="previous"]') else None,  # previous
n.select('span[id="revised"]')[0].get_text().strip() if n.select(
'span[id="revised"]') else None,  # revised
n.select('span[id="consensus"]')[0].get_text().strip() if n.select(
'span[id="consensus"]') else None,  # consensus
n.select('span[id="forecast"]')[0].get_text().strip() if n.select(
'span[id="forecast"]') else None,  # forecast
]
else:
print("error!!!")  

我想当我发布国家/地区代码时,我需要留在会话中并等待网页刷新。或者还有其他我错过的东西。 感谢您的帮助。

几天后我想通了。 我所需要的只是在应请求发送的 cookie 中添加几行。

req_cookies = { "te-cal-range": "1", #,0:recent,1:today,2:tmr,3:this wk, 4:next wk, 5:next Mth, -1:ytdy,-2:last wk, -3:last mth
'te-cal-importance': '1',  # 
'te-cal-countries': 'aus,bra,can,chn,emu,eun,fra,deu,ind,idn,ita,jpn,mex,rus,sau,zaf,kor,
esp,tur,gbr,usa,sgp,twn,hkg,nzl,nor,mys,tha,vnm', 
'TECalendarOffset': '480',  # GMT+480mins

最新更新