80 行 Python 代码搞定全国区划代码

码农StayUp 2021-10-27 17:36:32
代码 Python 搞定 全国 区划

GitHub源码分享

微信搜索:码农StayUp

主页地址:https://gozhuyinglong.github.io

源码分享:https://github.com/gozhuyinglong/blog-demos

1. 前言

在网站建设中一般会用到全国行政区域划分,以便于做区域数据分析。

下面我们用 Python 来爬取行政区域数据,数据来源为比较权威的国家统计局。爬取的页面为2020年统计用区划代码和城乡划分代码。

这里有个疑问,为啥统计局只提供了网页版呢?提供文件版岂不是更方便大众。欢迎了解的小伙伴给我留言。

2. 网站分析

在爬取数据之前要做的便是网站分析,通过分析来判断使用何种方式来爬取。

2.1 省份页面

一个静态页面,其二级页面使用的是相对地址,通过 class=provincetr 的tr元素来定位

图片
省份页面

2.2 城市页面

一个静态页面,其二级页面使用的是相对地址,通过 class=citytr 的tr元素来定位

图片
城市页面

2.3 区县页面

一个静态页面,其二级页面使用的是相对地址,通过 class=countytr 的tr元素来定位

图片
区县页面

2.4 城镇页面

一个静态页面,其二级页面使用的是相对地址,通过 class=towntr 的tr元素来定位

图片
城镇页面

2.5 村庄页面

一个静态页面,没有二级页面,通过 class=villagetr 的tr元素来定位

图片
村庄页面

3. 安装所需库

通过上面的分析,使用爬取静态网页的方式即可。下面是一些必要的库,需要提前安装好:Requests、BeautifulSoup、lxml。

3.1 Requests

Requests 是一个 Python 的 HTTP 客户端库,用于访问 URL 网络资源。

安装Requests库:

pip install requests

3.2 BeautifulSoup

Beautifu lSoup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。它能够通过指定的转换器实现页面文档的导航、查找、修改等。

安装 BeautifulSoup 库:

pip install beautifulsoup4

3.3 lxml

lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML 和 HTML。

它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且实现了常见的 ElementTree API。

安装lxml库:

pip install lxml

4. 代码实现

爬虫分以下几步:

  • 使用Requests库来获取网页。
  • 使用BeautifulSoup和lxml库解析网页。
  • 使用Python的File来存储数据。

输出文件为:当前py文件所在目录,文件名称:area-number-2020.txt

输出结果为:级别、区划代码、名称,中间使用制表符分隔,便于存到Exce和数据库中。

下面看详细代码:

# -*-coding:utf-8-*-
import requests
from bs4 import BeautifulSoup


# 根据地址获取页面内容,并返回BeautifulSoup
def get_html(url):
    # 若页面打开失败,则无限重试,没有后退可言
    while True:
        try:
            # 超时时间为1秒
            response = requests.get(url, timeout=1)
            response.encoding = "GBK"
            if response.status_code == 200:
                return BeautifulSoup(response.text, "lxml")
            else:
                continue
        except Exception:
            continue


# 获取地址前缀(用于相对地址)
def get_prefix(url):
    return url[0:url.rindex("/") + 1]


# 递归抓取下一页面
def spider_next(url, lev):
    if lev == 2:
        spider_class = "city"
    elif lev == 3:
        spider_class = "county"
    elif lev == 4:
        spider_class = "town"
    else:
        spider_class = "village"

    for item in get_html(url).select("tr." + spider_class + "tr"):
        item_td = item.select("td")
        item_td_code = item_td[0].select_one("a")
        item_td_name = item_td[1].select_one("a")
        if item_td_code is None:
            item_href = None
            item_code = item_td[0].text
            item_name = item_td[1].text
            if lev == 5:
                item_name = item_td[2].text
        else:
            item_href = item_td_code.get("href")
            item_code = item_td_code.text
            item_name = item_td_name.text
        # 输出:级别、区划代码、名称
        content2 = str(lev) + "\t" + item_code + "\t" + item_name
        print(content2)
        f.write(content2 + "\n")
        if item_href is not None:
            spider_next(get_prefix(url) + item_href, lev + 1)


# 入口
if __name__ == '__main__':

    # 抓取省份页面
    province_url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html"
    province_list = get_html(province_url).select('tr.provincetr a')

    # 数据写入到当前文件夹下 area-number-2020.txt 中
    f = open("area-number-2020.txt""w", encoding="utf-8")
    try:
        for province in province_list:
            href = province.get("href")
            province_code = href[02] + "0000000000"
            province_name = province.text
            # 输出:级别、区划代码、名称
            content = "1\t" + province_code + "\t" + province_name
            print(content)
            f.write(content + "\n")
            spider_next(get_prefix(province_url) + href, 2)
    finally:
        f.close()

