爬取城市GDP排名

Posted ffdxmm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬取城市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(---数据维度:{:}行{:}列---
.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(---数据维度:{:}行{:}列---
.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()

 

以上是关于爬取城市GDP排名的主要内容,如果未能解决你的问题,请参考以下文章

GDP排名集体下滑的东北省会:沈阳回落长春速降 哈尔滨一路探底

中国最新 GDP 20 强城市排行榜

城市吸引力指数

青岛和深圳,两座条件相似的城市,为何GDP相差这么大

中国万亿GDP城市完整榜单

最新!中国 GDP 十强城市排行榜