一、编码流程

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年年度数据相关推荐

  1. 爬取国家统计局人口与就业统计数据,看了你的文章,我朋友晚上托梦告诉我牢饭很好吃

    大家好,我是辣条. 爬取目标 网站:国家统计局 效果展示 工具使用 开发工具:pycharm 开发环境:python3.7, Windows10 使用工具包:requests,lxml 重点内容学习 ...

  2. python爬取国家统计局2019年行政区划分数据

    建立数据表: 创建tab_citys mysql 数据表 DROP TABLE IF EXISTS `tab_citys`; CREATE TABLE `tab_citys` (`id` int(11 ...

  3. 爬取B站10万数据,看看都有哪些热门的UP主

    要点: - 爬取10万用户数据 - 数据存储 - 数据词云分析 1.准备阶段 写代码前先构思思路:既然我要爬取用户关注的用户,那我需要存储用户之间的关系,确定谁是主用户,谁是follower. 存储关 ...

  4. Python3爬取国家统计局官网2019年全国所有城市(2020年更新)

    Python3爬取国家统计局官网2019年全国所有城市(2020年更新) 一级城市爬取 一级城市爬取 由于最近需要用到所有城市的数据,故从统计局爬取19年的一级城市数据 import random i ...

  5. 网络爬虫(动态网页爬取关于混合动力汽车的论文数据)

    一.实验目的 (1) 熟悉网页浏览器开发工具的使用: (2) 掌握动态网页加载过程: (3) 掌握 post 请求参数设置: (4) 掌握基本的反反爬技术: (5) 能够根据问题需求,指定网络爬虫方案 ...

  6. PythonR爬取分析赶集网北京二手房数据(附详细代码)

    本文转载自数据森麟(ID:shujusenlin) 作者介绍:徐涛,19年应届毕业生,专注于珊瑚礁研究,喜欢用R各种清洗数据. 知乎:parkson 如何挑战百万年薪的人工智能! https://ed ...

  7. 每日一练:Python爬虫爬取全国新冠肺炎疫情数据实例详解,使用beautifulsoup4库实现

    Python 爬虫篇 - 爬取全国新冠肺炎疫情数据实例详解 效果图展示 第一章:疫情信息的下载与数据提取 ① 爬取页面数据到本地 ② json 字符串正则表达式分析 ③ 提取数据中的 json 字符串 ...

  8. python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例

    本篇文章小编给大家分享一下python爬虫实现爬取同一个网站的多页数据代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.爬虫的目的 从网上获 ...

  9. 爬取两万多条租房数据,算算在广州你能「活到」第几集?

    作者 | zone7 责编 | 仲培艺 此前,笔者曾用 Python 爬取 1.7 万条租房数据,并据此撰文揭示了深圳房价飙升背后的生存压力.此番再析广州租房价格现状,在升级爬虫技术之余,也完善了更多 ...

最新文章

  1. 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈
  2. .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)...
  3. LeetCode Length of Longest Fibonacci Subsequence
  4. java Paths
  5. 聪明人自动焊锡机器人_自动焊锡机的基本焊锡原理
  6. 1132: 零起点学算法39——多组测试数据(a+b)
  7. 【Java从0到架构师】Filter_Listener_AJAX
  8. spring+hibernate 下载
  9. chrome浏览器启用本地exe程序
  10. 有没有一种软件,可以输入乐谱就能自动演奏的?
  11. Java的三大基本特征及其特点
  12. ivms4200 远程桌面访问测试过程及问题汇总
  13. ray 渲染基本使用流程
  14. 苹果税要崩溃了!又一国家做出判决:iOS必须开放第三方支付
  15. Win10隐藏状态栏图标的方法
  16. php ses 发送邮件,Amazon SES – 通过PHP sdk发送HTML邮件
  17. 网页提示404什么意思
  18. 开机时间分析工具WPT Xperf使用
  19. GAP软件的使用(20150514、20151002、20151004、20151012)
  20. java7大设计原则

热门文章

  1. 智慧园区解决方案-数字孪生-最新全套合集
  2. pandas数据分析案例--2012美国总统竞选赞助数据分析
  3. Git原理入门及具体使用介绍
  4. 精通正则表达式学习记录 第一章 正则表达式入门
  5. 简单实验用三极管制作单按键开关来控制LED
  6. android 悬浮窗 播放器,Lua Player
  7. 湖南计算机专业好的二本学校排名2015,2015湖南二本大学排名
  8. 电力工程做什么的?电力工程怎么接项目?
  9. Python绘制词云图并统计词频
  10. VLC media player组播测试使用总结