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
1.数据爬取与采集 数据的爬取与采集代码如下:
#爬取前程无忧目标的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.对本次程序设计任务完成的情况做一个简单的小结。
通过本次的任务后,加深了我对爬虫、数据分析的掌握程度,也为对其他工作的全国薪资水平有一个基本的了解。