python爬取天气数据的实例详解


Posted in Python onNovember 20, 2020

就在前几天还是二十多度的舒适温度,今天一下子就变成了个位数,小编已经感受到冬天寒风的无情了。之前对获取天气都是数据上的搜集,做成了一个数据表后,对温度变化的感知并不直观。那么,我们能不能用python中的方法做一个天气数据分析的图形,帮助我们更直接的看出天气变化呢?

使用pygal绘图,使用该模块前需先安装pip install pygal,然后导入import pygal

bar = pygal.Line() # 创建折线图
bar.add('最低气温', lows)  #添加两线的数据序列
bar.add('最高气温', highs) #注意lows和highs是int型的列表
bar.x_labels = daytimes
bar.x_labels_major = daytimes[::30]
bar.x_label_rotation = 45
bar.title = cityname+'未来七天气温走向图'  #设置图形标题
bar.x_title = '日期'  #x轴标题
bar.y_title = '气温(摄氏度)' # y轴标题
bar.legend_at_bottom = True
bar.show_x_guides = False
bar.show_y_guides = True
bar.render_to_file('temperate1.svg') # 将图像保存为SVG文件,可通过浏览器

最终生成的图形如下图所示,直观的显示了天气情况:

python爬取天气数据的实例详解

完整代码

import csv
import sys
import urllib.request
from bs4 import BeautifulSoup # 解析页面模块
import pygal
import cityinfo
 
cityname = input("请输入你想要查询天气的城市:")
if cityname in cityinfo.city:
  citycode = cityinfo.city[cityname]
else:
  sys.exit()
url = '非常抱歉,网页无法访问' + citycode + '.shtml'
header = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36") # 设置头部信息
http_handler = urllib.request.HTTPHandler()
opener = urllib.request.build_opener(http_handler) # 修改头部信息
opener.addheaders = [header]
request = urllib.request.Request(url) # 制作请求
response = opener.open(request) # 得到应答包
html = response.read() # 读取应答包
html = html.decode('utf-8') # 设置编码,否则会乱码
# 根据得到的页面信息进行初步筛选过滤
final = [] # 初始化一个列表保存数据
bs = BeautifulSoup(html, "html.parser") # 创建BeautifulSoup对象
body = bs.body
data = body.find('div', {'id': '7d'})
print(type(data))
ul = data.find('ul')
li = ul.find_all('li')
# 爬取自己需要的数据
i = 0 # 控制爬取的天数
lows = [] # 保存低温
highs = [] # 保存高温
daytimes = [] # 保存日期
weathers = [] # 保存天气
for day in li: # 便利找到的每一个li
  if i < 7:
    temp = [] # 临时存放每天的数据
    date = day.find('h1').string # 得到日期
    #print(date)
    temp.append(date)
    daytimes.append(date)
    inf = day.find_all('p') # 遍历li下面的p标签 有多个p需要使用find_all 而不是find
    #print(inf[0].string) # 提取第一个p标签的值,即天气
    temp.append(inf[0].string)
    weathers.append(inf[0].string)
    temlow = inf[1].find('i').string # 最低气温
    if inf[1].find('span') is None: # 天气预报可能没有最高气温
      temhigh = None
      temperate = temlow
    else:
      temhigh = inf[1].find('span').string # 最高气温
      temhigh = temhigh.replace('℃', '')
      temperate = temhigh + '/' + temlow
    # temp.append(temhigh)
    # temp.append(temlow)
    lowStr = ""
    lowStr = lowStr.join(temlow.string)
    lows.append(int(lowStr[:-1])) # 以上三行将低温NavigableString转成int类型并存入低温列表
    if temhigh is None:
      highs.append(int(lowStr[:-1]))
      highStr = ""
      highStr = highStr.join(temhigh)
      highs.append(int(highStr)) # 以上三行将高温NavigableString转成int类型并存入高温列表
    temp.append(temperate)
    final.append(temp)
    i = i + 1
# 将最终的获取的天气写入csv文件
with open('weather.csv', 'a', errors='ignore', newline='') as f:
  f_csv = csv.writer(f)
  f_csv.writerows([cityname])
  f_csv.writerows(final)