5. 资源下载

如果你只是需要行政区域数据,那么已经为你准备好了,从下面连接中下载即可。

链接:https://pan.baidu.com/s/18MDdkczwJVuRZwsH0pFYwQ

提取码:t2eg

6. 爬虫遵循的规则

引自:https://www.cnblogs.com/kongyijilafumi/p/13969361.html

  1. 遵守 Robots 协议,谨慎爬取
  2. 限制你的爬虫行为,禁止近乎 DDOS 的请求频率,一旦造成服务器瘫痪,约等于网络攻击
  3. 对于明显反爬,或者正常情况不能到达的页面不能强行突破,否则是 Hacker 行为
  4. 如果爬取到别人的隐私,立即删除,降低进局子的概率。另外要控制自己的欲望
图片


版权声明
本文为[码农StayUp]所创,转载请带上原文链接,感谢
https://toutiao.io/k/a8212hf

  1. LPC55S69 MicroPython模组和库函数
  2. LPC55S69 IoT Kit专属 Micropython模组和库函数简介
  3. 使用soundcard在Python中操作声卡
  4. 自动化快速上手--Python(7)--【字典】--每天半小时
  5. Python之循环结构【包括列表、for语句、range()函数、while语句、循环嵌套、break、continue、算法优化等】
  6. Python模块安装与异常处理详解(numpy、pygame、matplotlib等)
  7. Python__init__.py作用
  8. python 爬取网页时出现多种错误
  9. Python中关于大量绘制速度曲线的问题
  10. python-async的安装和使用方法
  11. Matlab的fread(fild,1,int32)迁移到python变成什么
  12. 想用python开发一个音频过滤器,请指导?
  13. python使用openpyxl读取Excel文件显示No such file or directory
  14. xmoji虚拟头像交互如何使用python(像深度学习)制作?
  15. python 打开页面页面的链接,为什么总是报错呀?
  16. Python中DataLoader的batch_size、shuffle的疑惑。
  17. python安装pymssql库,可以import,但无法调用函数
  18. 【Python学习教程】常用的8个Python数据可视化库!
  19. python处理csv中的时间
  20. 数据结构,元音统计(Python)
  21. python的site-packages复制直接到其他电脑环境上能用吗
  22. Pycharm如何给项目配置python解释器
  23. conda创建python虚拟环境
  24. Python selenium的爬虫无法完整爬取整个页面的内容
  25. 高清版!这18张 Python 数据科学速查表,让你的代码变得更强大!
  26. python代码不会敲,请好心老哥帮助我一下
  27. Python敲七输出符合的个数
  28. Python 有人能给提供简单的思路嘛
  29. python单次运行写入csv成功,循环写入失败
  30. python利用os模块进行增量备份
  31. 【算法学习】807. 保持城市天际线(java / c / c++ / python / go / rust)
  32. 如何利用python输出等腰杨辉三角
  33. python按键执行倒计时小程序不能实现要求,要怎么改才好?
  34. Python request模块post请求的问题
  35. Django连接已有Oracle时的主键设置问题,没主键无法查询怎么办?
  36. 如何用python的dictionary编写一个联系人通讯录程序
  37. 如果Python里range反向输出,不输出步长会怎么样?
  38. 一个关于Python pip的问题: 出现Cannot open \python\Scripts\pip-script.py报错
  39. 富婆闺蜜非让我用Python给她写个淘宝双十一抢购脚本,那只能安排了
  40. 【全网最全】python正则表达式大全,所有讲解都在这,包教包会,学不会找我!
  41. AI python课和 python课都是198 这两个课是同一个课程内容吗?有什么区别和相似点?
  42. python的__new__()疑问
  43. Python代码阅读(第24篇):根据筛选函数将列表元素分成两组
  44. python怎么实现动态障碍物按固定路径行走
  45. Python代码阅读(第24篇):根据筛选函数将列表元素分成两组
  46. Python题目,希望帮我解答一下辛苦
  47. python +selenium 如何获取下拉列表,默认选中值
  48. 有个pb文件做好的模型,对此模型的操作想用python封装成api,怎么做?
  49. 请问,mac的Pycharm中新建项目时候的Base interpreter选项里有两个Python3.8,该选哪个?
  50. python如何读取指定文件名的excel并分别汇总
  51. 如何写利用python将fastq文件转换成fasta文件的脚本
  52. python小工具
  53. 新猿0基础python教程 如何写好接口文档
  54. 请问我哪里错了呀,数值计算,python运算符号出错,但是我看不出来
  55. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏(2)
  56. Python爬虫实战,requests模块,Python实现抓取王者荣耀全套皮肤
  57. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏(3)
  58. 大神们这个问题用python怎么解决啊
  59. 简单理解python装饰器
  60. 货物托运收费问题用python 求解 一直输出错误