中国人口密度分析
Python 网络爬虫课程设计要求
一、选题的背景
为什么要选择此选题?要达到的数据分析的预期目标是什么?(10 分)从社会、经济、技术、数据来源等方面进行描述(200 字以内)
社会的不断发展,但贫困地区的经济似乎没有得到显著的改善。通过对各地区的人口和面积分析中国人口分布情况。预期目标得到中国许多人烟稀少的地方。分析我国人口分布不均的原因,以及人口流动给地区之间造成了不平衡的影响的后果。
二、主题式网络爬虫设计方案(10 分)
- 主题式网络爬虫名称:中国人口密度分析
- 2.主题式网络爬虫爬取的内容与数据特征分析

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
三、主题页面的结构特征分析(10 分)
1.主题页面的结构与特征分析
第一个页面可以发现数据在tr标签的td标签中,
第二个页面可以发现数据在p标签中
2.Htmls 页面解析
通过找到tr标签遍历对td标签索引可以取的数据,第二个对p标签遍历获取数据。
3.节点(标签)查找方法与遍历方法(必要时画出节点树结构)
四、网络爬虫程序设计(60 分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后
面提供输出结果的截图。
- 数据爬取与采集
2.对数据进行清洗和处理

3.文本分析(可选):jieba 分词、wordcloud 的分词可视化
4.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)




