Web抓取天气数据400错误

时间:2018-06-28 16:51:38

标签: python-3.x web-scraping python-requests http-post

我尝试过使用带有参数的get请求,使用json.dumps和不使用json.dumps来发布请求,但是我似乎无法从网页中获得正确的响应。

我想找回包含所有天气数据的文本文件。我的代码,我的数据 想要,而使用chrome上的inspect的发布请求的标头是 附上。

谢谢您的帮助!

您还可以通过

获取数据
  • 转到http://climod2.nrcc.cornell.edu
  • 点击每日数据列表
  • 输入日期为18年6月1日到当前日期
  • 检查csv而不是html
  • 然后输入NY City Central Park作为车站选择,然后返回 搜索该电台的结果,然后单击搜索。

    以下是屏幕截图:

    1. Attempt
    2. 由于无法发布8个以上的链接,因此无法删除。
    3. Headers
    4. Desired data
    5. Response Data `

    从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)`

1 个答案:

答案 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()

在这里,我只是以一种格式正确的视图将数据打印到屏幕上。希望这能解决您的问题。干杯。

相关问题