我尝试过使用带有参数的get请求,使用json.dumps和不使用json.dumps来发布请求,但是我似乎无法从网页中获得正确的响应。
我想找回包含所有天气数据的文本文件。我的代码,我的数据 想要,而使用chrome上的inspect的发布请求的标头是 附上。
谢谢您的帮助!
您还可以通过
获取数据然后输入NY City Central Park作为车站选择,然后返回 搜索该电台的结果,然后单击搜索。
以下是屏幕截图:
从urllib.request导入urlopen作为uReq 从bs4进口BeautifulSoup作为汤 汇入要求 导入日期时间 导入json
payload = {'method':'POST','params':{“ elems”:[{“ name”:“ maxt”,“ add”:“ t”}, {“名称”:“薄荷”,“添加”:“ t”},{“名称”:“ pcpn”,“添加”:“ t”}, {“ name”:“雪”,“添加”:“ t”},{“名称”:“ snwd”,“添加”:“ t”}],“ sId”:“ 94728 1“,” sDate“:” 2018-06-01“,” eDate“:” 2018-06-28“},'output':'json'}
参数= {“元素”:[{“名称”:“最大”,“添加”:“ t”},{“名称”:“薄荷”,“添加”:“ t”}, {“ name”:“ pcpn”,“ add”:“ t”},{“ name”:“ snow”,“ add”:“ t”}, {“ name”:“ snwd”,“ add”:“ t”}],“ sid”:“ 94728 1”,“ sDate”:“ 2018-06- 01“,” eDate“:” 2018-06-28“}
headers = {'Accept':'application / json,text / javascript, / ; q = 0.01','Content-Type':'application / x-www-form-urlencoded;字符集= UTF- 8','Origin':'http://climod2.nrcc.cornell.edu','Referer':'http://climod2.nrcc.cornell.edu/elems=name&elems=add&elems=name&elems=add&elems=name&elems=add&elems=name&elems=add&elems=name&elems=add&sDate=2018-06-01&eDate=2018-06-28&meta=name&meta=state&meta=ll&meta=sids&bbox=-74.44262803978918&bbox=40.4207924883181&bbox=-73.4880821602','User-Agent':'Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36( KHTML,例如Gecko)Chrome / 67.0.3396.87 Safari / 537.36'}
dataurl ='https://data.rcc-acis.org/StnData'
r = requests.post(dataurl,data = json.dumps(payload),headers = headers)
打印(r.status_code) 打印(经过时间) 打印(r.json) print(r.text)`
答案 0 :(得分:1)
您只需要正确设置有效载荷即可。
这可以解决问题。
import requests
from pprint import pprint
url = "https://data.rcc-acis.org/StnMeta"
payload = {
"output": "json",
"params": {"elems":[{"name":"maxt","add":"t"},{"name":"mint","add":"t"},{"name":"pcpn","add":"t"},{"name":"snow","add":"t"},{"name":"snwd","add":"t"}],"sDate":"2018-06-01","eDate":"2018-06-29","meta":["name","state","ll","sids"],"bbox":[-74.44262803978918,40.4207924883181,-73.48808216021084,41.144936911681896]}
}
r = requests.post(url, json=payload)
data = r.json()
名为data的对象现在将包含每个具有天气数据的地方的字典列表。每个字典除其他外还包含一个sid,您需要将其反馈给返回实际天气数据的端点。
每个字典将如下所示:
{'ll': [-74.42259, 40.47282],
'name': 'NEW BRUNSWICK 3 SE',
'sids': ['286055 2', 'USC00286055 6', 'NBRN4 7'],
'state': 'NJ'}
假设您要遍历所有这些并返回每个气象数据,则首先需要获取sid并将其存储在列表中
其中一些不包含天气数据。它们将如下所示:
"US1NJES0018 6"
...而那些有气象数据的人中没有字母。可以使用正则表达式来利用它来过滤掉所有带有字母的sid。
因此将其附加到代码中:
import re # the regex library
sids_list = []
is_garbage = re.compile('[a-zA-z]+') # will match everything with a letter in
meta = data['meta']
for m in meta:
name = m['name']
sid = m['sids'][0]
if not is_garbage.search(sid):
sids_list.append([name,sid])
现在您有了sid的列表,所有您需要做的就是在最终端点上使用正确的有效负载,设置所需数据的日期-并开始循环。
start_date = "2018-06-01"
end_date = "2018-07-01"
for name, sid in sids_list:
print("------------- DATA FOR {} (sid: {}) -------------".format(name,sid))
print()
payload2 = {
"params": {
"elems":
[
{"name":"maxt","add":"t"},
{"name":"mint","add":"t"},
{"name":"pcpn","add":"t"},
{"name":"snow","add":"t"},
{"name":"snwd","add":"t"}
],
"sid": sid,
"sDate":start_date,
"eDate":end_date},
"output": "json"
}
weather_url = "https://data.rcc-acis.org/StnData"
r = requests.post(weather_url, json=payload2)
weather_data = r.json()['data']
print("{:15}{:15}{:15}{:15}{:15}{:15}".format("Date", "MaxTemperature", "MinTemperature", "Precipitation", "Snowfall", "SnowDepth"))
for Date, MaxTemperature, MinTemperature, Precipitation, Snowfall, SnowDepth in weather_data:
print("{:15}{:15}{:15}{:15}{:15}{:15}".format(Date, MaxTemperature[0], MinTemperature[0], Precipitation[0], Snowfall[0], SnowDepth[0]))
print()
在这里,我只是以一种格式正确的视图将数据打印到屏幕上。希望这能解决您的问题。干杯。