爬取城市GDP排名


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

1.爬蟲名稱:爬取城市GDP排名

2.爬蟲爬取的內容:爬取城市GDP排名

3.網絡爬蟲設計方案概述:
實現思路:在瀏覽器 中通過F12訪問網頁源代碼,,分析網站源代碼,找到自己所需要的數據所在的位置,提取數據,對數據進行保存數據,再對數據進行清洗和處理,數據分析與可視化處理
技術難點:對庫使用和庫中函數的運用,爬取的內容的機構分析處理

二、主題頁面的結構特征分析

主題頁面的結構與特征分析:通過頁面的結構分析,可以得到各個數據之間的便簽都有關聯的關系,城市標簽分布在<td class="et2" style="width:54.00pt;" width="72" x:str="">城市</td>

中,排名標簽分布<td class="et2" height="18" style="height:13.50pt;width:54.00pt;" width="72" x:str="">排名</td>中,19年GDP標簽分布在<td class="et2" style="width:56.25pt;" width="75"x:str="">2019上半年GDP(億元)</td>中,18年GDP標簽分布在<td class="et2" style="width:56.25pt;" width="75" x:str="">2018上半年GDP(億元)</td>中,名義增速標簽分布在<td class="et2" style="width:54.00pt;" width="72" x:str="">名義增速</td>中。各個值則在<tr height="18" style="height:13.50pt;">這種形式中。

 

 

 三、網絡爬蟲程序設計

1.數據爬取與采集

import requests
from lxml import etree
import pandas as pd
#爬取2019年上半年中國前10名城市
#偽裝爬蟲
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}
url =  "http://www.860816.com/aricle.asp?id=1785" 
r = requests.get(url,headers = headers) #發送get請求
r.encoding=r.apparent_encoding
#構建一個xpath解析對象
html = etree.HTML(r.text) #利用etree.HTML()將html字符串轉化為element對象,element對象是xpath語法的使用對象,element對象可由html字符串轉化
table = html.xpath("//table[@class='ke-zeroborder']/tbody")
a=[]
b=[]
c=[]
d=[]
e=[]
lt=[]
for td in table:
    number = td.xpath(".//td[@class='et2'][1]/text()")[1:11]
    name = td.xpath(".//td[@class='et2'][2]/text()")[1:11]
    s2019GDP = td.xpath(".//td[@class='et2'][3]/text()")[1:11] #2019上半年GDP(億元)
    s2018GDP = td.xpath(".//td[@class='et2'][4]/text()")[1:11]
    increase1_3 = td.xpath(".//td[@class='et2'][5]/text()")[1:3]
    increase2_10 = td.xpath(".//td[@class='et3']/text()")[0:8]

    for i in range(10):
        a.append(number[i].strip())#用append生成多維數組
        b.append(name[i].strip())
        c.append(s2019GDP[i].strip())
        d.append(s2018GDP[i].strip())
    for i in range(2):
        e.append(increase1_3[i].strip())
    for i in range(8):
        e.append(increase2_10[i].strip())

e[2],e[1] = e[1],e[2]

lt=[]
for i in range(10):
    lt.append([a[i],b[i],c[i],d[i],e[i]])


df=pd.DataFrame(lt,columns=["排名","城市","一九上半年GDP","一八上半年GDP","名義增速"])
print(df)
df.to_csv('上半年中國前十名城市GDP排名.csv',encoding = 'gbk') #保存文件,數據持久化

 

成功保存csv文件

 

 

 2.進行數據清洗和處理

import pandas as pd
#讀取csv文件
df = pd.DataFrame(pd.read_csv('上半年中國前十名城市GDP排名.csv',engine='python'))
df

#刪除無效列
df.drop('名義增速',axis=1,inplace=True)
df.drop('城市',axis=1,inplace=True)
df.drop('一八上半年GDP',axis=1,inplace=True)
df.head()#表示前五行

 

 

#缺失值處理
df[df.isnull().values==True]#返回無缺失值

 

 

#檢查是否有重復值
df.duplicated()

 

 

