Ошибка Web Scraping Weather Data 400 - PullRequest
0 голосов
/ 28 июня 2018

Я пытался использовать запросы get с параметрами, отправлять запросы с и без json.dumps, но не могу получить правильный ответ с веб-страницы.

Я хочу получить текстовый файл со всеми данными о погоде. Мой код, данные я хочу, а заголовки для запроса на публикацию с использованием проверки на Chrome прилагается.

Спасибо за любую помощь!

Вы также можете получить данные по

  • собирается http://climod2.nrcc.cornell.edu
  • нажмите на список ежедневных данных
  • ввод даты с 01.06.18 по текущую дату
  • проверить CSV вместо HTML
  • , затем введите NY City Central Park для выбора станции, которая вернется результаты поиска с этой станции, затем нажмите кнопку идти.

    Ниже приведены скриншоты:

    1. Попытка
    2. Пришлось удалить из-за невозможности опубликовать более 8 ссылок.
    3. Заголовки
    4. Желаемые данные
    5. Данные ответа `

    из urllib.request import urlopen as uReq из bs4 импортировать BeautifulSoup как суп запросы на импорт дата импорта время импорт JSON

    payload = {'method': 'POST', 'params': {"elems": [{"name": "maxt", "add": "t"}, { "Имя": "монетный двор", "добавить": "т"}, { "имя": "pcpn", "добавить": "т"}, { "Имя": "снег", "добавить": "т"}, { "имя": "snwd", "добавить": "т"}], "Sid": "94728 1" , "SDATE": "2018-06-01", "EDATE": "2018-06-28"}, 'Выход': 'JSON'}

    parameters = {"elems": [{"name": "maxt", "add": "t"}, {"name": "mint", "add": "t"}, { "Имя": "pcpn", "добавить": "т"}, { "имя": "снег", "добавить": "т"}, {"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 = запросы.пост (dataurl, data = json.dumps (полезная нагрузка), заголовки = заголовки)

    печать (r.status_code) печать (r.elapsed) печать (r.json) печать (r.text) `

1 Ответ

0 голосов
/ 29 июня 2018

Вам просто нужно правильно установить полезную нагрузку.

Это поможет.

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

Здесь я просто печатаю данные на экране в хорошо отформатированном виде. Надеюсь, это решит вашу проблему. Приветствия.

...