Python高级应用程序设计任务要求
用Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)
一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
猎聘招聘信息爬取与分析
2.主题式网络爬虫爬取的内容与数据特征分析
2.主题式网络爬虫爬取的内容与数据特征分析
爬取猎聘网的工作岗位名称、公司名称、工作地点、薪资待遇以及学历要求,并把这些数据存储在文件中,以及对薪资待遇进行数据分析。
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
首先爬取目标信息,然后将目标信息进行存储,再提取薪资水平,最后对该行业的薪资进行数据可视化分析。
难点:对目标信息进行爬取,以及数据清洗。
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
1.主题页面的结构特征


通过对猎聘网主题页面的分析可以得出:我们传入的在key后面,以及页码在curPage参数里。接下来,我们只需对这两个地方进行传值即可得到我们想要的URL。
2.Htmls页面解析
通过对页面源代码的分析可以知道,我们想要的目标信息在属性为class="sojob-item-main clearfix"的div标签中,接下来就是爬取目标信息。
3.节点(标签)查找方法与遍历方法(必要时画出节点树结构)
我们可以利用find_all()方法查找所有属性为class="sojob-item-main clearfix"的div标签即可获取当前页面的全部目标信息。
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
程序源代码如下:
1 import requests
2 from bs4 import BeautifulSoup
3 import os
4 import re
5 import matplotlib.pyplot as plt
6 from matplotlib.pyplot import plot,savefig
7
8
9 #爬取前程无忧目标的HTML页面
10 def getHTMLText(url,keyword):
11 try:
12 #假装成浏览器访问
13 kv = {'user-agent':'Mozilla/5.0'}
14 #获取目标页面
15 r = requests.get(url,params=keyword,headers = kv)
16 #判断页面是否链接成功
17 r.raise_for_status()
18 #使用HTML页面内容中分析出的响应内容编码方式
19 r.encoding = r.apparent_encoding
20 #返回页面内容
21 return r.text
22 except:
23 #如果爬取失败,返回“爬取失败”
24 return "爬取失败"
25
26 #爬取数据
27 def getData(jlist,slist,clist,plist,elist,html):
28 #创建BeautifulSoup对象
29 soup = BeautifulSoup(html,"html.parser")
30 #遍历所有属性为sojob-item-main clearfix的div标签
31 for div in soup.find_all("div",attrs = {"class":"sojob-item-main clearfix"}):
32 #将爬取到的工作名称存放在jlist列表中
33 jlist.append(div.a.string.strip())
34 #将爬取到的薪资存放在slist列表中
35 slist.append(div.p.span.string)
36 #在div标签中遍历所有属性为company-name的p标签
37 for p in div.find_all("p",attrs = {"class":"company-name"}):
38 #将爬取到的公司名称存放在clist列表中
39 clist.append(p.a.string)
40 #在div标签中遍历所有属性为condition clearfix的p标签
41 for p in div.find_all("p",attrs = {"class":"condition clearfix"}):
42 #如果p标签里的a标签为空,则执行下面语句
43 if p.a == None:
44 plist.append("无")
45 continue
46 #将爬取到的工作地点存放在plist列表中
47 plist.append(p.a.string)
48 #在div标签中遍历所有属性为edu的span标签
49 for span in div.find("span",attrs={"class":"edu"}):
50 #将爬取到的学历要求存放在elist列表中
51 elist.append(span)
52
53 #打印工作信息函数
54 def printUnivList(jlist,slist,clist,plist,elist,num):
55 for i in range(num):
56 print("````````````````````````````````````````````````````````````````````````````")
57 print("公司名称:{}".format(clist[i]))
58 print("岗位名称:{}".format(jlist[i]))
59 print("薪资待遇:{}".format(slist[i]))
60 print("工作地点:{}".format(plist[i]))
61 print("学历要求:{}".format(elist[i]))
62
63
64 #数据存储
65 def dataSave(jlist,slist,clist,plist,elist,keyword,num):
66 try:
67 #创建文件夹
68 os.mkdir("C:\招聘信息")
69 except:
70 #如果文件夹存在则什么也不做
71 ""
72 try:
73 #创建文件用于存储爬取到的数据
74 with open("C:\\招聘信息\\"+keyword+".txt","w") as f:
75 for i in range(num):
76 f.write("````````````````````````````````````````````````````````````````````````````\n")
77 f.write("公司名称:{}\n".format(clist[i]))
78 f.write("岗位名称:{}\n".format(jlist[i]))
79 f.write("薪资待遇:{}\n".format(slist[i]))
80 f.write("工作地点:{}\n".format(plist[i]))
81 f.write("学历要求:{}\n".format(elist[i]))
82 except:
83 "存储失败"
84
85 #数据可视化
86 def dataVisualization(salary1,name):
87 # 创建figure对象
88 plt.figure()
89 # 生成Y坐标列表
90 y = [i for i in range(0,40000,100)]
91 salary1.sort()
92 #X坐标名
93 plt.xlabel('Actual salary')
94 #Y坐标名
95 plt.ylabel('Salary grade')
96 # 绘制salary,线条说明为'salary',线条宽度为2,颜色为红色,数据标记为圆圈
97 plt.plot(y, salary1, label='salary',linewidth = 2, linestyle='', marker='o', color='r')
98 # 显示图例
99 plt.legend()
100 #保存图片
101 savefig("C:\\招聘信息\\"+name+".jpg")
102 # 显示图像
103 plt.show()
104
105
106
107 def main():
108 #猎聘网网址
109 url = "https://www.liepin.com/zhaopin/"
110 #要搜索的岗位名称
111 keyword = input("请输入想要查找的岗位:")
112 #搜索页数
113 pageNum = 10
114 #打印信息条数
115 priNum = pageNum * 40
116 #用来存放工作岗位
117 jlist = []
118 #用来存放薪资
119 slist = []
120 #用来存放工作地点
121 plist = []
122 #用来存放学历
123 elist = []
124 #用来存放公司名称
125 clist = []
126 #循环加入页码,将每页的信息存在列表中
127 for num in range(pageNum):
128 kv = {"key":keyword,"curPage":num}
129 html = getHTMLText(url,kv)
130 getData(jlist,slist,clist,plist,elist,html)
131 #将结果打印出来
132 printUnivList(jlist,slist,clist,plist,elist,priNum)
133 #将爬取到的数据存储在文件中
134 dataSave(jlist,slist,clist,plist,elist,keyword,priNum)
135
136 #存储低段位薪资
137 salary1 = []
138 #中间量
139 flag = []
140 #存储高段位薪资
141 salary2 = []
142 #获取薪资
143 for i in slist:
144 try:
145 #筛选出薪资
146 fg = re.search(r'^(\d)+',i)
147 #将薪资存储在列表中
148 salary1.append(int(fg.group())*1000)
149 except:
150 #如果没具体薪资则存储0
151 salary1.append(0)
152 continue
153
154 #数据可视化
155 dataVisualization(salary1,keyword)
156
157
158 #程序入口
159 if __name__ == "__main__":
160 main()
运行结果如下:
图1

