文章目录

  • ⛳️ 目标站点分析

晨会,我那有钱但是不会技术的老板又发话了:咱这网站上的省市三级联动数据看起来有点旧,你去官方采集一份新的吧。

小擦:BOSS,去网上下载一份新的不行吗?
BOSS:最准确的是民政部官网的,赶紧去抓,别墨迹!
小擦:好的领导(喳)

这就是今天这篇博客产生的原因了,作为会一点点 Python 的产品经理,时不时的就要采集一些小量数据,这活就不用找开发大哥了,我自己就干了。

目标页如下所示,目标地址为:xzqh.mca.gov.cn/map

⛳️ 目标站点分析

编写小爬虫最耗时的步骤就是页面分析,本案例也会把大篇幅内容放在这里。

第一步:打开目标站点,得到下图所示筛选框

这就是本案例的关键数据区域,通过开发者工具可以查看到第一个下拉列表的数据如下:

下面就是本案例第一步的代码,获取该下拉列表数据。通过 requests 获取模块之后,分析源码竟然发现 JSON 串,如下所示:


这部分数据获取直接采用正则表达式匹配模块即可。

import requests
from lxml import etree
import re
import jsonheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ……"
}
def get_level_1():res = requests.get('http://xzqh.mca.gov.cn/map',headers=headers)content =res.textpattern = re.compile('var json = (.*?);')result = pattern.search(content)ret = result.group(1)print(ret)if __name__ == '__main__':get_level_1()

代码运行结果如下所示:

下面将其转换为 JSON 对象,代码如下:

def get_level_1():res = requests.get('http://xzqh.mca.gov.cn/map',headers=headers)content =res.textpattern = re.compile('var json = (.*?);')result = pattern.search(content)ret = result.group(1)# 整理成JSON格式json_result = json.loads(ret)

原计划继续找下拉数据的接口,结果在页面中直接发现了其它目标数据,如下图所示:

那省下了调用接口的麻烦,直接获取省市区县隐藏数据即可。

# 提取地级市和区县
pattern1 = re.compile("<input type=\"hidden\" value='(.*?)'")
result1 = pattern1.search(content)
ret1 = result1.group(1)
print(ret1)

运行代码,提取到目标数据。

两部分数据都已经准备好,接下来就是拼接环节,需要将数据进行组合,结果拼接的时候发现第二次获取的数据被平铺展示了,无法直接进行筛选,所以还是要回归到接口调用层次,即使用下述接口组合数据。

调用的接口是:http://xzqh.mca.gov.cn/selectJson
参数:shengji: 河北省(冀)

迭代省份数据,获取二级列表的代码如下所示:


def get_level_1():res = requests.get('http://xzqh.mca.gov.cn/map', headers=headers)content = res.textpattern = re.compile('var json = (.*?);')result = pattern.search(content)ret = result.group(1)json_result = json.loads(ret)for sheng in json_result:# 获取省份数据s = sheng["shengji"]headers["Host"] = "xzqh.mca.gov.cn"headers["Origin"] = "http://xzqh.mca.gov.cn/map"headers["Referer"] = "http://xzqh.mca.gov.cn/map"headers["Accept"] = "application/json, text/javascript, */*; q=0.01"headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"# 获取区县数据inner_res = requests.post('http://xzqh.mca.gov.cn/selectJson', data={"shengji": s}, headers=headers)xian = inner_res.json()for x in xian:diji = x["diji"]diji_res = requests.post('http://xzqh.mca.gov.cn/selectJson', data={"shengji": s, "diji": diji},headers=headers)print(diji_res.json())

此时县级数据也已经获取到,如下所示:

最后一步对代码进行一下清理,将核心数据进行提取。

import requests
from lxml import etree
import re
import jsonheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}def get_level_1():res = requests.get('http://xzqh.mca.gov.cn/map', headers=headers)content = res.textpattern = re.compile('var json = (.*?);')result = pattern.search(content)ret = result.group(1)json_result = json.loads(ret)for sheng in json_result:s = sheng["shengji"]s_daima = sheng["quHuaDaiMa"]headers["Host"] = "xzqh.mca.gov.cn"headers["Origin"] = "http://xzqh.mca.gov.cn/map"headers["Referer"] = "http://xzqh.mca.gov.cn/map"headers["Accept"] = "application/json, text/javascript, */*; q=0.01"headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"inner_res = requests.post('http://xzqh.mca.gov.cn/selectJson', data={"shengji": s}, headers=headers)diji = inner_res.json()for d in diji:diji_name = d["diji"]dijidaima = d["quHuaDaiMa"]xian_res = requests.post('http://xzqh.mca.gov.cn/selectJson', data={"shengji": s, "diji": diji_name},headers=headers)xian = xian_res.json()for x in xian:xianname = x["xianji"]xiandaima = x["quHuaDaiMa"]print(s, s_daima, diji_name, dijidaima,xianname,xiandaima)if __name__ == '__main__':get_level_1()

