Как использовать Python для отправки формы на странице истории Wunderground

Я бы хотел сделать следующее.

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 - это в основном исходная страница без исторических данных.

Я жду эту страницу:

https://www.wunderground.com/history/airport/KCQT/2017/11/2/DailyHistory.html?req_city=Los+Angeles&req_state=CA&req_statename=California&reqdb.zip=90012&reqdb.magic=1&=qd99b.magic=1&=qd99b

что такое r.text и ваш ожидаемый ответ?

Joseph D. 09.04.2018 10:16

Содержимое r.text или test.html - это в основном исходная страница без исторических данных.

Le Vu 09.04.2018 10:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте 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', но я не включил скрытые формы. Это был недостающий элемент.

Le Vu 09.04.2018 19:06

Другие вопросы по теме