爬取国家统计局最近10年年度数据
一、编码流程
1.目标网址:https://data.stats.gov.cn/easyquery.htm?cn=C01
2.编码思路:
(1) 解析左侧指标树,实现4级标签定位
(难点:层层嵌套,下一级指标的xpath路径以上一级指标为基础;不是所有二级指标都含有三和四级指标,需要进行判断)
(2) 使用selenium webdriver 点选指标,加载出右侧表格数据
(难点:当指标无法在全局页面显示时,需向下拖动滚动条)
(3) 解析右侧数据,实现数据存储
3.使用模块:
(1) selenium:解析页面动态加载数据,实现浏览器自动化操作
(2) lxml :使用xpath方法进行数据解析
(3) os :建立文件夹对数据进行归类存储
(4) xlwt :实现数据存储操作,将解析的数据存储进excel中
(5) time :引入等待时间
二、具体实现过程
1.搭框架
思路:由于四级指标层层嵌套,编写一个4层的嵌套循环代码可读性较差,所以选择建立4个函数分别解析4个层级的指标,通过在上一层级函数内调用下一层级函数实现循环嵌套。
from selenium import webdriver
from time import sleep
from lxml import etree
import os
import xlwtclass GetNationalData(): def __init__(self):self.option=webdriver.ChromeOptions()self.option.add_argument('--ignore-certificate-errors')#selenium设置忽略证书的方法self.bro = webdriver.Chrome(executable_path='./chromedriver',options=self.option)def main(self): #主函数self.bro.get('https://data.stats.gov.cn/easyquery.htm?cn=C01')self.bro.maximize_window()sleep(2)js = "var q=document.documentElement.scrollTop=300" self.bro.execute_script(js) sleep(2)#self.parse_treeZhiBiao_1() 调用def ScrollDown(self): #向下拖动滚动条pass def parse_treeZhiBiao_1(self): #解析定位一级指标#self.parse_treeZhiBiao_2() 调用pass def parse_treeZhiBiao_2(self): #解析定位二级指标#self.parse_treeZhiBiao_3() 如果存在3级指标,调用passdef parse_treeZhiBiao_3(self):#解析定位三级指标#self.parse_treeZhiBiao_4() 如果存在4级指标,调用pass def parse_treeZhiBiao_4(self): #解析定位四级指标passdef parse_tableContainer(self): # 进行数据解析和存储 pass if __name__ == "__main__":data = GetNationalData()data.main()
2.解析左侧指标树,实现4级标签定位
解析整体思路:
(1) 获取动态页面加载数据 ;
(2) 使用xpath解析出全部li_list(指标对象所在的标签),确定个数,用于控制循环次数;
(3) 循环执行element定位和click()操作。由于webdriver只能对出现在全局页面的对象进行操作,如果指标对象不在全局页面中,便会报错。此时使用异常处理进行操作,当捕获到错误信息后,就执行滚动条向下拖动操作,使指标对象出现在全局页面中;
(4) 解析二级/三级指标时,需要判断其下是否包含三级/四级指标。通过其下是否含ul标签确认,构建了isElementExist()函数判断element是否存在。
以解析二级指标为例,代码见下:
def isElementExist1(self): #判断二级指标下是否存在ul标签,存在ul标签即存在三级目录self.flag = Truetry:self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/ul')return self.flag except:self.flag = Falsereturn self.flag def parse_treeZhiBiao_2(self): #解析定位二级指标#解析出二级指标page_text2 = self.bro.page_sourcetree2 = etree.HTML(page_text2)li_list2 = tree2.xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li')n2 = len(li_list2)for self.__num2 in range(1,n2+1):while True:try:zhibiao_elem2 = self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/a/span[2]')zhibiao_elem2.click()breakexcept:self.ScrollDown()continuesleep(1)zhibiao_name2 = zhibiao_elem2.text# 判断是否包含三级指标 self.isElementExist1()if self.flag: # 包含,继续解析出三级指标,点击后解析数据 self.parse_treeZhiBiao_3()zhibiao_elem2.click()sleep(1)else:# 不包含,直接解析数据self.parse_tableContainer()self.workbook.save(self.rootpath + '/'+ zhibiao_name2 +'.xls')
3. 解析右侧数据,实现数据存储
三、全部代码
from selenium import webdriver
from time import sleep
from lxml import etree
import os
import xlwtclass GetNationalData():def __init__(self):self.option=webdriver.ChromeOptions()self.option.add_argument('--ignore-certificate-errors')#selenium设置忽略证书的方法self.bro = webdriver.Chrome(executable_path='./chromedriver',options=self.option)self.__num1 = Noneself.__num2 = Noneself.__num3 = Noneself.__num4 = Noneself.workbook = Noneself.mysheet = Noneself.rootpath = Noneself.flag = Nonedef main(self):self.bro.get('https://data.stats.gov.cn/easyquery.htm?cn=C01')self.bro.maximize_window()sleep(2)js = "var q=document.documentElement.scrollTop=300" self.bro.execute_script(js) sleep(2)self.parse_treeZhiBiao_1()def ScrollDown(self): #向下拖动滚动条#向下拖动左侧指标栏对应的滚动条js='document.querySelector("#main-container > div.main-left.left.split-containe").scrollTop=200' self.bro.execute_script(js)sleep(2)#向下拖动全局页面对应的滚动条js = "var q=document.documentElement.scrollTop=100"self.bro.execute_script(js) sleep(2)def parse_treeZhiBiao_1(self): #解析一级指标并建立对应名称的文件夹 page_text1 = self.bro.page_sourcetree1 = etree.HTML(page_text1)li_list1 = tree1.xpath('//*[@id="treeZhiBiao_1_ul"]/li')n1 = len(li_list1) for self.__num1 in range(1,n1+1):while True:try: zhibiao_elem1 = self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/a/span[2]')zhibiao_elem1.click()breakexcept:self.ScrollDown()continuesleep(1)zhibiao_name1 = zhibiao_elem1.textself.rootpath='D:\\国家统计局年度数据\\'+ zhibiao_name1if not os.path.exists(self.rootpath):os.mkdir(self.rootpath) self.parse_treeZhiBiao_2()sleep(1)def isElementExist1(self): #判断二级指标下是否存在ul标签,存在ul标签即存在三级目录self.flag = Truetry:self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/ul')return self.flag except:self.flag = Falsereturn self.flag def parse_treeZhiBiao_2(self): #解析定位二级指标#解析出二级指标page_text2 = self.bro.page_sourcetree2 = etree.HTML(page_text2)li_list2 = tree2.xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li')n2 = len(li_list2)for self.__num2 in range(1,n2+1):while True:try:zhibiao_elem2 = self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/a/span[2]')zhibiao_elem2.click()breakexcept:self.ScrollDown()continuesleep(1)zhibiao_name2 = zhibiao_elem2.text# 判断是否包含三级指标 self.isElementExist1()if self.flag: # 包含,继续解析出三级指标,点击后解析数据 self.parse_treeZhiBiao_3()zhibiao_elem2.click()sleep(1)else:# 不包含,直接解析数据self.parse_tableContainer()self.workbook.save(self.rootpath + '/'+ zhibiao_name2 +'.xls')def isElementExist2(self):self.flag = Truetry:self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/ul/li[{self.__num3}]/ul')return self.flag except:self.flag = Falsereturn self.flag def parse_treeZhiBiao_3(self):#解析定位三级指标page_text3 = self.bro.page_sourcetree3 = etree.HTML(page_text3)li_list3 = tree3.xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/ul/li')n3 = len(li_list3)for self.__num3 in range(1,n3+1): while True:try:zhibiao_elem3 = self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/ul/li[{self.__num3}]/a/span[2]')zhibiao_elem3.click() breakexcept:self.ScrollDown()continuesleep(1)zhibiao_name3 = zhibiao_elem3.text# 判断是否包含四级指标self.isElementExist2()if self.flag: self.parse_treeZhiBiao_4()zhibiao_elem3.click()sleep(1) else:self.parse_tableContainer()self.workbook.save(self.rootpath + '/'+ zhibiao_name3 +'.xls')def parse_treeZhiBiao_4(self): #解析定位四级指标page_text4 = self.bro.page_sourcetree4 = etree.HTML(page_text4)li_list4 = tree4.xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/ul/li[{self.__num3}]/ul/li')n4 = len(li_list4)for self.__num4 in range(1,n4+1): while True:try:zhibiao_elem4 = self.bro.find_element_by_xpath(f'//*[@id="treeZhiBiao_1_ul"]/li[{self.__num1}]/ul/li[{self.__num2}]/ul/li[{self.__num3}]/ul/li[{self.__num4}]/a/span[2]')zhibiao_elem4.click()breakexcept:self.ScrollDown()continuesleep(1)zhibiao_name4 = zhibiao_elem4.textself.parse_tableContainer() self.workbook.save(self.rootpath + '/'+ zhibiao_name4 +'.xls')def parse_tableContainer(self): # 进行数据解析和存储 self.workbook = xlwt.Workbook(encoding='utf-8')self.mysheet = self.workbook.add_sheet('mysheet')table_text = self.bro.page_sourcetree_table = etree.HTML(table_text)th_list = tree_table.xpath('//*[@id="main-container"]/div[2]/div[2]/div[2]/div/div[3]/table/thead/tr/th')x0 = 0for th in th_list:year = th.xpath('./strong/text()')[0]self.mysheet.write(x0,0,year)x0 += 1tr_list = tree_table.xpath('//*[@id="main-container"]/div[2]/div[2]/div[2]/div/div[3]/table/tbody/tr')y = 1for tr in tr_list:x = 0td_list = tr.xpath('./td')for td in td_list: data = td.xpath('./text()')self.mysheet.write(x,y,data)x += 1y += 1if __name__ == "__main__":data = GetNationalData()data.main()
爬取国家统计局最近10年年度数据相关推荐
- 爬取国家统计局人口与就业统计数据,看了你的文章,我朋友晚上托梦告诉我牢饭很好吃
大家好,我是辣条. 爬取目标 网站:国家统计局 效果展示 工具使用 开发工具:pycharm 开发环境:python3.7, Windows10 使用工具包:requests,lxml 重点内容学习 ...
- python爬取国家统计局2019年行政区划分数据
建立数据表: 创建tab_citys mysql 数据表 DROP TABLE IF EXISTS `tab_citys`; CREATE TABLE `tab_citys` (`id` int(11 ...
- 爬取B站10万数据,看看都有哪些热门的UP主
要点: - 爬取10万用户数据 - 数据存储 - 数据词云分析 1.准备阶段 写代码前先构思思路:既然我要爬取用户关注的用户,那我需要存储用户之间的关系,确定谁是主用户,谁是follower. 存储关 ...
- Python3爬取国家统计局官网2019年全国所有城市(2020年更新)
Python3爬取国家统计局官网2019年全国所有城市(2020年更新) 一级城市爬取 一级城市爬取 由于最近需要用到所有城市的数据,故从统计局爬取19年的一级城市数据 import random i ...
- 网络爬虫(动态网页爬取关于混合动力汽车的论文数据)
一.实验目的 (1) 熟悉网页浏览器开发工具的使用: (2) 掌握动态网页加载过程: (3) 掌握 post 请求参数设置: (4) 掌握基本的反反爬技术: (5) 能够根据问题需求,指定网络爬虫方案 ...
- PythonR爬取分析赶集网北京二手房数据(附详细代码)
本文转载自数据森麟(ID:shujusenlin) 作者介绍:徐涛,19年应届毕业生,专注于珊瑚礁研究,喜欢用R各种清洗数据. 知乎:parkson 如何挑战百万年薪的人工智能! https://ed ...
- 每日一练:Python爬虫爬取全国新冠肺炎疫情数据实例详解,使用beautifulsoup4库实现
Python 爬虫篇 - 爬取全国新冠肺炎疫情数据实例详解 效果图展示 第一章:疫情信息的下载与数据提取 ① 爬取页面数据到本地 ② json 字符串正则表达式分析 ③ 提取数据中的 json 字符串 ...
- python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例
本篇文章小编给大家分享一下python爬虫实现爬取同一个网站的多页数据代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.爬虫的目的 从网上获 ...
- 爬取两万多条租房数据,算算在广州你能「活到」第几集?
作者 | zone7 责编 | 仲培艺 此前,笔者曾用 Python 爬取 1.7 万条租房数据,并据此撰文揭示了深圳房价飙升背后的生存压力.此番再析广州租房价格现状,在升级爬虫技术之余,也完善了更多 ...
最新文章
- 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈
- .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)...
- LeetCode Length of Longest Fibonacci Subsequence
- java Paths
- 聪明人自动焊锡机器人_自动焊锡机的基本焊锡原理
- 1132: 零起点学算法39——多组测试数据(a+b)
- 【Java从0到架构师】Filter_Listener_AJAX
- spring+hibernate 下载
- chrome浏览器启用本地exe程序
- 有没有一种软件,可以输入乐谱就能自动演奏的?
- Java的三大基本特征及其特点
- ivms4200 远程桌面访问测试过程及问题汇总
- ray 渲染基本使用流程
- 苹果税要崩溃了!又一国家做出判决:iOS必须开放第三方支付
- Win10隐藏状态栏图标的方法
- php ses 发送邮件,Amazon SES – 通过PHP sdk发送HTML邮件
- 网页提示404什么意思
- 开机时间分析工具WPT Xperf使用
- GAP软件的使用(20150514、20151002、20151004、20151012)
- java7大设计原则