微信搜索:码农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[0: 2] + "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. 如果爬取到别人的隐私,立即删除,降低进局子的概率。另外要控制自己的欲望

80行Python代码搞定全国区划代码的更多相关文章

  1. 10行代码搞定移动web端自定义tap事件

    发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...

  2. 30行代码搞定WCF并发性能测试

    [以下只是个人观点,欢迎交流] 30行代码搞定WCF并发性能 轻量级测试. 1. 调用并发测试接口 static void Main()         {               List< ...

  3. 180行ruby代码搞定游戏2048

    最今在玩2048这款小游戏,游戏逻辑简单,很适合我这样的对于游戏新入行的人来实现逻辑.于是选择了最拿手的ruby语言来实现这款小游戏的主要逻辑.还是挺简单的,加起来4小时左右搞定. 上代码: requ ...

  4. 5行js代码搞定导航吸顶效果

    一.HTML布局 首先写HTML布局 <body> <div id="wrap"></div> </body> 二.CSS样式 给点 ...

  5. 3kb jQuery代码搞定各种树形选择。

    自制Jquery树形选择插件. 对付各种树形选择(省市,分类..)90行Jquery代码搞定,少说废话直接上插件代码.稍后介绍使用说明.是之前写的一个插件的精简版. 1.Jquery插件代码 /* * ...

  6. Asp.Net Core 轻松学-一行代码搞定文件上传 JSONHelper

    Asp.Net Core 轻松学-一行代码搞定文件上传   前言     在 Web 应用程序开发过程中,总是无法避免涉及到文件上传,这次我们来聊一聊怎么去实现一个简单方便可复用文件上传功能:通过创建 ...

  7. 一行代码搞定 FTP 服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  8. 开源作品ThinkJDBC—一行代码搞定数据库操作

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  9. jquery侧边折叠导航栏制作,两行代码搞定

    jquery侧边折叠导航栏制作,两行代码搞定 //CSS*{margin: 0;padding: 0} ul{list-style: none} .menu li ul{display: none} ...

随机推荐

  1. 响应式编程库RxJava初探

    引子 在读 Hystrix 源码时,发现一些奇特的写法.稍作搜索,知道使用了最新流行的响应式编程库RxJava.那么响应式编程究竟是怎样的呢? 本文对响应式编程及 RxJava 库作一个初步的探索. ...

  2. JVM虚拟机基础

    JVM 全称Java Virtual Machine,也就是我们耳熟能详的Java 虚拟机.它能识别.class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作. Ja ...

  3. 阿里云VOD(一)

    一.阿里云视频点播 1.功能介绍 视频点播(ApsaraVideo VoD,简称VoD)是集视频采集.编辑.上传.媒体资源管理.自动化转码处理(窄带高清TM).视频审核分析.分发加速于一体的一站式音视 ...

  4. InnoDB的主键选择与插入优化

    索引的存放方式MyISAM和InnoDB存储引擎在MySQL中,不同存储引擎对索引的实现方式是不同的,总结下MyISAM和InnoDB两个存储引擎的索引实现方式.MyISAM引擎使用B+Tree作为索 ...

  5. 笔记 | 吴恩达新书《Machine Learning Yearning》

    这本书共112页,内容不多,偏向于工程向,有很多不错的细节,在此记录一下. 0 书籍获取 关注微信公众号"机器学习炼丹术",回复[MLY]获取pdf 1 测试集与训练集的比例 2 ...

  6. https://channels.readthedocs.io/en/latest/tutorial/part_2.htmlhttps://channels.readthedocs.io/en/latest/tutorial/part_2.html

    https://channels.readthedocs.io/en/latest/tutorial/part_2.html

  7. 【PC Basic】CPU、核、多线程的那些事儿

    一.CPU与核的概念 1.半导体中名词[Wafer][Chip][Die]中文名字和用途 Wafer--晶圆 wafer 即为图片所示的晶圆,由纯硅(Si)构成.一般分为6英寸.8英寸.12英寸规格不 ...

  8. 一文打尽端口复用 VS Haproxy端口复用

    出品|MS08067实验室(www.ms08067.com) 本文作者:Spark(Ms08067内网安全小组成员) 1.概述   Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tc ...

  9. Python魔法函数与两比特量子系统模拟

    技术背景 本文主要涵盖两个领域的知识点:python的魔法函数和量子计算模拟,我们可以通过一个实际的案例来先审视一下这两个需求是如何被结合起来的. 量子计算模拟背景 ProjectQ是一个非常优雅的开 ...

  10. 开发基础 (变量、数据类型、格式化输出、运算符、流程控制、while循环)

    一.变量 name = "SmallNine" 等号前面是变量名(标识符),等号后面是变量值 变量的主要作用:就是把程序运算的中间结果临时存到内存里,已备后面的代码继续调用. 变量 ...