首页 >> 大全

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

2023-11-15 大全 30 作者:考证青年

爬虫常用的库:,,,等,本次主要用库以及正则表达式提取关键信息。

正态分布有一个非常重要的性质:在特定条件下,大量统计独立的随机变量的和的分布趋于正态分布,这就是中心极限定理。

为了验证中心极限定律,想着爬取七普人口,统计各个人口范围区间内的城市数量,观察直方图,结果查了好多网站也没找到现成的人口数量,最后最后在买购网上看到有按省份给出的地市人口数量。但是各个省份的人口需要点击进去查看,而且少了新疆的人口。

打开F12,可以看到调用接口的返回内容。用 调用接口,获取的内容和F12中查到的内容一致。

如点击左边的黑龙江各市人口排行榜,页面会打开""

一个一个点开页面再统计,会是对人性的压抑,所以这里通过正则表达式提取出url和对应的省份。观察发现省份的url前缀为或两种,而除了北京,对应的省份名称都有省份名+各,用各进行精确匹配出省份名。所以正则中用| 符匹配出url和省份,最后生成的是数组列表,数组包含url和省份名。

匹配出的结果如下:

_人数区间_人口分布曲线

最后用把“各”字去掉。

用爬虫的方法查询各个省份地市人口数据,需要重定向省份的url,然后再次依次调用url,获取数据。

依次调用省份的url,提取各个省份城市名称及其对应的人口数量。

提取城市名和人口数量时,调用接口获取的内容进行正则匹配,观察url发现城市和人口数量在url中的位置如下:

但是不是所有的都这样,内容也有如下存放的:

所以正则匹配的时候,用.*? 既可以匹配到多出来的中的内容,没有这部分内容也能匹配到城市名和人口数。

匹配出的城市名和人口数量保存到city、count

最后把提取的人口保存为excel文件。同时查询并补充上新疆的人口。

爬取人口代码如下:

python">
import requests
import time,datetime
import pandas as pd
import random
import json,re
from fake_useragent import UserAgent
import 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'])  #城市名称,省份,人口数量
for  i 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:continue
census.to_excel("各城市人口2.xlsx",index=False)

最后用的cut 方法按区间统计出每个区间有多少城市,比如大于1600万人口的城市有6座。

没有筛选处理时区间分布直方图如下:

除去直辖市,把海南的几个县合并到一起,再进行统计。直方图如下:

观察该图,发现该图有点像接近高斯分布。

import numpy
import pandas as pd
import matplotlib.pyplot as plt
from pyecharts.charts import Bar
from pyecharts import options as optsdata = pd.read_excel("各城市人口2.xlsx")
data = pd.DataFrame(data)
people_count = data['count'].values.tolist()
range_num = []
labes = []
j = 1
for i in range(0,1700,100):range_num.append(i)labes.append(str(i)+"-"+str(j*100))j+=1
range_num.append(5000)
labes.pop(-1)
labes.append("大于1600")
print(range_num,labes)
cuts = pd.cut(people_count,range_num,labels=labes)
couts_range = cuts.value_counts().values.tolist()bar = Bar(init_opts=opts.InitOpts(width="2000px",height="700px",page_title="各个区间范围的城市数"))
bar.add_xaxis(labes)
bar.add_yaxis("", couts_range)
bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=20)),title_opts=opts.TitleOpts(title="区间内的城市数量", subtitle="坐"),datazoom_opts=opts.DataZoomOpts(),
)bar.render_notebook()
bar.render('全国区间人口2.html')

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了