华北天气数据爬取及可视化


一.主题式网络爬虫设计方案

1.主题式网络爬虫名称:华北天气数据分析

2.主题式网络爬虫爬取的内容:华北天气地点':place,'天气':weather,'风的数据':fen,'最高温度':max_c,'最低温度数据

3.设计方案概述:

实现思路:爬取网站内容,之后分析提取需要的数据,进行数据清洗,之后数据可视化,并计算评分和排名的相关系数

技术难点:爬取时数据过多,网页结构复杂,需要提取的数据特征会略有变化.

二、主题页面的结构特征分析

1.数据爬取

from bs4 import BeautifulSoup
import requests
import pandas as pd
 
def get_temperature(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}           # 设置头文件信息
    response = requests.get(url, headers=headers).content    # 提交requests get 请求
    soup = BeautifulSoup(response, "lxml")       # 用Beautifulsoup 进行解析
    conmid = soup.find('div', class_='conMidtab')
    conmid2 = conmid.findAll('div', class_='conMidtab2')
    
    ce_name=[]
    content=[]
    
    for info in conmid2:
        tr_list = info.find_all('tr')[2:]       # 使用切片取到第三个tr标签
        for index, tr in enumerate(tr_list):     # enumerate可以返回元素的位置及内容
            td_list = tr.find_all('td')
            if index == 0:
                # 取每个标签的text信息,并使用replace()函数将换行符删除
                
                province_name = td_list[0].text.replace('\n', '')  
                city_name = td_list[1].text.replace('\n', '')
                weather = td_list[5].text.replace('\n', '')
                wind = td_list[6].text.replace('\n', '')
                max = td_list[4].text.replace('\n', '')
                min = td_list[7].text.replace('\n', '')
                m=[city_name, weather, wind, max, min]
                ce_name.append(m)
            else:
                city_name = td_list[0].text.replace('\n', '')
                weather = td_list[4].text.replace('\n', '')
                wind = td_list[5].text.replace('\n', '')
                max = td_list[3].text.replace('\n', '')
                min = td_list[6].text.replace('\n', '')
            q=[city_name, weather, wind, max, min]
            content.append(q)
    
    #print(content)
    place=[]
    weather=[]
    fen=[]
    max_c=[]
    min_c=[]
    
    for i in content:
        place.append(i[0])
        weather.append(i[1])
        fen.append(i[2])
        max_c.append(i[3])
        min_c.append(i[4])
  
if __name__=='__main__':
    urls = 'http://www.weather.com.cn/textFC/hb.shtml'

    get_temperature(url)

 





        get_temperature(url)
2.数据存入Excel:
 #建立文件
    file=pd.DataFrame({'地点':place,'天气':weather,'风的数据':fen,'最高温度':max_c,'最低温度':min_c})
    #保存文件
    file.to_csv('E:/华北天气数据.csv')
3.数据清洗、处理
#读取csv文件 

df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv')) df.head()
#缺失值处理
df.isnull().head() #True为缺失值,False为存在值

#查看统计信息
df.describe()

4.数据可视化

plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
#绘制条形图
df = pd.read_csv('E:/华北天气数据.csv')
x = df['地点'][:5]
y = df['最低温度'][:5]
plt.xlabel('地点')
plt.ylabel('最低温度')
plt.bar(x,y)
plt.title("华北地区,最低温度条形图")
plt.show()

 

#绘制折线图
df = pd.read_csv('E:/华北天气数据.csv')
x = df['地点'][:5]
y = df['最低温度'][:5]
plt.xlabel('地点')
plt.ylabel('最低温度')
plt.plot(x,y,color="blue",label="折线")
plt.title("华北地区,最低温度折线图")
plt.legend()
plt.show()

df = pd.read_csv('E:/华北天气数据.csv')
地点 = (df['地点'])
最低温度 = (df['最低温度'])
plt.figure(figsize=(6,5))
plt.scatter(地点,最低温度,label=u"样本数据",linewidth=2)  
plt.title("华北地区,最低温度散点图",color="green")
plt.xlabel("地点")
plt.ylabel("最低温度")
plt.legend()
plt.grid()
plt.show()

#线性关系散点图
import seaborn as sns
df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv'))
x = df['地点'][:5]
y = df['最高温度'][:5]
sns.lmplot(x="地点",y= "最高温度",data=df)
#回归方程曲线图
df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv'))
q = df['地点']
w = df['最高温度']
def func(p,x):
        a,b,c=p
        return a*x*x+b*x+c

def error_func(p,x,y):
        return func(p,x)-y
    
p0=[0,0,0]
Para=leastsq(error_func,p0,args=(q,w))
a,b,c=Para[0]   
plt.figure(figsize=(12,6)) 
plt.scatter(q,w,color="blue",label=u"最高温度散点",linewidth=2)
x=np.linspace(0,20,15) 
y=a*x*x+b*x+c
plt.plot(x,y,color="green",label=u"回归方程曲线",linewidth=2) 
plt.xlabel("地点")[:10]
plt.ylabel("最高温度")[:10]
plt.title("华北地区,最低温度回归曲线图")
plt.legend() 
plt.show()

