python爬取全国五级行政区

2023-05-16

以前爬过国家统计局的四级行政区(http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2017/),但是对于五级数据效果不是很好。

偶然间发现这个网站:http://www.yigecun.com/ 里面的行政区数据比较齐全,所以下面尝试用python爬取所有的五级行政区,爬完之后格式如下:

1、准备

python的安装我就不讲了,我用的是python3.7.0

IDE是PyCharm,大家可以去官网下载:https://www.jetbrains.com/pycharm/download/#section=windows

说到python爬虫就会有一个工具--BeautifulSoup

安装BeautifulSoup

$ pip install beautifulsoup4

BeautifulSoup官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

2、开始

先说一下抓取思路

1.request请求获取到html页面。

2.将html转换成BeautifulSoup。

3.根据BeautifulSoup的语法规则拿到需要的数据。

4.将数据存入文档。

话不多说,直接上代码:

import urllib.request
from bs4 import BeautifulSoup
import time
import os
import sys

# 请求url,返回html
def url_open(url):

    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36')
    response = urllib.request.urlopen(req)
    html = response.read()
    return html


# 因为一个村的格式比较特殊,这里采用递归去拿数据
def getChild(domain,child,areaName,parentName):
    # 休眠0.5s
    time.sleep(0.5)
    # 根据class规则找数据,当下一个class找不到数据则表示处理完成,捕获异常直接return
    try:
        childClass = child['class']
    except BaseException:
        return

    # 根据样式判断是市还是区
    if 'cunnavtaga' == childClass[0]:
        if areaName != parentName:
            cityName = parentName + "-" + child.contents[0]
        else:
            cityName = areaName + "-" + child.contents[0]
        print(cityName)
        # 写入文件
        try:
            with open(writePath, 'a') as f:
                f.writelines(cityName + '\r\n')
        except Exception:
            print("插入失败", cityName)

        # 递归找下一个class,child.next_sibling是找下一个标签
        getChild(domain,child.next_sibling,cityName,parentName)
    elif 'cunnavtagb' == childClass[0]:
        districtName = areaName+"-"+child.contents[0].contents[0]
        # print(districtName)
        # 写入文件
        try:
            with open(writePath, 'a') as f:
                f.writelines(districtName + '\r\n')
        except Exception:
            print("插入失败", districtName)

        # 拿到a标签的url,获取区县的html内容。child.find("a")表示拿a标签,get('href')表示拿url
        try:
            districtHtml = url_open(domain + child.find("a").get('href'))
        except Exception:
            print("出异常啦,努力重试中")
            # 速度过快可能会被封掉,休息5S再重试
            time.sleep(5)
            districtHtml = url_open(domain + child.find("a").get('href'))
        # districtHtml = url_open(domain + child.find("a").get('href'))
        districtSoup = BeautifulSoup(districtHtml)

        districtChild = districtSoup.find("div", class_="cunnavtaga")
        getDistrictChild(domain, districtChild, districtName,districtName)

        getChild(domain, child.next_sibling, areaName,parentName)


def getDistrictChild(domain,districtChild,areaName,parentName):

    childClass = districtChild['class']
    # print(childClass)
    if 'cunnavtaga' == childClass[0]:
        districtName = areaName + "-" + districtChild.contents[0]
        # print(districtName)
        try:
            with open(writePath, 'a') as f:
                f.writelines(districtName + '\r\n')
        except Exception:
            print("插入失败",districtName)


        getDistrictChild(domain, districtChild.next_sibling, districtName,parentName)
    elif 'cunnavtagb' == childClass[0]:

        townName = areaName + "-" + districtChild.contents[0].contents[0]
        # print(townName)
        try:
            with open(writePath, 'a') as f:
                f.writelines(townName + '\r\n')
        except Exception:
            print("插入失败",townName)

        try:
            nextClass = districtChild.next_sibling['class']
        except BaseException:
            return

        if 'cunnavtaga' == nextClass[0]:
            getDistrictChild(domain,districtChild.next_sibling,parentName,parentName)
        elif 'cunnavtagb' == nextClass[0]:
            getDistrictChild(domain, districtChild.next_sibling,areaName,parentName)
        else:
            return
        # print(child.contents[0].a.get('href'))

