Python高级应用程序设计任务

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


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

 

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

 

 

 

 

 

2.Htmls页面解析

 

 

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

3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
    我们可以利用BeautifulSoup提供的find_all()方法查找所有属性为class="sojob-item-main clearfix"的div标签即可获取当前页面的全部目标信息。
 
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
    程序源代码  
import requests
from bs4 import BeautifulSoup
import os
import re
import matplotlib.pyplot as plt
from matplotlib.pyplot import plot,savefig


#爬取猎聘目标的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 "爬取失败"

#爬取数据 
def getData(jlist,slist,clist,plist,elist,html):
    #创建BeautifulSoup对象
    soup = BeautifulSoup(html,"html.parser")
    #遍历所有属性为sojob-item-main clearfix的div标签
    for div in soup.find_all("div",attrs = {"class":"sojob-item-main clearfix"}):
        #将爬取到的工作名称存放在jlist列表中
        jlist.append(div.a.string.strip())
        #将爬取到的薪资存放在slist列表中
        slist.append(div.p.span.string)
        #在div标签中遍历所有属性为company-name的p标签
        for p in div.find_all("p",attrs = {"class":"company-name"}):
            #将爬取到的公司名称存放在clist列表中
            clist.append(p.a.string)
        #在div标签中遍历所有属性为condition clearfix的p标签
        for p in div.find_all("p",attrs = {"class":"condition clearfix"}):
            #如果p标签里的a标签为空,则执行下面语句
            if p.a == None:
                plist.append("")
                continue
            #将爬取到的工作地点存放在plist列表中
            plist.append(p.a.string)
        #在div标签中遍历所有属性为edu的span标签
        for span in div.find("span",attrs={"class":"edu"}):
            #将爬取到的学历要求存放在elist列表中
            elist.append(span)       

#打印工作信息函数
def printUnivList(jlist,slist,clist,plist,elist,num):
    for i in range(num):
        print("公司名称:{}".format(clist[i]))
        print("岗位名称:{}".format(jlist[i]))
        print("薪资待遇:{}".format(slist[i]))
        print("工作地点:{}".format(plist[i]))
        print("学历要求:{}".format(elist[i]))
        print()


#数据存储
def dataSave(jlist,slist,clist,plist,elist,keyword,num):
    try:
         #创建文件夹
        os.mkdir("C:\招聘信息")
    except:
        #如果文件夹存在则什么也不做
        ""
    try:
        #创建文件用于存储爬取到的数据
        with open("C:\\招聘信息\\"+keyword+".txt","w") as f:
            for i in range(num):
                f.write("公司名称:{}\n".format(clist[i]))
                f.write("岗位名称:{}\n".format(jlist[i]))
                f.write("薪资待遇:{}\n".format(slist[i]))
                f.write("工作地点:{}\n".format(plist[i]))
                f.write("学历要求:{}\n\n".format(elist[i]))
    except:
        "存储失败"

#数据可视化
def dataVisualization(salary1,name):
    # 创建figure对象
    plt.figure()
    # 生成Y坐标列表
    y = [i for i in range(0,40000,100)]
    salary1.sort()
    #X坐标名
    plt.xlabel('Actual salary')
    #Y坐标名
    plt.ylabel('Salary grade')
    # 绘制salary,线条说明为'salary',线条宽度为2,颜色为红色,数据标记为圆圈
    plt.plot(y, salary1, label='salary',linewidth = 2, linestyle='', marker='o', color='r')
    # 显示图例
    plt.legend()
    #保存图片
    savefig("C:\\招聘信息\\"+name+".jpg")
    # 显示图像
    plt.show()
   


def main():        
    #猎聘网网址
    url = "https://www.liepin.com/zhaopin/"
    #要搜索的岗位名称
    keyword = input("请输入想要查找的岗位:")
    #搜索页数
    pageNum = 10
    #打印信息条数
    priNum = pageNum * 40
    #用来存放工作岗位
    jlist = []
    #用来存放薪资
    slist = []
    #用来存放工作地点
    plist = []
    #用来存放学历
    elist = []
    #用来存放公司名称
    clist = []
    #循环加入页码,将每页的信息存在列表中
    for num in range(pageNum):
        kv = {"key":keyword,"curPage":num}
        html = getHTMLText(url,kv)
        getData(jlist,slist,clist,plist,elist,html)
    #将结果打印出来
    printUnivList(jlist,slist,clist,plist,elist,priNum)
    #将爬取到的数据存储在文件中
    dataSave(jlist,slist,clist,plist,elist,keyword,priNum)

    #存储低段位薪资
    salary1 = []
    #中间量
    flag = []
    #存储高段位薪资
    salary2 = []
    #获取薪资
    for i in slist:
        try:
            #筛选出薪资
            fg = re.search(r'^(\d)+',i)
            #将薪资存储在列表中
            salary1.append(int(fg.group())*1000)
        except:
            #如果没具体薪资则存储0
            salary1.append(0)
            continue

    #数据可视化   
    dataVisualization(salary1,keyword)
    
    
#程序执行时调用主程序main()
if __name__ == "__main__":
    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.数据持久化
     代码如下:
#数据存储
def dataSave(jlist,slist,clist,plist,elist,keyword,num):
    try:
         #创建文件夹
        os.mkdir("C:\招聘信息")
    except:
        #如果文件夹存在则什么也不做
        ""
    try:
        #创建文件用于存储爬取到的数据
        with open("C:\\招聘信息\\"+keyword+".txt","w") as f:
            for i in range(num):
                f.write("公司名称:{}\n".format(clist[i]))
                f.write("岗位名称:{}\n".format(jlist[i]))
                f.write("薪资待遇:{}\n".format(slist[i]))
                f.write("工作地点:{}\n".format(plist[i]))
                f.write("学历要求:{}\n\n".format(elist[i]))
    except:
        "存储失败"

 

    将爬取下来的信息以文件形式存储在C盘中。

四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
   通过此次对猎聘网web前端工程师的爬取分析后,再结合散点图得出了,全国web前端工程师大多数薪资在15000左右,10000以下的人数占大多数。
2.对本次程序设计任务完成的情况做一个简单的小结。
   通过本次的任务后,加深了我对爬虫、数据分析的掌握程度,也为对其他工作的全国薪资水平有一个基本的了解。
posted @ 2019-12-06 21:46  骆耀  阅读(479)  评论(0编辑  收藏  举报