Python如何爬取表格数据

目标:

爬虫练习,爬取广东省统计局的国民经济指标里面的表格数据.


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 编辑器.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容