python 爬取七普人口并展示人口区间的概率分布

爬虫常用的库:,,,等,本次主要用库以及正则表达式提取关键信息 。
正态分布有一个非常重要的性质:在特定条件下,大量统计独立的随机变量的和的分布趋于正态分布,这就是中心极限定理 。
为了验证中心极限定律,想着爬取七普人口,统计各个人口范围区间内的城市数量,观察直方图,结果查了好多网站也没找到现成的人口数量,最后最后在买购网上看到有按省份给出的地市人口数量 。但是各个省份的人口需要点击进去查看,而且少了新疆的人口 。
打开F12,可以看到调用接口的返回内容 。用 调用接口,获取的内容和F12中查到的内容一致 。
如点击左边的黑龙江各市人口排行榜,页面会打开""
一个一个点开页面再统计,会是对人性的压抑,所以这里通过正则表达式提取出url和对应的省份 。观察发现省份的url前缀为或两种,而除了北京,对应的省份名称都有省份名+各,用各进行精确匹配出省份名 。所以正则中用| 符匹配出url和省份,最后生成的是数组列表,数组包含url和省份名 。
匹配出的结果如下:

python 爬取七普人口并展示人口区间的概率分布

文章插图
最后用把“各”字去掉 。
用爬虫的方法查询各个省份地市人口数据,需要重定向省份的url,然后再次依次调用url,获取数据 。
依次调用省份的url,提取各个省份城市名称及其对应的人口数量 。
提取城市名和人口数量时,调用接口获取的内容进行正则匹配,观察url发现城市和人口数量在url中的位置如下:
但是不是所有的都这样,内容也有如下存放的:
所以正则匹配的时候,用.*? 既可以匹配到多出来的中的内容,没有这部分内容也能匹配到城市名和人口数 。
匹配出的城市名和人口数量保存到city、count
最后把提取的人口保存为excel文件 。同时查询并补充上新疆的人口 。
爬取人口代码如下:
import requestsimport time,datetimeimport pandas as pdimport randomimport json,refrom fake_useragent import UserAgentimport openpyxlitems = [{'http': 'http://171.35.171.247:9999'}]headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Connection': "keep-alive",'User-Agent': UserAgent().random}proxies = random.choice(items)url = "https://www.maigoo.com/goomai/223462.html"#麦客网爬取各城市七普人口html = requests.get(url,headers=headers,proxies=proxies,verify=False)content = html.content.decode('utf-8')title_city = re.findall(r'>(\w+各|北京)\w+', content)#正则匹配census = pd.DataFrame(columns=['city','provence','count'])#城市名称,省份,人口数量fori in range(31):url_city = title_city[i][0]provence_name = title_city[i][1].replace("各","")proxies = random.choice(items)try:time.sleep(1)html = requests.get(url_city, headers=headers, proxies=proxies, verify=False)provence =html.content.decode('utf-8')peopel_city = re.findall(r'\n.*?(\w+)\((\d+.*)万人\).*\n',provence)for item in peopel_city:census = census.append({'city':item[0],'provence':provence_name, 'count':item[1]},ignore_index=True)print(census.shape)except:continuecensus.to_excel("各城市人口2.xlsx",index=False)
最后用的cut 方法按区间统计出每个区间有多少城市,比如大于1600万人口的城市有6座 。
【python 爬取七普人口并展示人口区间的概率分布】没有筛选处理时区间分布直方图如下:
除去直辖市,把海南的几个县合并到一起,再进行统计 。直方图如下:
观察该图,发现该图有点像接近高斯分布 。