- 根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程(一元或多元)。
5.数据持久化
![]()
7.将以上各部分的代码汇总,附上完整程序代码
1 from bs4 import BeautifulSoup 2 import requests 3 import seaborn as sns 4 import csv 5 import pandas as pd 6 import matplotlib.pyplot as plt 7 from sklearn import metrics 8 import warnings 9 warnings.filterwarnings("ignore") 10 def request_cqputure(url): #尝试爬取网站返回文本形式 11 try: 12 headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\ 13 537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"} 14 r=requests.get(url,headers=headers)#抓取页面数据时间30秒 15 r.raise_for_status() #如果状态不是200引发异常 16 r.encoding = r.apparent_encoding #更改编码为utf-8 17 return r.text 18 except: 19 return "false" 20 21 #1.调用函数爬取并解析 22 url="https://www.hongheiku.com/tag/各省" 23 a=request_cqputure(url) 24 soup=BeautifulSoup(a) 25 26 #对爬取数据进行选取存入列表规范化 27 bb=[] 28 for i in soup.find_all("tr")[4:]: 29 dd=0 30 aa=[] 31 for a in i.find_all("td"): 32 if dd==0: 33 aa.append(a.string) 34 elif dd==1: 35 aa.append(a.string) 36 elif dd==2: 37 aa.append(a.string) 38 elif dd==3: 39 aa.append(a.string) 40 #elif dd==4: 41 # aa.append(a.string) 42 dd=dd+1 43 bb.append(aa) 44 print(bb) 45 #存入文件长时间保存这里因为第一次用后为了不麻烦还是继续用该方法转化 46 data=[] 47 for e in range(0,68,2): 48 data.append(bb[e]) 49 with open("D:\\陈明盛人口\\rk.csv","w",encoding="utf-8") as fi: 50 writer=csv.writer(fi) 51 writer.writerow(["排名","城市","常住人口","六普人口"])#给每列的数据列名 52 for a in data: 53 writer.writerow(a) 54 fi.close() 55 #对数据清洗对一部分数据类型转换 56 df=pd.read_csv("D:\\陈明盛人口\\rk.csv") 57 for s in range(len(df["城市"])): 58 df.loc[s,"常住人口"]=df.loc[s,"常住人口"][:-1] 59 df.loc[s,"六普人口"]=df.loc[s,"六普人口"][:-1] 60 #-------------下面一行去除台湾多余的str 61 df.loc[25,"常住人口"]=df.loc[25,"常住人口"][:-1] 62 df 63 for s in range(len(df["城市"])): 64 gut=0 65 #print(type(df.loc[s,"六普人口"]))#类型查看 66 #将字符串转int 67 for s in range(len(df["城市"])): 68 if df.loc[s,"常住人口"]==str or float: 69 df.loc[s,"常住人口"]=float(df.loc[s,"常住人口"]) 70 else: 71 gg2=0 72 df.loc[s,"常住人口"]=gg2 73 #对空值进行筛选处理 74 if df.loc[s,"六普人口"]=='': 75 gg1=0 76 df.loc[s,"六普人口"]=gg1 77 elif df.loc[s,"六普人口"]==str or float: 78 df.loc[s,"六普人口"]=float(df.loc[s,"六普人口"]) 79 #for s in range(len(df["城市"])): 80 # print(type(df.loc[s,"六普人口"])) 81 #将字符串转int 82 for s in range(len(df["城市"])): 83 if df.loc[s,"常住人口"]==str or float: 84 df.loc[s,"常住人口"]=float(df.loc[s,"常住人口"]) 85 else: 86 gg2=0 87 df.loc[s,"常住人口"]=gg2 88 #对空值进行筛选处理 89 if df.loc[s,"六普人口"]=='': 90 gg1=0 91 df.loc[s,"六普人口"]=gg1 92 elif df.loc[s,"六普人口"]==str or float: 93 df.loc[s,"六普人口"]=float(df.loc[s,"六普人口"]) 94 def request_cqputure(url): #尝试爬取网站返回文本形式 95 try : 96 headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\ 97 537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"} 98 r = requests.get(url,headers=headers,timeout = 30)#抓取页面数据时间30秒 99 r.raise_for_status() #如果状态不是200引发异常 100 r.encoding = r.apparent_encoding #更改编码为utf-8 101 return r.text 102 except: 103 return "false" 104 105 #1.调用函数爬取并解析 106 url="https://www.163.com/dy/article/G8V2BNUP0543NPP0.html" 107 aa=request_cqputure(url) 108 soup3=BeautifulSoup(aa) 109 110 #------------------------------------------- 111 #----------------这段代码只能运行一次如果失败得重新运行 112 #---------------------数据的处理非常麻烦要得到想要的数据得不断去掉无用的东西 113 tj=[] 114 city2=[] 115 for iri in soup3.find_all("p")[3:42]: 116 if len(iri)=="": 117 break 118 else: 119 tj.append(iri.text) 120 for ikk in tj: 121 if len(ikk)==0: 122 tj.remove(ikk) 123 #这里同时对城市和面积筛选 124 for fff in range(len(tj)): 125 a=tj[fff].split(":") 126 city2.append(a[0]) 127 tj[fff]=a[1] 128 for fff in range(len(tj)): 129 eee=tj[fff].split("平") 130 tj[fff]=eee[0] 131 #数据里面有许多万这里进行处理统一变为float 132 ttaa=tj 133 for i in range(len(ttaa)): 134 if ttaa[i][-1]=="万": 135 ttaa[i]=float(ttaa[i][:-2])*10000 136 else: 137 ttaa[i]=float(ttaa[i]) 138 #ttaa 139 #----------------城市筛选 140 for ttt in range(len(city2)): 141 hjk=city2[ttt].split(".") 142 city2[ttt]=hjk[1] 143 #放入字典方便与第一组数据对比插入 144 dats={} 145 for dfg in range(len(tj)): 146 dats.update({city2[dfg]:ttaa[dfg]}) 147 #新加一列存入面积 148 df["面积"]="" 149 for ik in range(len(df["城市"])): 150 try: 151 df.loc[ik,"面积"]=float(dats[df.loc[ik,"城市"]]) 152 except: 153 df.loc[ik,"面积"]=0 154 #存入csv数据保存 155 df.to_csv("D:\\陈明盛人口\\rk.csv") 156 #存入csv数据保存 157 df.to_csv("D:\\陈明盛人口\\rk.csv") 158 plt.subplot(1,2,1) 159 plt.boxplot(df["六普人口"]) 160 plt.subplot(1,2,2) 161 plt.boxplot(df["常住人口"]) 162 a_25=0 163 a_50=0 164 a_75=0 165 a_100=0 166 DF=len(df["面积"]) 167 for gh in range(DF): 168 if df.loc[gh,"六普人口"]>5653.500000: 169 a_100=a_100+1 170 elif df.loc[gh,"六普人口"]>3630.315000: 171 a_75=a_75+1 172 elif df.loc[gh,"六普人口"]>2016.325000: 173 a_50=a_50+1 174 else: 175 a_25=a_25+1 176 a_data=[a_25,a_50,a_75,a_100] 177 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #显示中文标签,处理中文乱码问题 178 plt.rcParams['axes.unicode_minus']=False 179 #构造数据 180 labels = ["0-25%", "25-50%", "50-75%", "75-100%"] 181 colors = ['#CE0000', '#ff9999', '#4F4F4F', '#CABEFF'] 182 plt.pie(a_data, #绘图数据 183 labels=labels, 184 colors=colors, 185 autopct='%.2f%%', 186 pctdistance=0.8, 187 labeldistance=1.1, 188 startangle=180, 189 radius=2.5, 190 counterclock=False, 191 wedgeprops={'linewidth':1.5, 'edgecolor':'green'}, 192 textprops={'fontsize':10, 'color':'black'}, 193 ) 194 #添加图标题 195 plt.title('人口城市分布') 196 #显示图形 197 plt.show() 198 #观察是否 199 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 200 plt.scatter(df["面积"],df["六普人口"]) 201 plt.title('面积人口关系图') 202 plt.ylabel("六普人口") 203 plt.xlabel("面积") 204 plt.show() 205 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 206 a=range(34) 207 plt.bar(['a_25','a_50','a_75','a_100'],a_data) 208 plt.title('各区域人口比例区域数量') 209 plt.ylabel("人口比例区域数量") 210 plt.show() 211 #人口排名查看 212 plt.plot(df["排名"],df["六普人口"]) 213 plt.title('人口排名查看') 214 plt.xlabel("排名") 215 plt.ylabel("六普人口") 216 plt.show()
五、总结(10 分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标?
中国的西北地方,地广人稀,而东南沿海的地方人口密集,造成了住房紧张,就业难,房价高,消费水平高等,相比西北地方而言,东南沿海较为发达,劳动力充足。基本上达到了预期的目标。
2.在完成此设计过程中,得到哪些收获?以及要改进的建议?
了解了我国人口的基本分布和人口比例情况 。在完成这个设计的过程中也遇到了许多的问题,明白了自己不足之处,也是我人生中一大挑战。接下来还得继续学习,缺乏的实际动手的经验,还要不断积累,随时做好角色转换的准备。

浙公网安备 33010602011771号