def hand_logic(html,domain):
    print("---------开始抓取数据------------")
    # 根据html转换成bs格式
    provinceSoup = BeautifulSoup(html)

    # 这里是拿到所有的省再遍历,select(".cunpaddingl4")表示拿到所有class=cunpaddingl4的标签
    for provinceLink in provinceSoup.select(".cunpaddingl4"):
        # 获取省名字
        provinceName = provinceLink.contents[0]
        print(provinceName)
        # 存入文档
        try:
            with open(writePath, 'a') as f:
                f.writelines(provinceName + '\r\n')
        except Exception:
            print("插入失败",provinceName)

        #print(link.get('href'))
        # 拿到a标签的url,获取html内容。child.find("a")表示拿a标签,get('href')表示拿url
        try:
            cityHtml = url_open(domain+provinceLink.get('href'))
        except Exception:
            print("出异常啦,努力重试中")
            # 速度过快可能会被封掉,休息5S再重试
            time.sleep(5)
            cityHtml = url_open(domain + provinceLink.get('href'))

        citySoup = BeautifulSoup(cityHtml)

        # 拿到div标签中,class="cunnavtaga"样式的数据
        child = citySoup.find("div", class_="cunnavtaga")

        getChild(domain,child,provinceName,provinceName)
    print("----------数据抓取完成--------")

if __name__ == '__main__':
        # python的递归深度默认最大999,这里设置为1000000
        sys.setrecursionlimit(1000000)

        
        writePath = 'D:\SVNspace\python\全国五级数据.txt'
       
        url = "http://www.yigecun.com"
        html = url_open(url)
        hand_logic(html, url)
        # print(html)


方法有很多种,我选择的是通过BeautifulSoup去拿数据,可以节省时间成本,大家在爬的时候有什么问题可以对照BS官方文档,里面的内容讲的蛮好的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬取全国五级行政区 的相关文章

  • Keil 头文件源程序代码——Math.h

    MATH H Prototypes for mathematic functions Copyright c 1988 2002 Keil Elektronik GmbH and Keil Software Inc All rights r
  • Keil头文件代码—Absacc

    ABSACC H Direct access to 8051 extended 8051 and NXP 8051MX memory areas Copyright c 1988 2010 Keil Elektronik GmbH and
  • reg52.h中直接定义了P3^4等引脚,但是P1^5引脚没有明确表示出来?

    实际上reg52 h中已经定义了 34 sfr P0 61 0x80 sfr P1 61 0x90 sfr P2 61 0xA0 sfr P3 61 0xB0 34 等引脚的地址 xff0c 如果取P1 5的引脚 xff0c 只需要表示成
  • 关于scanf很多人不知道的小秘密

    今天忽然想到一个问题 xff0c 假如我利用scanf想给变量a输入一个 d的整数 xff0c 结果不小心输入了一个字符串yf或者是123ff后会怎么样呢 xff1f 哈哈 xff0c 自己测试了一下 xff0c 结果发现 xff0c 当你
  • 关于sizeof(*p+1)的那些事

    今天老铁在写程序时发现一个意外 xff0c 在char a 61 1 3 5 7 9 p 61 a 程序求sizeof p 43 1 时遇到一些意外 xff0c 本来以为会是1 xff0c 结果却出意料的是4 xff0c 这就有些尴尬了 x
  • 求解完数

    完数的定义 xff1a 一个数如果恰好等于它的因子之和 xff0c 这个数就称为 完数 例如 xff1a 6 61 1 xff0b 2 xff0b 3 如果需要求解1000或者10000以内的所有完数 xff0c 怎么做呢 xff1f 分析
  • 查找100-200以内素数

    只能被1和其本身整除的数称为素数 xff0c 1不是素数 xff0c 因为简单 xff0c 所以不做解释 xff0c 直接上程序 源代码如下 xff1a Search all prime numbers from 101 to 200 in
  • 实现4个按键控制8个LED灯1个数码管程序

    按要求C语言编程 xff0c 实现4个按键控制8个LED灯1个数码管程序 具体要求如下 xff1a 1 按键一 xff0c 清零作用 无论数码管以前显示何内容 xff0c 都归零 xff0c 显示0 xff1b 2 按键二 xff0c 加一
  • Linux 关机/重启指令

    Linux系统下关机指令只有root用户终端才能下达 xff08 Linux里切换用户可以用 su root 输入密码便进入 root 用户 xff09 xff0c 同时其他终端也会接收到 如root用户发出关机指令 其他终端也会收到相应的
  • C 语言中的goto、 break 和 continue 语句使用

    一 goto 语句 goto 语句为无条件跳转 xff0c goto 语句后面带一个标识符 xff0c 该标识符是同一个函数 内某条语句的标号 标号可以出现在任何可执行语句的前面 xff0c 并且以一个冒号 xff1a 作为后缀 gt Fi
  • 云台控制协议VISCA、PELCO-D、PELCO-P

    原 云台控制协议VISCA PELCO D PELCO P 2013年12月02日 18 42 21 autowanglei 阅读数 xff1a 10146 更多 lt div class 61 34 tags box space 34 g
  • 目录和文件权限与 umask 关系

    一 权限 文件权限 xff1a r xff1a 读取文件内容的权限 w xff1a 新增 修改和删除文件内容的权限 x xff1a 执行文件的权限 例如 xff1a 一个文件a sh xff0c 它的权限是rw xff0c 使用 a sh
  • open 函数的 flag 参数和错误代码

    一 flag 参数 定义头文件 xff1a lt bits fcntl linux h gt 必选参数说明 xff1a define O ACCMODE 0003 xff1a 读写文件操作时取出 flag 的低两位 define O RDO
  • 系统全局变量 errno 是如何获得 errno.h 中的值的呢?

    很多时候我们在使用 errno 的时候都知道它代表的是 errno h 中的错误值 xff0c 可是为什么它就是代表那些值的呢 xff1f 系统在哪里给它赋值了呢 xff1f 故事就要从源头开始 1 errno 全局变量是在哪里定义的 xf
  • const pointer

    int a b const int p 61 a 与int const p 61 a 是一样的 表示p可以指向a xff0c 也可以改变指向b xff0c 但是不能通过指针p来修改a的值 p 61 b p 61 4 int const q
  • I_O —基础概念(参照 Ubuntu 16.04 版本)

    一 文件的概念 定义 xff1a 所谓文件是指一组相关数据的有序集合 xff0c 这个数据集有一个名称 xff0c 叫文件名 如源程序文件 xff0c 目标文件 xff0c 可执行文件 xff0c 头文件等文件通常是在驻留在外部介质上的 x
  • 网络通信2—UDP 模型程序编写步骤(参照 Ubuntu 16.04 版本)

    UDP 模型程序编写步骤 一 UDP基础模型 服务器流程 step 1 xff1a 创建 socket 套接字接口并判断 sockfd 61 socket AF INET SOCK DGRAM 0 if sockfd 61 61 1 per
  • switch 中 break 和 continue 的区别

    1 break 用来退出 switch xff0c continue 本身是不能用在 switch 里的 xff0c 他必须结合循环来用 xff0c 表示跳过本次循环 2 switch 的 case 语句最后如果没有加 break cont
  • 立即数

    一 概念 xff1a 通常把在 立即寻址方式 指令中给出的数称为立即数 二 判断步骤 xff1a 把数据转换成二进制 xff0c 从低到高写成 4 个一组 xff0c 最高位不够一组的补 0 xff1b 数 1 的个数 xff0c 如果大于
  • 位、字节、char、int(32位系统) 之间的关系

    一 概念 xff1a 位 xff08 bit xff09 xff1a 计算机中最小的数据单位 每一位的状态只能是0或1 字节 xff08 byte xff09 xff1a 存储空间的基本计量单位 xff0c 8 个二进制位构成1个字节 1

