Python高级应用程序设计

不想你离开。 提交于 2019-12-08 00:39:29

------------恢复内容开始------------

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

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
  招聘网站的信息爬取
2.主题式网络爬虫爬取的内容与数据特征分析
  主要是爬取泉州内的数据内容,包括工作名称、薪资、公司名称、以及公司地点
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
     本方案是利用requests库对目标页面进行爬取,而后再利用bs4库对相关信息进行数据清洗,验证完毕后打印出结果。主要的难点是数据清洗,以及分析整个网页如何找到相关信息的有关区域的关键字。
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

 

 第一个箭头的位置为招聘网站的地区编号,第二个箭头的位置为网页的目前所在的页数


2.Htmls页面解析
 

 

 

 

 

 

 

 从页面审查元素可以看到,我们将要爬取的html页面中,有如下关键信息:每一个职位都是存在于一个class名为el的div容器中,el的div容器中的关键信息为class名为t2、t3、t4、t5,分别是公司名称,工作地点,薪资,以及发布时间,还有一个span标签中保存着工作名称;而我们将要爬取的工作名称、薪资、公司名称、以及公司地点的信息都在相应的位置中找到了。

在当前
3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
查找以及遍历的方法,我们可以使用find_all()方法对特定的标签进行查找
 
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集
#这个是将Python库导入进行使用
import requests
from bs4 import BeautifulSoup
import os

#爬取前程无忧中的泉州市中所有招聘信息
def getHTMLText(url):
    try:
        #获取招聘页面
      r=requests.get(url = "https://search.51job.com/list/")
        #判断是否调用成功,注:返回值为200的状态码才是可以正常爬取
        r.raise_for_status()
        #使用HTML页面的编码方式以免出现乱码的行为
        r.encoding = r.apparent_encoding
        #返回爬取成功的页面内容
        return r.text
    except:
        #如果爬取失败,返回“爬取失败”
        return "爬取失败"

#爬取工作名称
def getTheJobs(jobList,html):
    #使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html,"html.parser")
    #在第一大点第三小点中有提到,find_all()方法遍历所有p标签中为class名为t1的标签
    for p in soup.find_all("p",attrs = "t1"):
        #将p标签中的a标签中的内容存放在jobList列表中
        jobList.append(str(p.a.string).strip())
    #返回列表
    return jobList 

#爬取薪资
def getMoney(jobMoney,html):
    #使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html,"html.parser")
    #遍历所有class名为t4的span标签
    for span in soup.find_all("span",attrs = "t4"):
        #将span标签中的内容存放在jobMoney列表中
        jobMoney.append(str(span.string).strip())
    #删除列表的第0个元素
    jobMoney.pop(0)
     #返回列表
    return jobMoney

#爬取公司名称
def getCompanyName(name,html):
    #使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html,"html.parser")
    #遍历所有class名为t2的span标签
    for span in soup.find_all("span",attrs = "t2"):
        #将span标签中的内容存放在name列表中
        name.append(str(span.string).strip())
    #删除列表的第0个元素
    name.pop(0)
    #返回列表
    return name
  
#爬取工作地点
def getThePlace(place,html):
    soup = BeautifulSoup(html,"html.parser")
    #遍历所有属性为t3的span标签
    for span in soup.find_all("span",attrs = "t3"):
        #将span标签中的内容存放在place列表中
        place.append(str(span.string).strip())
    #删除列表的第0个元素
    place.pop(0)
    return place

#将获取到的数据全部打印出来
def printUnivList(ulist1,ulist2,ulist3,ulist4, num):
    #打印标题
    print("{0:^30}\t{1:^30}\t\t{2:^10}\t{3:^10}\t{4:^5}".format("工作名称","薪资","公司名称","公司地点"))
    #打印主要内容
    for i in range(num):        
