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

就在前几天还是二十多度的舒适温度,今天一下子就变成了个位数,小编已经感受到冬天寒风的无情了。之前对获取天气都是数据上的搜集,做成了一个数据表后,对温度变化的感知并不直观。那么,我们能不能用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文件,可通过浏览器

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

完整代码

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爬虫天气数据的分析内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    就在前几天还是二十多度的舒适温度,今天一下子就变成了个位数,小编已经感受到冬天寒风的无情了.之前对获取天气都是数据上的搜集,做成了一个数据表后,对温度变化的感知并不直观.那么,我们能不能用python中的方法做一个天气数据分析的图形,帮助我们更直接的看出天气变化呢? 使用pygal绘图,使用该模块前需先安装pip install pygal,然后导入import pygal bar = pygal.Line() # 创建折线图 bar.add('最低气温', lows) #添加两线的数据序列 b

  • python爬取各省降水量及可视化详解

    在具体数据的选取上,我爬取的是各省份降水量实时数据 话不多说,开始实操 正文  1.爬取数据 使用python爬虫,爬取中国天气网各省份24时整点气象数据 由于降水量为动态数据,以js形式进行存储,故采用selenium方法经xpath爬取数据-ps:在进行数据爬取时,最初使用的方法是漂亮汤法(beautifulsoup)法,但当输出爬取的内容(<class = split>时,却空空如也.在源代码界面Ctrl+Shift+F搜索后也无法找到降水量,后查询得知此为动态数据,无法用该方法进行爬取

  • 对python 操作solr索引数据的实例详解

    测试代码1: def test(self): data = {"add": {"doc": {"id": "100001", "*字段名*": u"我是一个大好人"}}} params = {"boost": 1.0, "overwrite": "true", "commitWithin": 1000} ur

  • python爬取全国水雨情信息详解

    目录 分析 代码 结果 总结 分析 我们没有找到接口,所以打算利用selenium来爬取. 代码 import datetime import pandas as pd from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from

  • Python爬取12306车次信息代码详解

    详情查看下面的代码: 如果被识别就要添加一个cookie如果没有被识别的话就要一个user-agent就好了.如果出现乱码就设置编码格式为utf-8 #静态的数据一般在elements中(复制文字到sources按ctrl+f搜索.找到的为静态),而动态去network中去寻找相关的信息 import requests import re def send_request(): headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win6

  • Python实战实现爬取天气数据并完成可视化分析详解

    1.实现需求: 从网上(随便一个网址,我爬的网址会在评论区告诉大家,dddd)获取某一年的历史天气信息,包括每天最高气温.最低气温.天气状况.风向等,完成以下功能: (1)将获取的数据信息存储到csv格式的文件中,文件命名为”城市名称.csv”,其中每行数据格式为“日期,最高温,最低温,天气,风向”: (2)在数据中增加“平均温度”一列,其中:平均温度=(最高温+最低温)/2,在同一张图中绘制两个城市一年平均气温走势折线图: (3)统计两个城市各类天气的天数,并绘制条形图进行对比,假设适合旅游的

  • Python实现爬取天气数据并可视化分析

    目录 核心功能设计 实现步骤 爬取数据 风向风级雷达图 温湿度相关性分析 24小时内每小时时段降水 24小时累计降雨量 今天我们分享一个小案例,获取天气数据,进行可视化分析,带你直观了解天气情况! 核心功能设计 总体来说,我们需要先对中国天气网中的天气数据进行爬取,保存为csv文件,并将这些数据进行可视化分析展示. 拆解需求,大致可以整理出我们需要分为以下几步完成: 1.通过爬虫获取中国天气网7.20-7.21的降雨数据,包括城市,风力方向,风级,降水量,相对湿度,空气质量. 2.对获取的天气数

  • python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员还是写个程序来进行吧! 所以我通过Python+Selenium+正则表达式+urllib2进行海量图片爬取. 运行效果: http://photo.hupu.com/nba/tag/马刺 http://photo.hupu.com/nba/tag/陈露 源代码: # -*- coding: utf

  • python 爬取天气网卫星图片

    项目地址: https://github.com/MrWayneLee/weather-demo 代码部分 下载生成文件功能 # 下载并生成文件 def downloadImg(imgDate, imgURLs, pathName): a,s,f = 0,0,0 timeStart = time.time() while a < len(imgURLs): req = requests.get(imgURLs[a]) imgName = str(imgURLs[a])[-13:-9] print

  • Python疫情确诊折线图实现数据可视化实例详解

    目录 案例描述 实现步骤 一.导入模块 二.读取文件内容 三.json转换python 四.获取需要用到的数据 五.生成图表 六.关闭文件 案例描述 根据可参考数据,实现对疫情确诊人数数据的可视化. 利用json转换工具,将数据格式化,需要取出下面两部分的内容. 可视化效果图: 实现步骤 一.导入模块 导入可能用到的模块 import json from pyecharts.charts import Line 二.读取文件内容 打开相应的文件,使用变量us_data保存文件的内容 f_us =

随机推荐