#使用describe查看統計信息
df.describe()

 

 

#數據維度
print('---數據維度:{:}行{:}列---\n'.format(df.shape[0],df.shape[1]))

 

 

df.info()#查看各列數據類型

 

 

#數據分析
from sklearn.linear_model import LinearRegression#線性回歸算法
X = df.drop("一九上半年GDP",axis=1)
predict_model = LinearRegression()#線性回歸模型
predict_model.fit(X,df['一九上半年GDP'])#fit() 用來分析模型參數
print("回歸系數為:",predict_model.coef_)#predict() 是通過 fit() 算出的模型參數構成的模型,對解釋變量進行預測獲得的值

 

 

 

 

#繪制排名與一九上半年GDP的回歸圖
sns.regplot(df.排名,df.一九上半年GDP)

 

 

 

 

 

 

#畫出散點圖
def siger():
    plt.scatter(df.排名, df.一九上半年GDP, color='red', s=25, marker="o")
    plt.xlabel("排名")
    plt.ylabel("一九上半年GDP")
    plt.title("排名與一九上半年GDP散點圖")
    plt.show()
siger()

 

 

# 繪制柱狀圖
def algd():
    x = df['排名']
    y = df['一九上半年GDP']
    plt.xlabel('排名')#設置橫坐標名
    plt.ylabel('一九上半年GDP')#設置縱坐標名
    plt.bar(x,y)#柱狀圖
    plt.title("繪制排名與一九上半年GDP條形圖")
    plt.show()
algd()

 

 

#繪制折線圖
def mei():
    x = df['排名']
    y = df['一九上半年GDP']
    plt.xlabel('排名')
    plt.ylabel('一九上半年GDP)')
    plt.plot(x,y)#畫折線圖
    plt.scatter(x,y)#畫散點
    plt.title("繪制排名與一九上半年GDP折線圖")#標題
    plt.show()
mei()

 

 

#繪制分布圖
sns.jointplot(x="排名",y='一九上半年GDP',data = df)#設置xy軸,顯示columns名稱

sns.jointplot(x="排名",y='一九上半年GDP',data = df, kind='reg')

sns.jointplot(x="排名",y='一九上半年GDP',data = df, kind='hex')#kind 設置類型:scatter reg resid  kde(密度圖)  hex(六邊形)

sns.jointplot(x="排名",y='一九上半年GDP',data = df, kind='kde', color='r')#設置顏色

sns.kdeplot(df['排名'], df['一九上半年GDP'])

 

 

 

 

 

 

 

 

#一元一次回歸方程
import matplotlib
from scipy.optimize import leastsq
from numpy import genfromtxt
#讀入樣本文件,需轉換成數組(列表)形式
df=genfromtxt('上半年中國前十名城市GDP排名.csv',dtype=float,delimiter=',')#因為導入的是csv文件,所以用‘,’分隔
DF=np.delete(df,0,axis=0)
Y=DF[:,3]#直接提取數組第3列數據,轉換成一維數組
X=DF[:,1]
#fit_func函數,指出了代擬合函數的函數形狀
def fit_func(p,x):
    k,b=p
    return k*x+b
#誤差函數,即擬合函數所成的值與實際值得差
def error_func(p,x,y):
    return fit_func(p,x)-y#(x,y)#模擬值  #y樣本值
p0=[0,0]#初始值
#讀取leastsq返回值結果,leastsq的返回值是一個tuple
Para=leastsq(error_func,p0,args=(X,Y))#arg參數 ,樣本數據(X和Y數組) #ParaPara返回的值(參數)
k,b=Para[0]#一元方程系數返回值
plt.figure(figsize=(10,6))
plt.scatter(X,Y,color="green",label=u"樣本數據",linewidth=2)
x=np.linspace(1,10,10)
y=a*x*x+b*x+c
plt.plot(x,y,color="red",label=u"擬合曲線",linewidth=2)
plt.legend()#繪制擬合直線
plt.grid()#生成網格
plt.show()

 

 

