结合bs4, 在flask应用中查询天气

124 篇文章 0 订阅

网上好多查询天气的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>

能改进的还有好多,先这样啊。

好想有份工作,结合着工作来学习。
不然学习成本太高了,而且这都毕业两个多月了,还没有工作,真的说不过去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值