華北天氣數據爬取及可視化


一.主題式網絡爬蟲設計方案

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