爬取天气预报”温州未来30天最高温“

1.主题式网络爬虫名称:爬取天气预报”温州未来30天最高温“
2.主题式网络爬虫爬取的内容与数据特征分析:30天的日期以及最高温度
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点):分析网页结构;爬取信息;数据分析;数据可视化

 

找到适合爬取的网站页面

1.主题页面的结构和特征分析:爬取数据都分布在标签'<"li" class="temp">'里面

2.Htmls页面解析:

1.数据爬取与采集

import requests
from bs4 import BeautifulSoup
url="https://www.tianqi.com/wenzhou/30/"  #想爬的网站
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
r= requests.get(url,timeout=30,headers=headers)  #发送请求
r.encoding='utf-8'
soup=BeautifulSoup(r.text,'html.parser')  #解析
a=soup.findAll('b')
j=1
data=[]   #存储当日最高温度
day=[]   #存储日期
l=[]   #储存天数
datas=[]
for b in a:
    if j%2==0:
        data.append(b.get_text())
        j=j+1
    else:
        day.append(b.get_text())
        j=j+1
i=1
for i in range(30):
    l.append(i+1)
for i in range(30):
    datas.append([l[i],day[i],data[i]])
k=pd.DataFrame(datas,columns=["天数","日期","该日最高气温"])

2.对数据进行清洗和处理:

k.isnull() #查找是否有空值

k.duplicated() #检测是否有重复值
k[k.isnull().values==False] #返回无缺失值

3.数据持久化

k.to_csv('温州未来30天最高温度预报.csv')

4.数据分析与可视化

import pandas as pd
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib as mpl
plt.figure(figsize=(8,6))      #设置画布大小
k.describe()
X=k.loc[:,"日期"]
Y=k.loc[:,'该日最高气温']
plt.rcParams['axes.unicode_minus']=False   #用来正常显示负号
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  #正常显示中文
plt.bar(X, Y, label="柱状图")
plt.xlabel("日期")
plt.ylabel("温度")
plt.title('温州未来30天最高温度预报')
plt.show()

plt.figure(figsize=(8,6))
plt.plot(X,Y,marker='o',color='b')
plt.show ()

5.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程(一元或多元)

import pandas as pd
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib as mpl
from scipy.optimize import leastsq
from numpy import genfromtxt
def main():
    colnames = ["天数", "日期", "该日最高气温"]
    df = pd.read_csv('温州未来30天最高温度预报.csv',skiprows=1,names=colnames)
    X = df.天数
    Y = df.该日最高气温
#fun函数里指出了待拟合函数的函数形状

    def func(params,x):
        a, b, c=params
        return a*x*x+b*x+c

#误差函数,即拟合函数所求值与实际值的差
    def error_func(params,x,y):
        return func(params,x)-y
    p0=[1,20]
    plt.figure(figsize=(10,10))
    p0=[1,1,1]
    Para=leastsq(error_func,p0,args=(X,Y))
    a,b,c=Para[0]
    plt.scatter(X,Y,color="green",label=u"样本数据",linewidth=2)
    x=np.linspace(0,30,30)
    y=a*x*x+b*x+c
    plt.plot(x,y,color="red",marker='o',label=u"拟合曲线",linewidth=2)
    plt.legend(prop="温度")
    plt.title('温州未来30天最高温度预报')
    plt.grid()
    plt.legend()
    plt.show()
main()

全部代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib as mpl
from scipy.optimize import leastsq
from numpy import genfromtxt
import csv
url="https://www.tianqi.com/wenzhou/30/"  #想爬的网站
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
r= requests.get(url,timeout=30,headers=headers)  #发送请求
r.encoding='utf-8'
soup=BeautifulSoup(r.text,'html.parser')  #解析
a=soup.findAll('b')
j=1
data=[]   #存储当日最高温度
day=[]   #存储日期
l=[]   #储存天数
datas=[]
for b in a:
    if j%2==0:
        data.append(b.get_text())
        j=j+1
    else:
        day.append(b.get_text())
        j=j+1
i=1
for i in range(30):
    l.append(i+1)
for i in range(30):
    datas.append([l[i],day[i],data[i]])
k=pd.DataFrame(datas,columns=["天数","日期","该日最高气温"])

k.to_csv('温州未来30天最高温度预报.csv')

k.isnull()   #查找是否有空值
k.duplicated()    #检测是否有重复值
k[k.isnull().values==False]   #返回无缺失值

plt.figure(figsize=(8,6))      #设置画布大小
k.describe()
X=k.loc[:,"日期"]
Y=k.loc[:,'该日最高气温']
plt.rcParams['axes.unicode_minus']=False   #用来正常显示负号
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  #正常显示中文
plt.bar(X, Y, label="柱状图")
plt.xlabel("日期")
plt.ylabel("温度")
plt.title('温州未来30天最高温度预报')
plt.show()

plt.figure(figsize=(8,6))
plt.plot(X,Y,marker='o',color='b')
plt.show ()
       
def main():
    colnames = ["天数", "日期", "该日最高气温"]
    df = pd.read_csv('温州未来30天最高温度预报.csv',skiprows=1,names=colnames)
    X = df.天数
    Y = df.该日最高气温
#fun函数里指出了待拟合函数的函数形状

    def func(params,x):
        a, b, c=params
        return a*x*x+b*x+c

#误差函数,即拟合函数所求值与实际值的差
    def error_func(params,x,y):
        return func(params,x)-y
    p0=[1,20]
    plt.figure(figsize=(10,10))
    p0=[1,1,1]
    Para=leastsq(error_func,p0,args=(X,Y))
    a,b,c=Para[0]
    plt.scatter(X,Y,color="green",label=u"样本数据",linewidth=2)
    x=np.linspace(0,30,30)
    y=a*x*x+b*x+c
    plt.plot(x,y,color="red",marker='o',label=u"拟合曲线",linewidth=2)
    plt.legend(prop="温度")
    plt.title('温州未来30天最高温度预报')
    plt.grid()
    plt.legend()
    plt.show()
main()

结论

通过数据分析与可视化;得出温州近日气温会上升

本次作业难度较难,但是很充实很有用。从中学到了很多知识,也能较熟练的运用,但还需努力提升自己。

posted @ 2020-04-24 09:49  刚好路过的假面骑士  阅读(317)  评论(0编辑  收藏  举报