如何将表单数据中的Post国家代码Url得到预期的WebData?
How to Post Country Codes in Form Data to Url to Get Expected WebData?
我想在不登录的情况下从https://tradingeconomics.com/calendar下载特定国家/地区的日历。
首先,为了获得所需的国家数据,我 POST 表格中的国家代码为“https://sso.tradingeconomics.com/api/UserOptions”。
其次,我刷新了网页“https://tradingeconomics.com/calendar”。但是什么都没有更新。
这是我的 post 国家代码。在此示例脚本中,我尝试仅获取 Australia('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)
然后我将网页放入 table,它会返回所有默认国家/地区的日历。
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!!!")
我想当我post国家代码时,我需要留在会话中等待网页刷新。或者还有其他我错过的事情。
感谢您的帮助。
几天后我想通了。
我只需要在请求发送的 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
我想在不登录的情况下从https://tradingeconomics.com/calendar下载特定国家/地区的日历。
首先,为了获得所需的国家数据,我 POST 表格中的国家代码为“https://sso.tradingeconomics.com/api/UserOptions”。
其次,我刷新了网页“https://tradingeconomics.com/calendar”。但是什么都没有更新。
这是我的 post 国家代码。在此示例脚本中,我尝试仅获取 Australia('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)
然后我将网页放入 table,它会返回所有默认国家/地区的日历。
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!!!")
我想当我post国家代码时,我需要留在会话中等待网页刷新。或者还有其他我错过的事情。 感谢您的帮助。
几天后我想通了。 我只需要在请求发送的 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