print({0:^30}\t{1:^30}\t{2:^10}\t{3:^10}\t{4:^5}".format(ulist1[i],ulist2[i],ulist3[i],ulist4[i]))

#数据保存函数
def dataSave(ulist1,ulist2,ulist3,ulist4,job_name,working_place,num):
    try:
         #创建文件夹
        os.mkdir("D:\招聘信息")
    except:
        #如果文件夹存在则什么也不做
        ""
    try:
        #创建文件用于存储爬取到的数据
        with open("D:\\爬取结果\\"+job_name+"_"+working_place+".txt","w") as f:
            f.write("{0:^30}\t{1:^30}\t\t{2:^10}\t{3:^10}\t{4:^5}\n".format("工作名称","薪资","公司名称","公司地点",))
            for i in range(num):
                f.write("{0:^30}\t{1:^30}\t{2:^10}\t{3:^10}\t{4:^5}\n".format(ulist1[i],ulist2[i],ulist3[i],ulist4[i]))
    except:
        " "

#主函数
def main():
    #前程无忧招聘网
    url = "https://search.51job.com/list/"
    #目标城市代码的字典
    citys = {""泉州":110400"}
    middle1 = ",110400,000000,0000,00,9,99,"
    print("请输入想要查找的工作岗位:")
    job = input()
    middle2 = ",2,"
    last = ".html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
    print("请输入目标城市:")
    city_name = input()
    city = citys[city_name]
    
    #用来存放岗位名称
    jobName = []      
    #用来存放薪资
    Money= [] 
    #用来存放公司名称
    companyName = []  
    #用来存放公司地点
    worePlace = []
    
    #打印的页数加1
    num = 11
    #把第一页到第十页的招聘信息存放在相关的列表中
    for page in range(1,num):
        #组合成一个完整的链接
        Url = url+city+middle1+job+middle2+str(page)+last 
        #获取目标链接的html页面
        html = getHTMLText(Url)
        
       #获取工作名称并存放在相关的列表中
        getTheJobs(jobList,html)
        #获取公司名称并存放在相关的列表中
        getCompanyName(name,html)
        #获取工作地点并存放在相关的列表中
        getThePlace(place,html)
        #获取薪资并存放在相关的列表中
        getMoney(jobMoney,html)

    try:
        #将目标信息打印出来
        printUnivList(jobList,name,place,jobMoney,50*(num-1)-1)
    except:
        #如果招聘信息不足,则引发异常。
        print("无更多招聘信息。")

#将程序进行初始化,并且开始运行程序
if __name__ == "__main__":
    main()

 运行结果如下:

 


2.对数据进行清洗和处理
#爬取工作名称
def getTheJobs(jobList,html):
    #使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html,"html.parser")
    #在第一大点第三小点中有提到,find_all()方法遍历所有p标签中为class名为t1的标签
    for p in soup.find_all("p",attrs = "t1"):
        #将p标签中的a标签中的内容存放在jobList列表中
        jobList.append(str(p.a.string).strip())
    #返回列表
    return jobList 

#爬取薪资
def getMoney(jobMoney,html):
    #使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html,"html.parser")
    #遍历所有class名为t4的span标签
    for span in soup.find_all("span",attrs = "t4"):
        #将span标签中的内容存放在jobMoney列表中
        jobMoney.append(str(span.string).strip())
    #删除列表的第0个元素
    jobMoney.pop(0)
     #返回列表
    return jobMoney

#爬取公司名称
def getCompanyName(name,html):
    #使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html,"html.parser")
    #遍历所有class名为t2的span标签
    for span in soup.find_all("span",attrs = "t2"):
        #将span标签中的内容存放在name列表中
        name.append(str(span.string).strip())
    #删除列表的第0个元素
    name.pop(0)
    #返回列表
    return name
  
#爬取工作地点
def getThePlace(place,html):
    soup = BeautifulSoup(html,"html.parser")
    #遍历所有属性为t3的span标签
    for span in soup.find_all("span",attrs = "t3"):
        #将span标签中的内容存放在place列表中
        place.append(str(span.string).strip())
    #删除列表的第0个元素
    place.pop(0)
    return place

 


3.文本分析(可选):jieba分词、wordcloud可视化
4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
无!
 5.数据持久化
 翻阅了很多资料,无法理解数据持久化,故没有结果,望谅解!
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
主题数据的分析与可视化可以很清晰的看出并且了解到公司的应聘的基本信息。
2.对本次程序设计任务完成的情况做一个简单的小结。
本次主要的任务完成了对与在招聘网站上爬取到页面的数据,并且使用课堂上所学的知识来结合做出的一个小项目,其中在数据分析与可视化、数据持久化中遇到了困难,说明学习程度还不够,所需要学的还有很多。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!