爬取各省降水量及可视化全过程

大一菜鸟入门实操记录,顺便学习一下怎么在csdn上写markdown

目标的选取

因为相关课程的缘故,需要在1个月内速成python,故选取了python最常用的爬虫作为实操训练
同时,还添加了可视化和GUI入门的内容使爬取的内容应用更丰富
在具体数据的选取上,我爬取的是各省份降水量实时数据

话不多说,开始实操

正文

  1. 爬取数据
  • 使用python爬虫,爬取中国天气网各省份24时整点气象数据
  • 由于降水量为动态数据,以js形式进行存储,故采用selenium方法经xpath爬取数据
    ps:在进行数据爬取时,最初使用的方法是漂亮汤法(beautifulsoup)法,但当输出爬取的内容(<class = split>时,却空空如也。在源代码界面Ctrl+Shift+F搜索后也无法找到降水量,后查询得知此为动态数据,无法用该方法进行爬取
  • 使用循环和分类的方式爬取省份不同、网址相似的降水量数据,顺带记录数据对应的城市
  • f—string:
 url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml'

f-string 用大括号 {} 表示被替换字段,其中直接填入替换内容

  • 将城市和降水量相对应后存入字典再打印
  • 代码:
from lxml import etree
from selenium import webdriver
import re

city = [''for n in range(34)]   #存放城市列表
rain = [''for n in range(34)]   #存放有关降雨量信息的数值
rain_item = []

driver = webdriver.Chrome(executable_path='chromedriver')   #使用chrome浏览器打开

for a in range(1,5):      #直辖市数据
    url_a= f'http://www.weather.com.cn/weather1dn/1010{a}0100.shtml'  #网址
    driver.get(url_a)    #打开网址

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值

for a in range(5,10):      #一位数字网址数据
    url_a= f'http://www.weather.com.cn/weather1dn/1010{a}0101.shtml'
    driver.get(url_a)

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text     #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值


for a in range(10,35):      #二位数字网址数据
    url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml'
    driver.get(url_a)

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)
    
    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值

d = dict(zip(city,rain))  #将城市和降水量的列表合成为字典

for k,v in d.items():  #str转float类型
    rain_item.append(float(v))

print(d)
  • 在对爬取的内容进行处理时,可能会因为数据的类型而报错,如爬下来的数据为str类型,而排序需要数字类型,故需要进行float类型转化
  • 使用该爬取方法,是模拟用户打开网页,并且会在电脑上进行显示。在爬取实验进行中途,中国天气网进行了网址更新,原网址出现了部分城市数据无法显示的问题,但当刷新界面后,数据可正常显示,此时可采用模拟鼠标点击刷新的方法避免错误。由于后续找到了新网址,故将这一方法省去。
  1. 数据可视化
  • 用Matplotlib库函数绘制曲线,并输出最大值及相应城市、最小值及相应城市、平均值和中位值

  • 数据的确定:medium分奇偶计算中位值所处排序后数据的位置(中位值);用sum求和后除于数据个数(平均值);max和min函数找到最值再由数值经循环找到对应的城市列表

  • 绘图:使用plt函数绘制图像,并注明横纵坐标、所需注释

  • 文本处理:在进行注释时,plt函数所要求的格式为str类型,故需要进行类型转换,同时添加适当文字说明

  • 代码:

#-*- codeing = utf-8 -*-
import matplotlib.pyplot as plt
from lxml import etree
from selenium import webdriver
import re
import matplotlib
matplotlib.rc("font",family='YouYuan')

city = [''for n in range(34)]   #存放城市列表
rain = [''for n in range(34)]   #存放有关降雨量信息的数值

driver = webdriver.Chrome(executable_path='chromedriver')   #使用chrome浏览器打开

for a in range(1,5):      #直辖市数据
    url_a= f'http://www.weather.com.cn/weather1dn/1010{a}0100.shtml'  #网址
    driver.get(url_a)    #打开网址

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值


for a in range(5,10):      #非直辖一位数字网址数据
    url_a= f'http://www.weather.com.cn/weather1dn/1010{a}0101.shtml'
    driver.get(url_a)

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值


for a in range(10,35):      #非直辖二位数字网址数据
    url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml'
    driver.get(url_a)

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值


if len(rain)%2 == 0:        #寻找中值
    medium = int(len(rain)/2)
else:
    medium = int(len(rain)/2)+1
medium_text = "中位值:" + rain[medium]

d = dict(zip(city,rain))  #将城市和降水量的列表合成为字典

rain_item = []
city_min = []
city_max = []

for k,v in d.items():
    rain_item.append(float(v))

average_rain = sum(rain_item)/len(rain_item)
average_text = "平均值:"+ str(average_rain)

max_rain = max(rain_item)  #最大值
min_rain = min(rain_item)  #最小值

for k,v in d.items():
    if float(v) == min_rain:
        city_min.append(k)

min_text = "降雨量最小的城市:"+str(city_min)+" 最小值:"+str(min_rain)

for k,v in d.items():
    if float(v) ==max_rain:
        city_max.append(k)
max_text = "降雨量最大的城市:"+str(city_max)+" 最大值:"+str(max_rain)

