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

编程入门 行业动态 更新时间:2024-10-12 20:26:42

python 爬取七普<a href=https://www.elefans.com/category/jswz/34/1729592.html style=人口并展示人口区间的概率分布"/>

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

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

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

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

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

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

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

匹配出的结果如下:

最后用replace把“各”字去掉。

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

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

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

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

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

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

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

爬取人口代码如下:


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 = ".html"       #麦客网爬取各城市七普人口
html = requests.get(url,headers=headers,proxies=proxies,verify=False)
content = html.content.decode('utf-8')
title_city = re.findall(r'><a href="(/\d+.html|/\d+.html)" target="_blank" class="blue">(\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'<h3.*>\n.*?(\w+)\((\d+.*)万人\).*\n</h3>',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)

最后用pandas的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')

更多推荐

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

本文发布于:2024-03-10 17:02:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1728531.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:人口   区间   概率   python   爬取七普

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!