如何使用Python在wundergroundhistorypag中提交表单

2024-06-28 11:39:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做以下工作。你知道吗

1)转到https://www.wunderground.com/history

2)提交带有以下值的表格:

位置='加利福尼亚州洛杉矶'

月='十一月'

日期='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)

我没有得到预期的响应,也不确定是否正确使用了请求。你知道吗

我知道有一个来自wunderground的API,但现在不想使用它。你知道吗

内容测试.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&reqdb.wmo=99999


Tags: httpscomurlhtmlwwwrequestsreqhistory
2条回答

你不能盲目地发送有效载荷到一些网站,并期待一个好的结果。首先,查看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>

首先,从form元素的method属性可以看出,必须使用GET方法而不是POST来发送有效负载。第二,从action属性中,您还可以看到应该将有效负载发送到此特定URL:

https://www.wunderground.com/cgi-bin/findweather/getForecast

有效负载本身不仅仅是要发送的值。在许多情况下,必须发送附加值才能使web服务器正确响应。通常最好要么发送所有内容(基本上是每个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)

尝试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 vs POST的更多信息:https://www.w3schools.com/tags/ref_httpmethods.asp

相关问题 更多 >