运行代码之后,得到了如下数据。

北京市(京) 110000 北京市 110000 东城区 110101
北京市(京) 110000 北京市 110000 西城区 110102
北京市(京) 110000 北京市 110000 朝阳区 110105
北京市(京) 110000 北京市 110000 丰台区 110106
北京市(京) 110000 北京市 110000 石景山区 110107

妥妥的新版省市县三级数据,然后存储到 csv 文件中,完成领导交代的任务。

小擦呀,这省市三级联动的数据不太准确,找份最新的吧相关推荐

  1. dropdownlist ajax联动,asp.net省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例...

    本文主要列举了省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例.前段时间需要作一个的Web前端应用,需要用多个框架,一个典型的应用场景是省市三级 ...

  2. Mysql省市县数据表最新版 省市县三级联动(数据表)

    链接:https://www.liuniukeji.com/index/liuhongyu Mysql省市县数据表最新版 省市县三级联动(数据表) CREATE TABLE city ( id int ...

  3. 中国行政区域省市县三级联动json数据(包含港澳台)

    中国行政区域省市县三级联动json数据(包含港澳台) 中国省市县json数据,包含港澳台地区详细数据(台湾地区市县同级,市下有区,县级以下没补充乡镇列表,使用的话需要注意下,数据来源国家民政部行政划分 ...

  4. 完整,详细的基于jquery省市三级联动和基于angular的省市三级联动对比

    前几天遇到需要输入地址的一个项目,里面就会有全国各个省市县的选择. 对于全国省市县的选择,难点在于全国省市县的数据资源.而具体的操作并不是很难. 本来我想免费发送资源的,可是csdn,这最少也需要1积 ...

  5. 支付宝小程序实现自定义地区三级联动

    支付宝小程序自定义地区三级联动 场景数据结构: [{"id": 110000,"name": "北京市","children&qu ...

  6. 微信小程序picker组件 - 省市二级联动及其回显

    picker 从底部弹起的滚动选择器,现支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器. picker官方文档链接 由于项目需 ...

  7. 微信小程序picker组件 - 省市二级联动

    picker 从底部弹起的滚动选择器,现支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器. picker官方文档链接 由于项目需 ...

  8. 无刷新 省市区 三级联动 完整数据 javascript

    <!-- /* PCAS (Province City Area Selector 省.市.地区联动选择JS封装类) Ver 2.01 完整版 */ 制作时间:2005-12-30 更新时间:2 ...

  9. 基于layui的省市区三级联动(数据交互)

    项目中用到了省市区三级联动的一个效果 于是借助layui的下拉框和回调,用ajax请求完成动态的省市区三级联动 话不多说上代码 html代码: <div class="labcon l ...

  10. ajax js java省市三级联动菜单,AJAX省市区三级联动下拉菜单(java版)

    此小程序的功能主要是采用异步请求方式从数据库中调取省市区信息显示到下拉列表: 代码如下: 建立数据库中的代码和一些配置文件信息就省略了,主要有javascript中的代码为: $(document). ...

最新文章

  1. JAVA C++ 左花括号{该另起一行写还是写在行尾的思考
  2. vue重启node_【ts】vue-typescript-admin类型any仍然报错
  3. js判断一个对象是否为空
  4. mysql用户创建,及授权
  5. Linux压缩和解压缩命令汇总(tar命令汇总)
  6. 【CodeForces - 1066A~E】水题,模拟(有技巧),思维,题意难懂的模拟,二进制问题(有技巧)
  7. python开发框架大全_最受欢迎 Top 12 Python 开源框架,你都用过吗?
  8. aws rds监控慢sql_AWS RDS SQL Server中的初始Windows身份验证配置
  9. Xshell 和 Xftp 免费下载
  10. oracle odac 客户端 区别,ODAC使用指南 (一)ODAC常见问题集
  11. epcs1s是epcs1系列的么_网络商城分销EPCS1SI8N【长期合作】
  12. 单细胞测序最新研究进展(2021年7月)
  13. MySql的基石——索引
  14. kvm中raw格式转换为qcow2格式节省主机空间
  15. iOS自己实现二维码生成与扫描
  16. linux下10款markdown软件
  17. 计算机基础知识还有那些,关于电脑基础知识有哪些
  18. 肠道-甲状腺轴如何影响健康
  19. 如何用cmd安装Python库
  20. [2021绿城杯] [Misc] 流量分析 + cobaltstrike 流量解密

热门文章

  1. PDF怎么打印?为什么有时选择打印没有反应?
  2. 天空之城:拉马努金式思维训练法
  3. mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义
  4. 复杂网络-小世界网络WS模型
  5. 计算机组成原理:计算机的分类
  6. Excel将两个图片合并为一张
  7. 关于金仓数据库的java连接问题
  8. hdu6287(分解质因数+二分)
  9. leetcode一些常用的工具的总结
  10. 天擎终端安全管理系统未授权访问SQL注入漏洞