一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称:爬取华图教育官网2019年福建公务员招聘岗位信息
2.主题式网络爬虫爬取的内容与数据特征分析:爬取2019年福建公务员招聘岗位信息
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
1).从网络上获取华图教育福建公务员招聘岗位信息内容 ,需要先看清楚要爬取的内容
2).提取网页内容中信息核实的数据结构,提取时需注意所需要的内容所在的标签,前后容易混淆
3).创建文件夹自动下载招聘信息表
4).利用数据结构展示并输出结果,绘制分析图其中选择的x、y轴的信息
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
1.主题页面的结构特征
2.Htmls页面解析
3.节点(标签)查找方法与遍历方法
查找方法:find_all
遍历方法:for循环
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集
1 import requests 2 from bs4 import BeautifulSoup 3 url="http://zw.huatu.com/skzwb/" 4 def getHTMLText(url): #请求url链接 5 try: 6 r=requests.get(url,timeout=30) #get获取url信息,并且设置时间是30秒 7 r.raise_for_status() #根据返回的Response对象,调用raise_for_status()方法判断返回的内容是否正常 8 #状态200表示返回的内容正确;状态不是200,则引发HTTPError异常 9 r.encoding=r.apparent_encoding #用encoding替代apparent_encoding使返回内容的解码正确 10 return r.text #返回网页内容 11 except: 12 return"产生异常" 13 print(getHTMLText(url))
1 import requests 2 from bs4 import BeautifulSoup 3 filelist = [] 4 getFile(html,filelist) #获取文件名 5 url = 'http://fj.huatu.com/2019/0307/1550247.html' 6 r = requests.get(url) 7 r.encoding=r.apparent_encoding 8 def getFile(html,filelist): #获取文件名 9 soup = BeautifulSoup(html,"html.parser") 10 for p in soup.find_all("p"): #遍历所有属性为p的p标签 11 for a in p.find_all("a"): #遍历p标签中的a标签 12 if '2019' in a.attrs['href']: #判断a标签中的herf属性中是否含有“2019” 13 filelist.append(a.get_text()) #将含有“2019”的a的文本内容存储在filelist列表中 14 print(filelist)
1 import requests 2 from bs4 import BeautifulSoup 3 import os 4 5 url = "http://fj.huatu.com/2019/0307/1550247.html" #华图教育公务员考试网 6 7 html = getHTMLText(url) #获取页面html代码 8 filelist = [] #存储文件名 9 getFile(html,filelist) #获取文件名 10 urllist = [] #存储目标url链接 11 getURL(html,urllist) #获取目标的url链接 12 13 def getHTMLText(url): #请求url链接 14 try: 15 r = requests.get(url,timeout=30) #get获取url信息,并且设置时间是30秒 16 r.raise_for_status() #根据返回的Response对象,调用raise_for_status()方法判断返回的内容是否正常 17 #状态200表示返回的内容正确;状态不是200,则引发HTTPError异常 18 r.encoding = r.apparent_encoding #用encoding替代apparent_encoding使返回内容的解码正确 19 return r.text #返回页面内容 20 except: 21 return "产生异常" #如果爬取失败,返回“产生异常” 22 23 def getFile(html,filelist): #获取文件名 24 soup = BeautifulSoup(html,"html.parser") 25 for p in soup.find_all("p"): #遍历所有属性为p的p标签 26 for a in p.find_all("a"): #遍历p标签中的a标签 27 if '2019' in a.attrs['href']: #判断a标签中的herf属性中是否含有“2019” 28 filelist.append(a.get_text()) #将含有“2019”的a的文本内容存储在filelist列表中 29 return filelist 30 31 def getURL(html,urllist): #获取目标链接 32 soup = BeautifulSoup(html,"html.parser") 33 for p in soup.find_all("p"): #遍历所有属性为p的p标签 34 for a in p.find_all("a"): #遍历p标签中的a标签 35 if '2019' in a.attrs['href']: #判断a标签中的herf属性中是否含有“2019” 36 urllist.append(a.attrs['href']) #将含有“2019”的a中的链接存储在urllist列表中 37 return urllist 38 39 def dataStore(file,name): #数据存储 40 try: 41 os.mkdir("D:\省考职位表") #创建文件夹 42 except: 43 "" 44 try: 45 with open("D:\\省考职位表\\{}.xls".format(name),"wb") as fp: #创建文件存储爬取到的数据 46 fp.write(file.content) 47 print("下载成功") 48 except: 49 "存储失败" 50 51 for i in range(0,len(urllist)): #将目标信息存储在本地 52 file=requests.get(urllist[i]) #获取链接下的文件信息 53 dataStore(file,filelist[i]) #将文件信息存储在本地
2.对数据进行清洗和处理
1 #导入数据集 2 import pandas as pd 3 fj=pd.DataFrame(pd.read_excel('D:\省考职位表/2019福建省公 务员考试职位表.xls')) 4 fj.head()
1 # 删除无效列 2 fj.drop('机关代码', axis = 1, inplace=True) 3 fj.head()
1 # 查找重复值 2 fj.duplicated()
1 # 删除重复值 2 fj = fj.drop_duplicates() 3 fj.head()
1 # 统计空值的个数 2 fj['备注'].isnull().value_counts()
1 # 使用fillna方法填充空值 2 fj['备注'] = fj['备注'] .fillna('无') 3 fj
1 #使用describe查看统计信息 2 fj.describe()
3.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
1 # 数据柱形图 2 import pandas as pd 3 import numpy as np 4 import matplotlib.pyplot as plt 5 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示中文标签 6 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 7 data=np.array([1056,493,110,230,162]) 8 index=['A类','A类(乡镇)','A类加考公安','B类','B类加考法语'] 9 s = pd.Series(data, index) 10 s.name='省考考试类别' 11 s.plot(kind='bar',title='省考考试类别') 12 plt.show()
1 #饼图 2 import matplotlib.pyplot as plt 3 Labels = ['福州', '龙岩', '南平', '宁德', '莆田', '泉州', '三明', '厦门','省直','漳州'] 4 Data = [563,192,405,214,121,194,235,96,598,96] 5 #cols = ['r','g','y','coral'] 6 #绘制饼图 7 plt.pie(Data ,labels=Type, autopct='%1.1f%%') 8 plt.axis(aspect='equal') #将横、纵坐标轴标准化处理,设置显示图像为正圆 9 plt.rcParams['font.sans-serif']=['SimHei'] #设置字体样式 10 plt.title('2019年福建省公务员各地区招考人数比例') 11 plt.show()
1 # 绘制堆叠图 2 academic_requirements=['大专及以上','本科及以上','研究生及以上招考人数'] 3 junior_college=[416] 4 undergraduate=[2148] 5 graduate_student=[52] 6 x=list(range(len(junior_college))) 7 plt.stackplot(academic_requirements,junior_college,undergraduate,graduate_student, colors=['teal','darkorange','lightcoral'], labels=['大专及以上', '本科及以上','研究生及以上']) 8 plt.title("大专及以上、本科及以上和研究生及以上招考人数") 9 plt.xlabel("学历要求") 10 plt.ylabel("招考人数(人)") 11 plt.legend() 12 plt.show()
4.数据持久化
5.全部代码
1 import requests 2 from bs4 import BeautifulSoup 3 import os 4 5 url = "http://fj.huatu.com/2019/0307/1550247.html" #华图教育公务员考试网 6 7 html = getHTMLText(url) #获取页面html代码 8 filelist = [] #存储文件名 9 getFile(html,filelist) #获取文件名 10 urllist = [] #存储目标链接 11 getURL(html,urllist) #获取目标链接 12 13 def getHTMLText(url): #请求url链接 14 try: 15 r = requests.get(url,timeout=30) #get获取url信息,并且设置时间是30秒 16 r.raise_for_status() #根据返回的Response对象,调用raise_for_status()方法判断返回的内容是否正常 17 #状态200表示返回的内容正确;状态不是200,则引发HTTPError异常 18 r.encoding = r.apparent_encoding #用encoding替代apparent_encoding使返回内容的解码正确 19 return r.text #返回页面内容 20 except: 21 return "产生异常" #如果爬取失败,返回“产生异常” 22 23 def getFile(html,filelist): #获取文件名 24 soup = BeautifulSoup(html,"html.parser") 25 for p in soup.find_all("p"): #遍历所有属性为p的p标签 26 for a in p.find_all("a"): #遍历p标签中的a标签 27 if '2019' in a.attrs['href']: #判断a标签中的herf属性中是否含有“2019” 28 filelist.append(a.get_text()) #将含有“2019”的a的文本内容存储在filelist列表中 29 return filelist 30 31 def getURL(html,urllist): #获取目标链接 32 soup = BeautifulSoup(html,"html.parser") 33 for p in soup.find_all("p"): #遍历所有属性为p的p标签 34 for a in p.find_all("a"): #遍历p标签中的a标签 35 if '2019' in a.attrs['href']: #判断a标签中的herf属性中是否含有“2019” 36 urllist.append(a.attrs['href']) #将含有“2019”的a中的链接存储在urllist列表中 37 return urllist 38 39 def dataStore(file,name): #数据存储 40 try: 41 os.mkdir("D:\省考职位表") #创建文件夹 42 except: 43 "" 44 try: 45 with open("D:\\省考职位表\\{}.xls".format(name),"wb") as fp:#创建文件存储爬取到的数据 46 fp.write(file.content) 47 print("下载成功") 48 except: 49 "存储失败" 50 51 for i in range(0,len(urllist)): #将目标信息存储在本地 52 file=requests.get(urllist[i]) #获取链接下的文件信息 53 dataStore(file,filelist[i]) #将文件信息存储在本地
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
1.经过对主题数据的分析与可视化,可以得到哪些结论?
1)、省考考试类别中,A类最多,其次是A类(乡镇),而后是B类加考法语、B类,A类加考公安
2)、招考人数中,省直地区最多,再是福州和南平,其余相差无几
3)、招考人数的学历要求中,本科及以上远远高于大专及以上和研究生及以上
2.对本次程序设计任务完成的情况做一个简单的小结。
通过本次的设计任务,更好地了解主题式网络爬虫。在从一开始的选题就首先要注意,不是随意选择就可以进行爬取的。除了依据自己的能力,还需根据对应的网站或者网页进行判断。在查找内容位置的标签等还需更加仔细。基本上完成了大致的数据提取以及清洗和处理。在过程中遇到困惑的问题,通过查找资料以及请教同学进行解决。对一些相关的知识点还是不够熟悉,还需要进一步加强。
来源:https://www.cnblogs.com/y--r/p/12045699.html