Я бы хотел сделать следующее.
1) Перейти к https://www.wunderground.com/history
2) Отправьте форму со следующими значениями:
Location = 'Лос-Анджелес, Калифорния'
Месяц = 'ноябрь'
День = '02'
Год = '2017'
3) Получить ответ и сохранить в файл
Вот что у меня есть на данный момент, но не работает:
import requests
url = 'https://www.wunderground.com/history'
payload = {'code': 'Los Angeles, CA', 'month': 'November', 'day': '2', 'year':'2017'}
r = requests.post(url, params=payload)
with open('test.html', 'w') as f:
f.write(r.text)
Я не получаю ожидаемого ответа и не уверен, правильно ли я использую запросы.
Я знаю, что есть API от wunderground, но пока предпочитаю не использовать его.
Содержимое test.html - это в основном исходная страница без исторических данных.
Я жду эту страницу:
Содержимое r.text или test.html - это в основном исходная страница без исторических данных.






Попробуйте requests.get вместо requests.post, поскольку кажется, что параметры должны быть предоставлены с помощью GET.
import requests
url = 'https://www.wunderground.com/history'
payload = {'code': 'Los Angeles, CA', 'month': 'November', 'day': '2', 'year':'2017'}
r_get = requests.get(url, params=payload)
r_post = requests.post(url, params=payload)
assert r_get != r_post
Подробнее о GET и POST: https://www.w3schools.com/tags/ref_httpmethods.asp
Нельзя слепо отправлять полезные данные на некоторые сайты и ожидать хорошего результата. Сначала посмотрите исходный код элемента form. Я удалил некоторые неважные детали:
<form action = "/cgi-bin/findweather/getForecast" method = "get" id = "trip">
<input type = "hidden" value = "query" name = "airportorwmo" />
<input type = "hidden" value = "DailyHistory" name = "historytype" />
<input type = "hidden" value = "/history/index.html" name = "backurl" />
<input type = "text" value = "" name = "code" id = "histSearch" />
<select class = "month" name = "month">
<option value = "1">January</option>
<option value = "2">February</option>
...
<option value = "12">December</option>
</select>
<select class = "day" name = "day">
<option>1</option>
<option>2</option>
...
<option>31</option>
</select>
<select class = "year" name = "year">
<option>2018</option>
<option>2017</option>
...
<option>1945</option>
</select>
<input type = "submit" value = "Submit" class = "button radius" />
</form>
Во-первых, из атрибута method элемента form вы можете видеть, что для отправки полезной нагрузки необходимо использовать метод GET, а не POST. Во-вторых, из атрибута action вы также можете увидеть, что вы должны отправить эту полезную нагрузку на этот конкретный URL:
https://www.wunderground.com/cgi-bin/findweather/getForecast
Сама полезная нагрузка - это не просто значения, которые вы хотите отправить. Во многих случаях необходимо отправить дополнительные значения, чтобы веб-сервер правильно ответил. Обычно лучше всего либо отправить все (в основном, каждый атрибут name), либо проверить, что на самом деле отправляет веб-сайт.
Этот код работает для меня:
import requests
URL = 'https://www.wunderground.com/cgi-bin/findweather/getForecast'
CODE = 'Los Angeles, CA'
DAY = 2
MONTH = 11
YEAR = 2017
params = {
'airportorwmo': 'query',
'historytype': 'DailyHistory',
'backurl': '/history/index.html',
'code': CODE,
'day': DAY,
'month': MONTH,
'year': YEAR,
}
r = requests.get(URL, params=params)
print(r.text)
Большое спасибо! Я делал GET для URL-адреса '/ cgi-bin / findweather / getForecast', но я не включил скрытые формы. Это был недостающий элемент.
что такое
r.textи ваш ожидаемый ответ?