随机推荐

  • C语言中的那些宏

    DATE 进行预处理的日期 xff08 Mmm dd yyyy 形式的字符串文字 xff09 FILE 代表当前源代码文件名的字符串文字 LINE 代表当前源代码中的行号的整数常量 TIME 源文件编译时间 xff0c 格式微 hh xff
  • 任务栈简单入门

    最近又把两本进阶书看了一遍 xff0c 但总感觉好记性不如烂笔头 xff0c 所以还是决定通过博客记录一下 xff0c 我们将分两篇来全面深入地记录Activity 启动模式与任务栈的内容 android任务栈简单了解 1 android任
  • VS2010里函数枚举

    一 cout函数 说明 xff1a 调用该函数必须申明头文件 include lt iostream gt 同时声明后面必须使用 using namespace std 正确书写为 xff1a include lt iostream gt
  • I_O—标准 I_O 实验

    一 测试标准 I O 一次可以同时打开多少个文件 1 实验思路 xff1a 利用循环同时打开文件 xff0c 直到不能打开 2 代码如下 xff1a 二 fgetc 和 fputc 实现拷贝文件并输出文件行数 1 实验思路 xff1a 打开
  • Source Insight 配色方案

    Source Insight 对于程序员来说应该不陌生 xff0c 当然一个个性化的编程界面也会让自己赏析悦目 xff0c 下面就将个人的界面设置分享一下 xff1a 一 背景色设置 1 选择 Options Preferences 2 选
  • Linux 网络——交换机不能用两根网线相连

    同一个局域网所有的交换机之间可以用网线串联起来 xff0c 但绝对不能使任意 gt 61 2个交换机形成环路 xff0c 否则局域网内将形成广播风暴 xff0c 所用局域网内的用户都将不能上网 例如局域网内的交换机可以使用如下相连 xff1
  • GDB 知识点——基础操作

    Linux C 中的 GDB 调试使用 xff1a 1 GDB 的主要功能 xff1a 1 启动被调试程序 2 让被调试的程序在指定的位置停住 3 当程序被停住时 xff0c 可以检查程序状态 xff08 如变量的值 xff09 2 检查
  • 员工管理系统(C 语言)——项目说明

    项目名称 xff1a 员工管理系统 项目目的 xff1a 1 实现简单的公司对员工信息的管理 2 通过项目锻炼实现逻辑转换为代码的能力 3 利用函数封装实现项目过程中的逻辑过程以及需求功能的实现 4 学会数据库的操作以及网络通信 5 强化代
  • 员工管理系统(C 语言)——客户端解析

    源码下载地址 xff1a https download csdn net download wenfei11471 10477504 客户端功能 xff1a 1 运行时先测试是否能连通服务器 xff08 不畅通如下图所示 xff09 xff
  • 员工管理系统(C 语言)——服务器解析

    源码下载地址 xff1a https download csdn net download wenfei11471 10477504 服务器功能 xff1a 1 运行时主界面 xff08 服务器启动后 xff0c 只有管理员下线 xff0c
  • 排序——选择排序、冒泡排序和快速排序比较

    一 选择排序思路 xff1a 1 以 int 类型为例 2 拿第一个数与后面数相比较 xff0c 如果比后面的数大则交换 3 拿第二个数与后面的数比较 xff0c 如果比后面的数大则交换 4 直到比较到倒数第二个数 xff0c 最后一个数不
  • C 语言中 const 与指针的结合使用

    请区分一下几种指针的区别 1 const int p 2 int const p 3 int const p 4 const int const p 5 const int const p 解析 xff1a 1 const int p 中
  • Ubuntu16.04上安装百度网盘后打不开

    现在百度网盘推出了Linux版本 xff0c 也有Ubuntu下安装的deb文件 xff0c 但是我在Ubuntu上安装后却打不开 xff0c 报错 baidunetdisk crashed with SIGABRT in gnu cxx
  • C/C++的“文件包含”处理时头文件被重复包含的问题探究及解决方法(用最简单的例子进行说明)

    这篇博文是博文https blog csdn net wenhao ir article details 125668051的配套博文 头文件被重复包含是下面这样的现象 xff1a A文件里包含了C文件 xff0c B文件里也包含了C文件
  • BIN,BCD,ASCII码分别对应的Hex(16进制)数

    BIN BCD ASCII码分别对应的Hex xff08 16进制 xff09 数 以十进制的 56 为例 BIN 码 对应二进制数为 0011 1000对应Hex数据为 0x38BIN码就是二进制数 xff1b 压缩BCD 码 对应二进制
  • .LDS 文件详解

    最近在研究uboot xff0c 红色部分为我加上的注解 转载地址 xff1a http blog chinaunix net space php uid 61 23373524 amp do 61 blog amp cuid 61 232
  • 13 select的优化一

    1 上个例子中 xff0c select通过for循环轮询client套接字 xff0c 轮询的范围比较大 xff0c 有优化的地方 2 优化代码 xff1a 通过数组存储client的套接字 xff0c 达到少轮询的效果 xff0c 可以
  • 二.手写迷你版Tomcat-minicat2.0

    minicat 1 0我们实现了返回固定的字符串 34 Hello minicat 34 minicat 2 0需求 xff1a 封装Request和Response对象 xff0c 返回html静态资源文件 封装Request对象 想要封
  • 三.手写迷你版Tomcat-minicat3.0

    minicat 1 0我们实现了返回固定的字符串 34 Hello minicat 34 minicat 2 0封装Request和Response对象 xff0c 返回html静态资源文件 minicat 3 0需求 xff1a 请求se
  • python爬取全国五级行政区

    以前爬过国家统计局的四级行政区 xff08 http www stats gov cn tjsj tjbz tjyqhdmhcxhfdm 2017 xff09 xff0c 但是对于五级数据效果不是很好 偶然间发现这个网站 xff1a htt