网上好多查询天气的API接口,使用简单,页面还好看。
自己写一遍代码,会收获多一些。
暂时不考虑页面和查询结果的美观,大概如下。
上面的天气结果来自中国天气网:
对应的网页源代码:
<div class="t">
<div class="sk">
</div>
<ul class="clearfix">
<li>
<h1>14日白天</h1>
<big class="jpg80 d01"></big>
<p class="wea" title="多云">多云</p>
<p class="tem">
<span>34</span><em>°C</em>
</p>
<p class="win">
<i class=""></i>
<span class="" title="无持续风向">微风</span>
</p>
<p class="sun sunUp"><i></i>
<span>日出 05:53</span>
</p>
<div class="slid"></div>
</li>
<li>
<h1>14日夜间</h1>
<big class="jpg80 n01"></big>
<p class="wea" title="多云">多云</p>
<p class="tem">
<span>26</span><em>°C</em>
</p>
<p class="win"><i class=""></i><span class="" title="无持续风向">微风</span></p>
<p class="sun sunDown"><i></i>
<span>日落 18:13</span>
</p>
</li>
</ul>
</div>
先用爬虫来抓取需要的数据。
首先,要根据输入城市名找到对应的城市ID。(用python中的字典,中国天气网提供了城市ID列表,使用Excel、记事本就可以批量完成)
写了一个单独的文件citycode.py:
然后,根据不同的城市,用不同的URL得到查询结果。
from urllib.request import urlopen
from bs4 import BeautifulSoup
from citycode import citycode
#写在了函数里,需要传递城市名参数
def get_weather(cityname):
prefix = 'http://www.weather.com.cn/weather1d/'
suffix = '.shtml'
# 根据用户输入城市名找到对应的城市编码id
city_id = citycode[cityname]
#完整的URL
url = prefix + str(city_id) + suffix
htmldoc = urlopen(url)
soup = BeautifulSoup(htmldoc,"html.parser")
soup1 = soup.find('div','t')
# 这是今天的天气信息
result_almost = soup1.ul
# 这样直接当最后结果,调用函数后返回这个结果
result = result_almost.get_text()
return result
然后在flask 应用中调用这个get_weather
函数。
from flask import Flask, render_template,request
from flask_wtf import FlaskForm
from wtforms import StringField, validators
from weather import get_weather
app = Flask(__name__)
#使用了wtforms,虽然web form内容很少
class WeatherForm(FlaskForm):
city = StringField('City', [validators.Length(min=0, max=10)])
@app.route("/weather",methods=['GET','POST'])
def weather():
form = WeatherForm(request.form)
if request.method == 'POST':
city = form.city.data
result = get_weather(city) # 调用get_weather函数来抓取天气信息,同时将结果传递到weather.html模板中。
return render_template('weather.html',form=form,result=result)
return render_template('weather.html',form=form)
if __name__ == '__main__':
app.secret_key="It doesn't matter"
app.run(debug=True)
然后,weather.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>flaskapp</title>
</head>
<body>
<form method="POST",action="">
{{ form.csrf_token }}
{{form.city}} <!-- 这里使用的是flask代码中定义的Weatherform中的city属性,即一个类型为text的input元素 -->
<input type="submit" value="查询">
</form>
<div>
<h1>{{form.city.data}}</h1> <!-- 这里将用户输入的城市名作为一级标题 -->
<p>{{result}}</p> <!-- 这里是爬虫结果,即天气信息 -->
</div>
</body>
</html>
能改进的还有好多,先这样啊。
好想有份工作,结合着工作来学习。
不然学习成本太高了,而且这都毕业两个多月了,还没有工作,真的说不过去。