目标:
爬虫练习,爬取广东省统计局的国民经济指标里面的表格数据.
Python标题模版.jpg
图片1.png
1.安装Python第三方库
在进行爬取数据和解析数据前,需要在Python运行环境中下载安装第三方库requests。
在Windows系统中,打开cmd(命令提示符)界面,在该界面输入pip install requests,按回车键会自动进行下载安装。
安装完成的结果如图:
图片2.png
2.用requests.get获取广东主要统计指标的表格页面源代码.根据源码特征,去掉无关元素,只保留<tbody>里面的内容.
代码如下:
def d_response():
v_r=requests.get('http://stats.gd.gov.cn/gmjjzyzb/content/post_3185597.html')
v_data=v_r.text[v_r.text.find('<tbody>'):v_r.text.find('/tbody')]
结果如图:
图片3.png
3.现在获取到的v_data数据是一串长长的字符串,还需要对数据按行和单元格进行提取,因此,需要一个表格专用提取函数:
def d_gettable(x,y):
#.x为传入的待提取数据,y为待检索的关键词.
#.定义关键词的开头和结尾变量.
v_start='<'+y
v_end='</'+y+'>'
#计算数据的长度.
v_len=x.rfind(v_end)
#生成索引位置列表.
a_array1=[]
a_array2=[]
#循环搜索所有关键词的索引位置
for v_i in range(0,v_len):
a_array1.append(x.find(v_start,v_i))
a_array2.append(x.find(v_end,v_i))
#索引位置去重并重建列表.
a_array1=list(set(a_array1))
a_array2=list(set(a_array2))
#列表重排序
a_array2.sort()
a_array1.sort()
#删除列表无效数据
a_array1.remove(-1)
#根据索引位置重新生成数据
z=[]
for v_i in range(0,len(a_array1)):
v_a=a_array1[v_i]+4
v_b=a_array2[v_i]
z.append(x[v_a:v_b])
return(z)
图片4.png
4.接下来先用关键词”tr”按行提取数据:
import requests
def d_response():
v_r=requests.get('http://stats.gd.gov.cn/gmjjzyzb/content/post_3185597.html')
v_data=v_r.text[v_r.text.find('<tbody>'):v_r.text.find('/tbody')]
#按行提取表格数据
v_result=d_gettable(v_data,'tr')
print(v_result)
return
def d_gettable(x,y):
#.x为传入的待提取数据,y为待检索的关键词.
#.定义关键词的开头和结尾变量.
v_start='<'+y
v_end='</'+y+'>'
#计算数据的长度.
v_len=x.rfind(v_end)
#生成索引位置列表.
a_array1=[]
a_array2=[]
#循环搜索所有关键词的索引位置
for v_i in range(0,v_len):
a_array1.append(x.find(v_start,v_i))
a_array2.append(x.find(v_end,v_i))
#索引位置去重并重建列表.
a_array1=list(set(a_array1))
a_array2=list(set(a_array2))
#列表重排序
a_array2.sort()
a_array1.sort()
#删除列表无效数据
a_array1.remove(-1)
#根据索引位置重新生成数据
z=[]
for v_i in range(0,len(a_array1)):
v_a=a_array1[v_i]+4
v_b=a_array2[v_i]
z.append(x[v_a:v_b])
return(z)
if __name__ == '__main__':
d_response()
结果如图:
图片5.png
5.按行提取过的数据看起来依然杂乱,继续使用关键词”p”提取单元格数据:
import requests
def d_response():
v_r=requests.get('http://stats.gd.gov.cn/gmjjzyzb/content/post_3185597.html')
v_data=v_r.text[v_r.text.find('<tbody>'):v_r.text.find('/tbody')]
#按行提取表格数据
v_result=d_gettable(v_data,'tr')
#按单元格提取表格数据
for v_i in v_result:
v_result2=d_gettable(v_i,r'p')
print(v_result2)
return
def d_gettable(x,y):
#.x为传入的待提取数据,y为待检索的关键词.
#.定义关键词的开头和结尾变量.
v_start='<'+y
v_end='</'+y+'>'
#计算数据的长度.
v_len=x.rfind(v_end)
#生成索引位置列表.
a_array1=[]
a_array2=[]
#循环搜索所有关键词的索引位置
for v_i in range(0,v_len):
a_array1.append(x.find(v_start,v_i))
a_array2.append(x.find(v_end,v_i))
#索引位置去重并重建列表.
a_array1=list(set(a_array1))
a_array2=list(set(a_array2))
#列表重排序
a_array2.sort()
a_array1.sort()
#删除列表无效数据
a_array1.remove(-1)
#根据索引位置重新生成数据
z=[]
for v_i in range(0,len(a_array1)):
v_a=a_array1[v_i]+4
v_b=a_array2[v_i]
z.append(x[v_a:v_b])
return(z)
if __name__ == '__main__':
d_response()
结果如图:
图片6.png
6.看起来差不多了,最后将CSS代码清理掉,完成表格数据提取:
import requests
def d_response():
v_r=requests.get('http://stats.gd.gov.cn/gmjjzyzb/content/post_3185597.html')
v_data=v_r.text[v_r.text.find('<tbody>'):v_r.text.find('/tbody')]
#按行提取表格数据
v_result=d_gettable(v_data,'tr')
#按单元格提取表格数据
for v_i in v_result:
v_result2=d_gettable(v_i,r'p')
#去除CSS代码,生成新数据:
v_new=[]
for i in v_result2:
i=i.replace('\u3000','')
v_new.append(i[i.find(r'">')+2:])
print(v_new)
return
def d_gettable(x,y):
#.x为传入的待提取数据,y为待检索的关键词.
#.定义关键词的开头和结尾变量.
v_start='<'+y
v_end='</'+y+'>'
#计算数据的长度.
v_len=x.rfind(v_end)
#生成索引位置列表.
a_array1=[]
a_array2=[]
#循环搜索所有关键词的索引位置
for v_i in range(0,v_len):
a_array1.append(x.find(v_start,v_i))
a_array2.append(x.find(v_end,v_i))
#索引位置去重并重建列表.
a_array1=list(set(a_array1))
a_array2=list(set(a_array2))
#列表重排序
a_array2.sort()
a_array1.sort()
#删除列表无效数据
a_array1.remove(-1)
#根据索引位置重新生成数据
z=[]
for v_i in range(0,len(a_array1)):
v_a=a_array1[v_i]+4
v_b=a_array2[v_i]
z.append(x[v_a:v_b])
return(z)
if __name__ == '__main__':
d_response()
结果如图:
图片7.png
导出数据.png
注意事项:
1.更多python使用方法请参考<u>https://docs.python.org/zh-cn/3/library/index.html</u>.
2.Python的下载安装方法请参考<u>https://jingyan.baidu.com/article/a501d80cddc0e5ad620f5e12.html</u>.
3.为方便辩识代码,本文对于自定义标识符做以下规范:
class类:名称用”c_”开头.
def函数:名称用”d_”开头.
global全局变量:名称用”g_”开头.
variable局部变量:名称用”v_”开头.
4.本文的编程环境为:windows10操作系统/Python3.8软件/Atom 编辑器.