爬虫练习3:提取全国省市县信息并统计
爬取思路:
1、获取网页信息(参照民政部最新的公开数据:http://www.mca.gov.cn/article/sj/xzqh/1980/)
2、根据标签提取省市县信息
3、将提取的数据打印并输出到文件
点击查看代码
# -*- coding: utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
from lxml import html
import re
# python3发送请求,获取页面数据
page = urllib.request.urlopen('http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html')
# 读取页面数据并用lxml解析器来解析
soup = BeautifulSoup(page.read().decode('utf-8'), 'lxml')
# 省市县数量统计
provice = 0
city = 0
county = 0
# 打开文件
f = open('xzqh2020.txt','w',encoding = 'utf-8')
# 提取所有tr标签下的第2、3个td的数据
# 第1行为标题,第2行为空,第3行为分类,倒数9行为无效数据,需剔除。其他均为数据行
for i in range(len(soup.find_all('tr'))-9):
if i == 0:
print (soup.find_all('tr')[i].find('td').text +'\n')
f.write (soup.find_all('tr')[i].find('td').text +'\n')
elif i == 1:
pass
elif i == 2:
code = soup.find_all('tr')[i].find_all('td')[1].text
name = soup.find_all('tr')[i].find_all('td')[2].text
print (code+'\t'+name+'\t省级行政区数\t'+'地级行政区数\t'+'县级行政区数'+'\n')
f.write (code+'\t'+name+'\t省级行政区数\t'+'地级行政区数\t'+'县级行政区数'+'\n')
else:
code = soup.find_all('tr')[i].find_all('td')[1].text
name = soup.find_all('tr')[i].find_all('td')[2].text
# 对数据做分类,0000结尾为省,00结尾为市,其余为县
if re.match('[0-9][0-9]+0000',code):
provice = provice + 1
elif re.match('[0-9][0-9][0-9][1-9]+00',code):
city = city + 1
else:
county = county + 1
print (code+'\t'+name+'\t'+str(provice)+'\t'+str(city)+'\t'+str(county))
f.write (code+'\t'+name+'\t'+str(provice)+'\t'+str(city)+'\t'+str(county)+'\n')
f.write ('省级、地级、县级行政区总数分别为:'+ str(provice) + '\t'+ str(city) + '\t' + str(county))
f.close()
print ('省级、地级、县级行政区总数分别为:'+ str(provice) + '\t'+ str(city) + '\t' + str(county)+'\n'+'数据已下载完成')
点击查看代码
2020年12月中华人民共和国县以上行政区划代码
行政区划代码 单位名称 省级行政区数 地级行政区数 县级行政区数
110000 北京市 1 0 0
110101 东城区 1 0 1
110102 西城区 1 0 2
110105 朝阳区 1 0 3
110106 丰台区 1 0 4
110107 石景山区 1 0 5
110108 海淀区 1 0 6
110109 门头沟区 1 0 7
110111 房山区 1 0 8
110112 通州区 1 0 9
110113 顺义区 1 0 10
110114 昌平区 1 0 11
110115 大兴区 1 0 12
110116 怀柔区 1 0 13
110117 平谷区 1 0 14
110118 密云区 1 0 15
110119 延庆区 1 0 16
120000 天津市 2 0 16
120101 和平区 2 0 17
120102 河东区 2 0 18
120103 河西区 2 0 19
120104 南开区 2 0 20
120105 河北区 2 0 21
................
......中间部分省略......
................
654200 塔城地区 31 311 2841
654201 塔城市 31 311 2842
654202 乌苏市 31 311 2843
654221 额敏县 31 311 2844
654223 沙湾县 31 311 2845
654224 托里县 31 311 2846
654225 裕民县 31 311 2847
654226 和布克赛尔蒙古自治县 31 311 2848
654300 阿勒泰地区 31 312 2848
654301 阿勒泰市 31 312 2849
654321 布尔津县 31 312 2850
654322 富蕴县 31 312 2851
654323 福海县 31 312 2852
654324 哈巴河县 31 312 2853
654325 青河县 31 312 2854
654326 吉木乃县 31 312 2855
659001 石河子市 31 312 2856
659002 阿拉尔市 31 312 2857
659003 图木舒克市 31 312 2858
659004 五家渠市 31 312 2859
659005 北屯市 31 312 2860
659006 铁门关市 31 312 2861
659007 双河市 31 312 2862
659008 可克达拉市 31 312 2863
659009 昆玉市 31 312 2864
659010 胡杨河市 31 312 2865
710000 台湾省 32 312 2865
810000 香港特别行政区 33 312 2865
820000 澳门特别行政区 34 312 2865
省级、地级、县级行政区总数分别为:34 312 2865
数据已下载完成
>>>