ooo代码总结

from bs4 import BeautifulSoup

import requests

import pandas as pd

import seaborn as sns

import numpy as np

from numpy import genfromtxt

import scipy as sp

import matplotlib.pyplot as plt

from scipy.optimize import leastsq 

def get_temperature(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}           # 设置头文件信息
    response = requests.get(url, headers=headers).content    # 提交requests get 请求
    soup = BeautifulSoup(response, "lxml")       # 用Beautifulsoup 进行解析
    conmid = soup.find('div', class_='conMidtab')

    conmid2 = conmid.findAll('div', class_='conMidtab2')
    
    ce_name=[]

    content=[]

    
    for info in conmid2:
        tr_list = info.find_all('tr')[2:]       # 使用切片取到第三个tr标签
        for index, tr in enumerate(tr_list):     # enumerate可以返回元素的位置及内容
            td_list = tr.find_all('td')
            if index == 0:
                # 取每个标签的text信息,并使用replace()函数将换行符删除
                
                province_name = td_list[0].text.replace('\n', '') 
 
                city_name = td_list[1].text.replace('\n', '')

                weather = td_list[5].text.replace('\n', '')

                wind = td_list[6].text.replace('\n', '')

                max = td_list[4].text.replace('\n', '')

                min = td_list[7].text.replace('\n', '')

                m=[city_name, weather, wind, max, min]
                ce_name.append(m)
            else:
                city_name = td_list[0].text.replace('\n', '')

                weather = td_list[4].text.replace('\n', '')

                wind = td_list[5].text.replace('\n', '')

                max = td_list[3].text.replace('\n', '')

                min = td_list[6].text.replace('\n', '')

            q=[city_name, weather, wind, max, min]
            content.append(q)
    
    #print(content)
    place=[]
    weather=[]
    fen=[]
    max_c=[]
    min_c=[]
    
    for i in content:
        place.append(i[0])
        weather.append(i[1])
        fen.append(i[2])
        max_c.append(i[3])
        min_c.append(i[4])
    
    
    
    #'地点','天气','风的数据','最高温度','最低温度'
      
    #建立文件
    file=pd.DataFrame({'地点':place,'天气':weather,'风的数据':fen,'最高温度':max_c,'最低温度':min_c})
    #保存文件
    file.to_csv('E:/华北天气数据.csv')
if __name__=='__main__':
    urls = 'http://www.weather.com.cn/textFC/hb.shtml'

    get_temperature(url)
##读取csv文件数据清洗
df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv'))
print(df)
#缺失值处理
df.isnull().head() #True为缺失值,False为存在值
#空值处理#
df.isnull().sum() #0表示无空值
#查找重复值
df.duplicated() #显示表示已经删除重复值
#查看统计信息
df.describe()
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
x = df['地点'][:5]
y = df['最低温度'][:5]
plt.xlabel('地点')
plt.ylabel('最低温度')
plt.bar(x,y)
plt.title("华北地区,最低温度条形图")
plt.show()

#绘制折线图
df = pd.read_csv('E:/华北天气数据.csv')
x = df['地点'][:5]
y = df['最低温度'][:5]
plt.xlabel('地点')
plt.ylabel('最低温度')
plt.plot(x,y,color="blue",label="折线")
plt.title("华北地区,最低温度折线图")
plt.legend()
plt.show()

#绘制散点图
df = pd.read_csv('E:/华北天气数据.csv')
地点 = (df['地点'])
最低温度 = (df['最低温度'])
plt.figure(figsize=(6,5))
plt.scatter(地点,最低温度,label=u"样本数据",linewidth=2)  
plt.title("华北地区,最低温度散点图",color="green")
plt.xlabel("地点")
plt.ylabel("最低温度")
plt.legend()
plt.grid()
plt.show()

#线性关系散点图
import seaborn as sns
df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv'))
x = df['地点'][:5]
y = df['最高温度'][:5]
sns.lmplot(x="地点",y= "最高温度",data=df)
#回归方程曲线图
df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv'))
q = df['地点']
w = df['最高温度']
def func(p,x):
        a,b,c=p
        return a*x*x+b*x+c

def error_func(p,x,y):
        return func(p,x)-y
    
p0=[0,0,0]
Para=leastsq(error_func,p0,args=(q,w))
a,b,c=Para[0]   
plt.figure(figsize=(12,6)) 
plt.scatter(q,w,color="blue",label=u"最高温度散点",linewidth=2)
x=np.linspace(0,20,15) 
y=a*x*x+b*x+c
plt.plot(x,y,color="green",label=u"回归方程曲线",linewidth=2) 
plt.xlabel("地点")
plt.ylabel("最高温度")
plt.title("华北地区,最低温度回归曲线图")
plt.legend() 
plt.show()

 

四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?

数据可以很快收集导入表格中,在以后工作中可以提高工作效率,可视化可以更直观的了解数据间关系,很棒!

2.对本次程序设计任务完成的情况做一个简单的小结。

函数运用不熟练,局部变量变全局变量学习到了,把握住了可视化的规律。


 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM