Python高级应用程序设计任务

自闭症网瘾萝莉.ら 提交于 2019-12-06 21:48:34

Python高级应用程序设计任务要求


用Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
    猎聘招聘信息爬取与分析
2.主题式网络爬虫爬取的内容与数据特征分析
    爬取猎聘网的工作岗位名称、公司名称、工作地点、薪资待遇以及学历要求,并把这些数据存储在文件中,以及对薪资待遇进行数据分析。
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
    首先爬取目标信息,然后将目标信息进行存储,再提取薪资水平,最后对该行业的薪资进行数据可视化分析。
    难点:对目标信息进行爬取,以及数据清洗。 
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

 

     通过对猎聘网主题页面的分析可以得出:我们传入的在key后面,以及页码在curPage参数里。接下来,我们只需对这两个地方进行传值即可得到我们想要的URL。

2.Htmls页面解析

 

     通过对页面源代码的分析可以知道,我们想要的目标信息在属性为class="sojob-item-main clearfix"的div标签中,接下来就是爬取目标信息。

3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
    我们可以利用find_all()方法查找所有属性为class="sojob-item-main clearfix"的div标签即可获取当前页面的全部目标信息。
 
三、网络爬虫程序设计(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 "爬取失败"
2.对数据进行清洗和处理
    数据进行清洗和处理代码如下:
 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.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
    代码如下:
 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.经过对主题数据的分析与可视化,可以得到哪些结论?
   通过此次对猎聘网web前端工程师的爬取分析后,再结合散点图得出了,全国web前端工程师大多数薪资在15000左右,10000以下的人数占大多数。
2.对本次程序设计任务完成的情况做一个简单的小结。
   通过本次的任务后,加深了我对爬虫、数据分析的掌握程度,也为对其他工作的全国薪资水平有一个基本的了解。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!