#一元二次回歸方程
import matplotlib
from scipy.optimize import leastsq
from numpy import genfromtxt
df=genfromtxt('上半年中國前十名城市GDP排名.csv',dtype=float,delimiter=',')
DF=np.delete(df,0,axis=0)
Y=DF[:,3]
X=DF[:,1]
#二次函數的標准形式
def fit_func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
def error_func(p,x,y):
    return fit_func(p,x)-y
p0=[0,0,0]
Para=leastsq(error_func,p0,args=(X,Y))
a,b,c=Para[0]
#畫樣本點(散點)
plt.figure(figsize=(10,6))#定義畫布大小
plt.scatter(X,Y,color="green",label=u"樣本數據",linewidth=2)#scatter表示畫散點圖
#畫擬合直線
x=np.linspace(1,12,10)#生成10個點
y=a*x*x+b*x+c
plt.plot(x,y,color="red",label=u"擬合曲線",linewidth=2)
plt.legend()#繪制擬合直線
plt.show()

 

 5.將以上各部分的代碼匯總,附上完整程序代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
import seaborn as sns
import scipy as sp
import seaborn as sns

# 用來正常顯示中文標簽
plt.rcParams['font.sans-serif'] = ['SimHei']  
# 用來正常顯示負號
plt.rcParams['axes.unicode_minus'] = False 


import requests
from lxml import etree
import pandas as pd
#爬取2019年上半年中國前10名城市
#偽裝爬蟲
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}
url =  "http://www.860816.com/aricle.asp?id=1785" 
r = requests.get(url,headers = headers) #發送get請求
r.encoding=r.apparent_encoding
#構建一個xpath解析對象
html = etree.HTML(r.text) #利用etree.HTML()將html字符串轉化為element對象,element對象是xpath語法的使用對象,element對象可由html字符串轉化
table = html.xpath("//table[@class='ke-zeroborder']/tbody")
a=[]
b=[]
c=[]
d=[]
e=[]
lt=[]
for td in table:
    number = td.xpath(".//td[@class='et2'][1]/text()")[1:11]
    name = td.xpath(".//td[@class='et2'][2]/text()")[1:11]
    s2019GDP = td.xpath(".//td[@class='et2'][3]/text()")[1:11] #2019上半年GDP(億元)
    s2018GDP = td.xpath(".//td[@class='et2'][4]/text()")[1:11]
    increase1_3 = td.xpath(".//td[@class='et2'][5]/text()")[1:3]
    increase2_10 = td.xpath(".//td[@class='et3']/text()")[0:8]

    for i in range(10):
        a.append(number[i].strip())#用append生成多維數組
        b.append(name[i].strip())
        c.append(s2019GDP[i].strip())
        d.append(s2018GDP[i].strip())
    for i in range(2):
        e.append(increase1_3[i].strip())
    for i in range(8):
        e.append(increase2_10[i].strip())

e[2],e[1] = e[1],e[2]

lt=[]
for i in range(10):
    lt.append([a[i],b[i],c[i],d[i],e[i]])


df=pd.DataFrame(lt,columns=["排名","城市","一九上半年GDP","一八上半年GDP","名義增速"])
print(df)
df.to_csv('上半年中國前十名城市GDP排名.csv',encoding = 'gbk') #保存文件,數據持久化
import pandas as pd



#讀取csv文件
df = pd.DataFrame(pd.read_csv('上半年中國前十名城市GDP排名.csv',engine='python'))
df


#刪除無效列
df.drop('名義增速',axis=1,inplace=True)
df.drop('城市',axis=1,inplace=True)
df.drop('一八上半年GDP',axis=1,inplace=True)
df.head()#表示前五行


#缺失值處理
df[df.isnull().values==True]#返回無缺失值


#檢查是否有重復值
df.duplicated()


#使用describe查看統計信息
df.describe()


#數據維度
print('---數據維度:{:}行{:}列---\n'.format(df.shape[0],df.shape[1]))
df.info()#查看各列數據類型


#繪制排名與一九上半年GDP的回歸圖
sns.regplot(df.排名,df.一九上半年GDP)