plt.bar(range(len(d)), rain_item, align='center')
plt.xticks(range(len(d)), list(d.keys()))
plt.xlabel('城市',fontsize=20)
plt.ylabel('降水量',fontsize=20)
plt.text(0,12,average_text,fontsize=6)
plt.text(0,13,medium_text,fontsize=6)
plt.text(0,14,max_text,fontsize=6)
plt.text(0,15,min_text,fontsize=6)

plt.show()

  • 运行界面:
    在这里插入图片描述
  1. 互动界面
  • 使用tkinter库进行GUI的构建
  • 使用button函数实现交互,调用编写的get函数获取对用户输入的内容进行获取并使用循环进行遍历处理,若城市输入正确,则在界面上输出当地的降水量
  • 代码:
#-*- codeing = utf-8 -*-
from lxml import etree
from selenium import webdriver
import re
import matplotlib
matplotlib.rc("font",family='YouYuan')
from tkinter import *
import tkinter as tk

city = [''for n in range(34)]   #存放城市列表
rain = [''for n in range(34)]   #存放有关降雨量信息的数值

driver = webdriver.Chrome(executable_path='chromedriver')   #使用chrome浏览器打开

for a in range(1,5):      #直辖市数据
    url_a= f'http://www.weather.com.cn/weather1dn/1010{a}0100.shtml'  #网址
    driver.get(url_a)    #打开网址

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值


for a in range(5,10):      #非直辖一位数字网址数据
    url_a= f'http://www.weather.com.cn/weather1dn/1010{a}0101.shtml'
    driver.get(url_a)

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值


for a in range(10,35):      #非直辖二位数字网址数据
    url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml'
    driver.get(url_a)

    rain_list = []
    city_list = []
    resp_text = driver.page_source
    page_html = etree.HTML(resp_text)

    city_list = page_html.xpath('/html/body/div[4]/div[2]/a')[0]    #通过xpath爬取城市名称
    rain_list = page_html.xpath('//*[@id="weatherChart"]/div[2]/p[5]')[0]   #通过xpath爬取降雨量数据
    city[a-1] = city_list.text  #存入城市列表
    rain[a-1] = re.findall(r"\d+\.?\d*",rain_list.text)[0] #存入数值


d = dict(zip(city,rain))  #将城市和降水量的列表合成为字典

root=tk.Tk()
root.title('降水量查询')
root.geometry('500x200')

def get():
    values = entry.get()
    for k,v in d.items():
        if k == values:
            label = Label(root, text= v+'mm')
            label.pack()

frame = Frame(root)
frame.pack()
u1 = tk.StringVar()
entry = tk.Entry(frame, width=20, textvariable=u1,  relief="sunken")
entry.pack(side="left")

frame1 = Frame(root)
frame1.pack()
btn1=Button(frame1, text="查询", width=20, height=1, relief=GROOVE, command=lambda :get())
btn1.pack(side="left")

root.mainloop()

  • 运行界面:在这里插入图片描述

写在最后

在爬取天气的过程中,仅发现中国天气网有各省份降水量的数据,可见我国在数据开源方面还有很长的路要走
完整代码详见:https://github.com/jeekzhang/Crawling-and-Visualization-of-Data_scraping

  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【资源介绍】 课程大作业基于Python爬取各省降水量数据及可视化分析源码+项目说明+超详细注释. 因为相关课程的缘故,需要在1个月内速成python,故选取了python最常用的爬虫作为实操训练 同时,还添加了可视化和GUI入门的内容使爬取的内容应用更丰富 在具体数据的选取上,我爬取的是各省降水量实时数据 ###### *话不多说,开始实操* ### 正文 1. 爬取数据 - 使用python爬虫爬取中国天气网各省份24时整点气象数据 - 由于降水量为动态数据,以js形式进行存储,故采用selenium方法经xpath爬取数据 ps:在进行数据爬取时,最初使用的方法是漂亮汤法(beautifulsoup)法,但当输出爬取的内容(<class = split>时,却空空如也。在源代码界面Ctrl+Shift+F搜索后也无法找到降水量,后查询得知此为动态数据,无法用该方法进行爬取 - 使用循环和分类的方式爬取省份不同、网址相似的降水量数据,顺带记录数据对应的城市 - f—string: ```python url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml' ``` *f-string 用大括号 {} 表示被替换字段,其中直接填入替换内容* - 将城市和降水量相对应后存入字典再打印 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 Python大作业爬取各省降水量可视化源码+操作说明.zip 因为相关课程的缘故,需要在1个月内速成python,故选取了python最常用的爬虫作为实操训练 同时,还添加了可视化和GUI入门的内容使爬取的内容应用更丰富 在具体数据的选取上,我爬取的是各省降水量实时数据 *话不多说,开始实操* ### 正文 1. 爬取数据 - 使用python爬虫爬取中国天气网各省份24时整点气象数据 - 由于降水量为动态数据,以js形式进行存储,故采用selenium方法经xpath爬取数据 ps:在进行数据爬取时,最初使用的方法是漂亮汤法(beautifulsoup)法,但当输出爬取的内容(<class = split>时,却空空如也。在源代码界面Ctrl+Shift+F搜索后也无法找到降水量,后查询得知此为动态数据,无法用该方法进行爬取 - 使用循环和分类的方式爬取省份不同、网址相似的降水量数据,顺带记录数据对应的城市 - f—string: ```python url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml' ``` *f-string 用大括号 {} 表示被替换字段,其中直接填入替换内容* - 将城市和降水量相对应后存入字典再打印 - 代码:详见资源

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值