如何使用 Python 在 Wunderground 历史页面中提交表单
How to use Python to submit form within Wunderground History page
我想做以下事情。
1) 转到 https://www.wunderground.com/history
2) 使用以下值提交表单:
位置 = 'Los Angeles, CA'
月份='November'
天 = '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,但目前不想使用它。
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>
首先,从 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)
我想做以下事情。
1) 转到 https://www.wunderground.com/history
2) 使用以下值提交表单:
位置 = 'Los Angeles, CA'
月份='November'
天 = '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,但目前不想使用它。
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>
首先,从 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)