本文共 1915 字,大约阅读时间需要 6 分钟。
网上好多查询天气的API接口,使用简单,页面还好看。
自己写一遍代码,会收获多一些。暂时不考虑页面和查询结果的美观,大概如下。
上面的天气结果来自:
对应的网页源代码:
14日白天
多云
34°C
微风
日出 05:53
14日夜间
多云
26°C
微风
日落 18:13
先用爬虫来抓取需要的数据。
首先,要根据输入城市名找到对应的城市ID。(用python中的字典,中国天气网提供了,使用Excel、记事本就可以批量完成)
写了一个单独的文件citycode.py:
然后,根据不同的城市,用不同的URL得到查询结果。
from urllib.request import urlopenfrom bs4 import BeautifulSoupfrom 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,requestfrom flask_wtf import FlaskFormfrom wtforms import StringField, validatorsfrom weather import get_weatherapp = 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
:
flaskapp
{
{ result}}能改进的还有好多,先这样啊。
好想有份工作,结合着工作来学习。
不然学习成本太高了,而且这都毕业两个多月了,还没有工作,真的说不过去。