图2

数据存储文件夹:
图3

文件内容:
图4

数据的爬取与采集代码如下:
#爬取前程无忧目标的HTML页面
def getHTMLText(url,keyword):
try:
#假装成浏览器访问
kv = {'user-agent':'Mozilla/5.0'}
#获取目标页面
r = requests.get(url,params=keyword,headers = kv)
#判断页面是否链接成功
r.raise_for_status()
#使用HTML页面内容中分析出的响应内容编码方式
r.encoding = r.apparent_encoding
#返回页面内容
return r.text
except:
#如果爬取失败,返回“爬取失败”
return "爬取失败"
数据进行清洗和处理代码如下:
1 #爬取数据
2 def getData(jlist,slist,clist,plist,elist,html):
3 #创建BeautifulSoup对象
4 soup = BeautifulSoup(html,"html.parser")
5 #遍历所有属性为sojob-item-main clearfix的div标签
6 for div in soup.find_all("div",attrs = {"class":"sojob-item-main clearfix"}):
7 #将爬取到的工作名称存放在jlist列表中
8 jlist.append(div.a.string.strip())
9 #将爬取到的薪资存放在slist列表中
10 slist.append(div.p.span.string)
11 #在div标签中遍历所有属性为company-name的p标签
12 for p in div.find_all("p",attrs = {"class":"company-name"}):
13 #将爬取到的公司名称存放在clist列表中
14 clist.append(p.a.string)
15 #在div标签中遍历所有属性为condition clearfix的p标签
16 for p in div.find_all("p",attrs = {"class":"condition clearfix"}):
17 #如果p标签里的a标签为空,则执行下面语句
18 if p.a == None:
19 plist.append("无")
20 continue
21 #将爬取到的工作地点存放在plist列表中
22 plist.append(p.a.string)
23 #在div标签中遍历所有属性为edu的span标签
24 for span in div.find("span",attrs={"class":"edu"}):
25 #将爬取到的学历要求存放在elist列表中
26 elist.append(span)
将爬取到的数据存放在相应列表中。
3.文本分析(可选):jieba分词、wordcloud可视化
无
4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
代码如下:
1 #数据可视化
2 def dataVisualization(salary1,name):
3 # 创建figure对象
4 plt.figure()
5 # 生成Y坐标列表
6 y = [i for i in range(0,40000,100)]
7 salary1.sort()
8 #X坐标名
9 plt.xlabel('Actual salary')
10 #Y坐标名
11 plt.ylabel('Salary grade')
12 # 绘制salary,线条说明为'salary',线条宽度为2,颜色为红色,数据标记为圆圈
13 plt.plot(y, salary1, label='salary',linewidth = 2, linestyle='', marker='o', color='r')
14 # 显示图例
15 plt.legend()
16 #保存图片
17 savefig("C:\\招聘信息\\"+name+".jpg")
18 # 显示图像
19 plt.show()
将获取到的薪资水平以散点图形式显示出来。
5.数据持久化 代码如下:
1 #数据存储
2 def dataSave(jlist,slist,clist,plist,elist,keyword,num):
3 try:
4 #创建文件夹
5 os.mkdir("C:\招聘信息")
6 except:
7 #如果文件夹存在则什么也不做
8 ""
9 try:
10 #创建文件用于存储爬取到的数据
11 with open("C:\\招聘信息\\"+keyword+".txt","w") as f:
12 for i in range(num):
13 f.write("````````````````````````````````````````````````````````````````````````````\n")
14 f.write("公司名称:{}\n".format(clist[i]))
15 f.write("岗位名称:{}\n".format(jlist[i]))
16 f.write("薪资待遇:{}\n".format(slist[i]))
17 f.write("工作地点:{}\n".format(plist[i]))
18 f.write("学历要求:{}\n".format(elist[i]))
19 except:
20 "存储失败"
将爬取下来的信息以文件形式存储在C盘中。
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
1.经过对主题数据的分析与可视化,可以得到哪些结论?
通过此次对猎聘网web前端工程师的爬取分析后,再结合散点图得出了,全国web前端工程师大多数薪资在15000左右,10000以下的人数占大多数。
2.对本次程序设计任务完成的情况做一个简单的小结。
2.对本次程序设计任务完成的情况做一个简单的小结。
通过本次的任务后,加深了我对爬虫、数据分析的掌握程度,也为对其他工作的全国薪资水平有一个基本的了解。