史上超详细python爬取国家统计局数据

2 篇文章 1 订阅
2 篇文章 1 订阅

引言:当我们练习数据分析或者数学建模需要数据的时候,如果找不到现成的数据,爬虫不失为一种很好的获取数据的技术手段

首先声明,本博客仅为个人学习记录,所爬取数据为国家统计局公开数据,不做任何商业用途仅供学习用途,如果能提供一丁点参考将是本人的荣幸

在开始之前,我顺带提一下Robots协议。Robots协议全程Robots Exclusion Protocol,简单来说就是该协议规定了哪些能爬哪些不能爬,具体详见–>Robots协议
环境说明:
jupyter notebook(交互式感觉对爬虫来说更方便)
Chrome浏览器

1.首先查看网站

浏览器输入: http://data.stats.gov.cn/easyquery.htm?cn=A01 打开如下图所示:

在这里插入图片描述
我们要爬取的就是红框中的内容

2.分析网页结构

2.1 按F12,出现如下页面

在这里插入图片描述
2.2 但我们需要的并不是这个页面,还需要点击箭头指向的NetWork,然后在下面找到XHR,如下图所示:
XHR简介
在这里插入图片描述
点开第一个可以发现诸如URL、状态码之类的,在这里,应该留意到页面底部的Query String Parameters,后面会用到
在这里插入图片描述
2.3 然后我们依次点开剩下的两个
第二个的URL和Query String Parameters分别是:
在这里插入图片描述
在这里插入图片描述
第三个URL和Query String Parameters分别是:
在这里插入图片描述
在这里插入图片描述
通过分析第二个和第三个我们发现,它们的前面部分是一样的,即http://data.stats.gov.cn/easyquery.htm,问号后面的内容虽然不一样,但是和自己Query String Parameters里面的内容一样。学过计算机网络的都应该知道问号后面是传给服务器的参数。

2.4 我们可以发现第三个URL中有个m=QueryData,那我们应该可以做一个大胆的猜测:这个URL就是返回数据的。我们可以点开Response简单验证下:
在这里插入图片描述
与页面展示的数据进行比对,发现数据吻合,那说明我们猜想的线路没错
因此我们已经初步可以根据Query String Parameters构造键值对了,但是并没有完,这里有个小陷阱,后面详讲

3. 避开陷阱

3.1 上面我们提到了有个小陷阱,那就是如果我们直接使用Request URL,爬取的数据与页面并不一样。 这是为什么呢?让我们继续仔细查看网页,我们可以看到一个下拉式菜单

在这里插入图片描述
当我们点击“最近13个月”的时候,XHR里面会多出来一项
在这里插入图片描述
我们可以看到,新的这一条Query String Parameters里面dfwds不再是空了,而之前第三条的dfwds为空。当我们再次查看Response的时候,会发现数据吻合。那么新的这一条URL应该就能真实返回数据了。这里的k1经查证,是时间戳

4. 开始爬虫

  • 需要导入的库如下:
  • import requests
    import numpy as np
    import pandas as pd
    from bs4 import BeautifulSoup
    import time
    import json
    
  • 生成时间戳
  • def getTime():
        return int(round(time.time() * 1000))
    
  • 爬虫代码,传递url、headers、键值对参数。最终爬取的数据以json的形式展示
  • url='http://data.stats.gov.cn/easyquery.htm?cn=A01'
    headers={'User-Agent':'Mozilla/5.0(Windows;U;Windows NT6.1;en-US;rv:1.9.1.6) Geko/20091201 Firefox/3.5.6'}#浏览器代理
    key={}#参数键值对
    key['m']='QueryData'
    key['dbcode']='hgyd'
    key['rowcode']='zb'
    key['colcode']='sj'
    key['wds']='[]'
    key['dfwds']='[{"wdcode":"sj","valuecode":"LAST13"}]'
    key['k1']=str(getTime())
    r=requests.get(url,headers=headers,params=key)
    js=json.loads(r.text)
    js
    

    爬虫数据json展示如下:
    在这里插入图片描述

    5. 数据预处理

    这里对于数据的处理操作我搞得比较冗余,熟悉的朋友可以按自己的思路走 我们想要的数据其实是在strdata里面,但是这个strdata被层层“包裹”,需要像剥洋葱一样一层一层剥开。但是一定要注意,剥开一层之后数据格式的变化!
  • 初步解析json,首先查看strdata最外层,我们可以看到strdata外面还包裹了一层'datanodes'
  • 在这里插入图片描述

  • 进一步解析json,这次我们应该剥开"datanodes",并查看它数据格式为后面做准备
  • 在这里插入图片描述

  • 既然是列表,那我们获取元素就更方便了,但应该注意的是列表里面的元素数据格式是字典类型
  • 在这里插入图片描述

  • 我们可以从上图看到strdata就是键值对的值,同时整个字典类型数据存在于列表里面,那事情就好办啦——遍历列表通过键获取值
  • 在这里插入图片描述

  • 将列表转换成9*13的DataFrame
  • 在这里插入图片描述

  • DataFrame行列重命名
  • 在这里插入图片描述

  • 最终结果展示
  • 在这里插入图片描述
    为数不多的几次爬虫,写得不好的地方请大家指正

  • 83
    点赞
  • 513
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值