# 绘图
bar = pygal.Line() # 创建折线图
bar.add('最低气温', lows)
bar.add('最高气温', highs)
bar.x_labels = daytimes
bar.x_labels_major = daytimes[::30]
# bar.show_minor_x_labels = False # 不显示X轴最小刻度
bar.x_label_rotation = 45
bar.title = cityname+'未来七天气温走向图'
bar.x_title = '日期'
bar.y_title = '气温(摄氏度)'
bar.legend_at_bottom = True
bar.show_x_guides = False
bar.show_y_guides = True
bar.render_to_file('temperate.svg')

Python爬取天气数据实例扩展:

import requests
from bs4 import BeautifulSoup
from pyecharts import Bar

ALL_DATA = []
def send_parse_urls(start_urls):
  headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
  }
  for start_url in start_urls:
    response = requests.get(start_url,headers=headers)
    # 编码问题的解决
    response = response.text.encode("raw_unicode_escape").decode("utf-8")
    soup = BeautifulSoup(response,"html5lib") #lxml解析器:性能比较好,html5lib:适合页面结构比较混乱的
    div_tatall = soup.find("div",class_="conMidtab") #find() 找符合要求的第一个元素
    tables = div_tatall.find_all("table") #find_all() 找到符合要求的所有元素的列表
    for table in tables:
      trs = table.find_all("tr")
      info_trs = trs[2:]
      for index,info_tr in enumerate(info_trs): # 枚举函数,可以获得索引
        # print(index,info_tr)
        # print("="*30)
        city_td = info_tr.find_all("td")[0]
        temp_td = info_tr.find_all("td")[6]
        # if的判断的index的特殊情况应该在一般情况的后面,把之前的数据覆盖
        if index==0:
          city_td = info_tr.find_all("td")[1]
          temp_td = info_tr.find_all("td")[7]
        city=list(city_td.stripped_strings)[0]
        temp=list(temp_td.stripped_strings)[0]
        ALL_DATA.append({"city":city,"temp":temp})
  return ALL_DATA

def get_start_urls():
  start_urls = [
    "http://www.weather.com.cn/textFC/hb.shtml",
    "http://www.weather.com.cn/textFC/db.shtml",
    "http://www.weather.com.cn/textFC/hd.shtml",
    "http://www.weather.com.cn/textFC/hz.shtml",
    "http://www.weather.com.cn/textFC/hn.shtml",
    "http://www.weather.com.cn/textFC/xb.shtml",
    "http://www.weather.com.cn/textFC/xn.shtml",
    "http://www.weather.com.cn/textFC/gat.shtml",
  ]
  return start_urls

def main():
  """
  主程序逻辑
  展示全国实时温度最低的十个城市气温排行榜的柱状图
  """
  # 1 获取所有起始url
  start_urls = get_start_urls()
  # 2 发送请求获取响应、解析页面
  data = send_parse_urls(start_urls)
  # print(data)
  # 4 数据可视化
    #1排序
  data.sort(key=lambda data:int(data["temp"]))
    #2切片,选择出温度最低的十个城市和温度值
  show_data = data[:10]
    #3分出城市和温度
  city = list(map(lambda data:data["city"],show_data))
  temp = list(map(lambda data:int(data["temp"]),show_data))
    #4创建柱状图、生成目标图
  chart = Bar("中国最低气温排行榜") #需要安装pyechart模块
  chart.add("",city,temp)
  chart.render("tempture.html")

if __name__ == '__main__':
  main()

到此这篇关于python爬取天气数据的实例详解的文章就介绍到这了,更多相关python爬虫天气数据的分析内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
从零学python系列之从文件读取和保存数据
May 23 Python
Python多线程、异步+多进程爬虫实现代码
Feb 17 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
python实现随机漫步算法
Aug 27 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
python求质数列表的例子
Nov 24 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
python lambda的使用详解
Feb 26 Python
python numpy中setdiff1d的用法说明
Apr 22 Python
python爬取招聘要求等信息实例
Nov 20 #Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 #Python
Python getsizeof()和getsize()区分详解
Nov 20 #Python
Python析构函数__del__定义原理解析
Nov 20 #Python
Python request post上传文件常见要点
Nov 20 #Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 #Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 #Python
You might like
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
Promise扫盲贴
2019/06/24 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python用700行代码实现http客户端
2021/01/14 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
物理系毕业生自荐书
2014/06/13 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
2014年内勤工作总结
2014/11/24 职场文书
办公室主任个人总结
2015/02/28 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
2015年电教工作总结
2015/05/26 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
JavaScript数组 几个常用方法总结
2021/11/11 Javascript