#畫出散點圖
def siger():
    plt.scatter(df.排名, df.一九上半年GDP, color='red', s=25, marker="o")
    plt.xlabel("排名")
    plt.ylabel("一九上半年GDP")
    plt.title("排名與一九上半年GDP散點圖")
    plt.show()
siger()


# 繪制柱狀圖
def algd():
    x = df['排名']
    y = df['一九上半年GDP']
    plt.xlabel('排名')#設置橫坐標名
    plt.ylabel('一九上半年GDP')#設置縱坐標名
    plt.bar(x,y)#柱狀圖
    plt.title("繪制排名與一九上半年GDP條形圖")
    plt.show()
algd()


#繪制折線圖
def mei():
    x = df['排名']
    y = df['一九上半年GDP']
    plt.xlabel('排名')
    plt.ylabel('一九上半年GDP)')
    plt.plot(x,y)#畫折線圖
    plt.scatter(x,y)#畫散點圖
    plt.title("繪制排名與一九上半年GDP折線圖")#標題
    plt.show()
mei()



#繪制分布圖
sns.jointplot(x="排名",y='一九上半年GDP',data = df)#設置xy軸,顯示columns名稱

sns.jointplot(x="排名",y='一九上半年GDP',data = df, kind='reg')

sns.jointplot(x="排名",y='一九上半年GDP',data = df, kind='hex')#kind 設置類型:scatter reg resid  kde(密度圖)  hex(六邊形)

sns.jointplot(x="排名",y='一九上半年GDP',data = df, kind='kde', color='r')#設置顏色

sns.kdeplot(df['排名'], df['一九上半年GDP'])



#一元一次回歸方程
import matplotlib
from scipy.optimize import leastsq
from numpy import genfromtxt
#讀入樣本文件,需轉換成數組(列表)形式
df=genfromtxt('上半年中國前十名城市GDP排名.csv',dtype=float,delimiter=',')#因為導入的是csv文件,所以用‘,’分隔
DF=np.delete(df,0,axis=0)
Y=DF[:,3]#直接提取數組第3列數據,轉換成一維數組
X=DF[:,1]
#fit_func函數,指出了代擬合函數的函數形狀


def fit_func(p,x):
    k,b=p
    return k*x+b
#誤差函數,即擬合函數所成的值與實際值得差
def error_func(p,x,y):
    return fit_func(p,x)-y#(x,y)#模擬值  #y樣本值

p0=[0,0]#初始值

#讀取leastsq返回值結果,leastsq的返回值是一個tuple
Para=leastsq(error_func,p0,args=(X,Y))#arg參數 ,樣本數據(X和Y數組) #ParaPara返回的值(參數)
k,b=Para[0]#一元方程系數返回值
plt.figure(figsize=(10,6))
plt.scatter(X,Y,color="green",label=u"樣本數據",linewidth=2)
x=np.linspace(1,10,10)
y=a*x*x+b*x+c

plt.plot(x,y,color="red",label=u"擬合曲線",linewidth=2)
plt.legend()#繪制擬合直線
plt.grid()#生成網格
plt.show()


#一元二次回歸方程

import matplotlib
from scipy.optimize import leastsq
from numpy import genfromtxt
df=genfromtxt('上半年中國前十名城市GDP排名.csv',dtype=float,delimiter=',')
DF=np.delete(df,0,axis=0)
Y=DF[:,3]
X=DF[:,1]

#二次函數的標准形式
def fit_func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
def error_func(p,x,y):
    return fit_func(p,x)-y

p0=[0,0,0]

Para=leastsq(error_func,p0,args=(X,Y))
a,b,c=Para[0]

#畫樣本點(散點)
plt.figure(figsize=(10,6))#定義畫布大小
plt.scatter(X,Y,color="green",label=u"樣本數據",linewidth=2)#scatter表示畫散點圖
#畫擬合直線
x=np.linspace(1,12,10)#生成10個點
y=a*x*x+b*x+c
plt.plot(x,y,color="red",label=u"擬合曲線",linewidth=2)
plt.legend()#繪制擬合直線
plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM