文章目录
- 一、爬虫简介
- 1.实现原理
- 2.爬取网页流程
- 二、网页分析
- 的构建
- 2.网页信息分析
- 三、程序实现
- 1.程序模块
- 1.1 xpath解析库简介
- 1.2获取单个网页的全部信息
- 1.3获得所有网页的全部信息
- 1.4将获取的数据写入Excel文件
- 2.运行结果
- 四、总结
一、爬虫简介
1.实现原理
网络爬虫的工作原理是从一个或若干初始网页的链接开始进而得到一个链接队列,伴随着网页的抓取又不断从抓取到的网页里抽取新的链接放入到链接队列中,直到爬虫程序满足系统的某一条件时停止。
2.爬取网页流程
2.1获取初始的URL。初始的URL地址可以由用户人为地指定,也可以由用户指定的某个或某几个初始爬取网页决定。
2.2根据初始的URL爬取页面并获得新的URL。获得初始的URL地址之后,首先需要爬取对应URL地址中的网页,爬取了对应的URL地址中的网页后,将网页存储到原始数据库中,并且在爬取网页的同时,发现新的URL地址,同时将已爬取的URL地址存放到一个URL列表中,用于去重及判断爬取的进程。
2.3将新的URL放到URL队列中。在第2步中,获取了下一个新的URL地址之后,会将新的URL地址放到URL队列中。
2.4从URL队列中读取新的URL,并依据新的URL爬取网页,同时从新网页中获取新URL,并重复上述的爬取过程。
2.5当满足爬虫系统设置的停止条件时,停止爬取。
下面是网络爬虫爬取网页的流程图。
二、网页分析
的构建
本次爬虫要爬取的网页是猎聘网招聘python职位信息,在浏览器搜索可获得初始URL,为/zhaopin/?compkind=&dqs=&pubTime=&pageSize=40&salary=&compTag=&sortFlag=15°radeFlag=0&compIds=&subIndustry=&jobKind=&industries=&compscale=&key=python&siTag=I-7rQ0e90mv8a37po7dV3Q%7EfA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_prime&d_ckId=2a73bb81da437eaca77c273bf88090e5&d_curPage=8&d_pageSize=40&d_headId=2a73bb81da437eaca77c273bf88090e5&curPage=0
由于要爬取多页数据,再根据网页URL的特点,我采用“固定地址”+“不同数字码”的方法来获得所有页面的URL。下图展示的是多个网页的URL特点。
2.网页信息分析
查看网页源代码,分析可得:此网页的请求方法为post;每一个招聘python相关职位的信息存放在一个class="sojob-item-main clearfix"的div里,且要获取的年薪放在class="text-warning"的span标签里,要获取的地区放在class="area"的a标签里,要获取的学历放在class=“edu"的span标签里,要获取的工作经验也放在span标签里,要获取的公司名称放在target=”_blank"的a标签里。下图是招聘python相关职位数据的源代码。
故先利用初始URL爬取首页网页上的所有招聘python相关职位的数据,再利用URL特性得到所有网页的URL,从而爬取多个网页的招聘python相关职位的数据,然后将所有数据整理在一起,最后写入excel文件。
三、程序实现
1.程序模块
1.1 xpath解析库简介
此次爬虫使用的解析库是xpath(XML路径语言),它是一种用来确定XML文档中某部分位置的语言。xpath 使用路径表达式来选取 XML 文档中的节点或者节点集。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。这些步骤以“/”字符分开,每一步有三个构成成分:
① 轴描述(用最直接的方式接近目标节点)
② 节点测试(用于筛选节点位置和名称)
③ 节点描述(用于筛选节点的属性和子节点特征)
下图展示的是xpath的路径表达式的相关描述。
1.2获取单个网页的全部信息
每个网页需要获取的数据分别为招聘Python相关职位的名称(jobName)、年薪(salary)、学历(education)、工作经验(experience)、招聘的公司(company)以及所在地区(area)。由上文可知每一个招聘python相关职位的信息存放在一个class="sojob-item-main clearfix"的div里,要获取的年薪放在class="text-warning"的span标签里,要获取的地区放在class="area"的a标签里,要获取的学历放在class=“edu"的span标签里,要获取的工作经验也放在span标签里,要获取的公司名称放在target=”_blank"的a标签里。接下来使用xpath解析库获取这些数据。
下面是获取单个页面的所有数据的代码。
def get_Infor(source):
# 使用etree解析页面源码,使我们可以使用xpath拿到我们想要的数据
result = (source)
lis = ("//div[@class='sojob-result ']/ul[@class='sojob-list']/li")
# 获取所有的li标签
infors_list = []
# 存储整个页面的数据
for i in lis:
div_infor = (".//div[@class='sojob-item-main clearfix']/div[@class='job-info']")[0]
# 获取class属性为job-info的div,这个div里边放的有职业名称,年薪,地点,学历,经验
jobName = div_infor.xpath("./h3/@title")[0]
# print(jobName)
# 获取上面h3中的职业名称
pinfor = div_infor.xpath("./p[@class='condition clearfix']")[0]
# 获取第一个p标签,这个标签中有年薪,学历,经验
infors = ("./span/text()")
# print(infors)
# 获取三个span的文本值,是一个列表
salary = infors[0][:-4] # 第一个span中的值放的是薪水,利用切片切除后四个字符
# print(salary)
education = infors[1] # 第二个span中的值是学历
experience = infors[2] # 第三个span中的值是经验
area = ("./a[@class='area']/text()")
# 因为地点在class属性为area的a标签的文本值,所以这一步可以获取地点值
companyDiv = (".//div[@class='sojob-item-main clearfix']/div[@class='company-info nohover']")[0]
# 可以通过这一步拿到公司信息放在的div标签
company = ("./p/a[@target='_blank']/text()")
# 拿到div后,因为公司的值在当前div的p标签下targe属性为_blank的a标签值,所以这一步可以拿到公司信息
# print(company)
if area and company:
# 当拿到的公司信息和地点信息不为空时,进行数据的收集,因为这两个数据可能为空
infor = {"jobName": jobName[2:], "salary": salary, "education": education,
"experience": experience,"company": company[0], "area": area[0]}
# 先将一个职位的信息放在一个字典中
infors_list.append(infor)
# 现在存放一个职位的信息,当所有循环结束,一个页面的信息就存储完成的
return infors_list # 将一个页面的信息返回出去
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
1.3获得所有网页的全部信息
上文已经获取了单个网页的信息,通过分析可知,所有网页的URL前面的地址是固定的,只有最后一位页码改变,要爬取的网页一共有10页,于是通过一个for循环就可得到所有网页的URL,从而获取所有网页的源代码,再调用上面获取单个网页数据的函数(get_Infor())即可获得每个网页所要获取的数据(infors),最后将所有网页的数据全部整理在一个大列表(infors_List)中。
下面是获取多个页面的所有数据并将它整理到infors_List中的代码。
if __name__ == '__main__':
infors_List = [] # 存放所有页面的信息
for i in range(0, 10): # 招聘python职位信息总共10页,所以循环10次
url = "/zhaopin/?init=-1&headckid=d87a553196696d3a&fromSearchBtn=2" \
"&sfrom=click-pc_homepage-centre_searchbox-search_new&ckid=d87a553196696d3a°radeFlag=0" \
"&key=python&siTag=I-7rQ0e90mv8a37po7dV3Q%7EfA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp" \
"&d_ckId=533b758edee25335934b2a7934818b23&d_curPage=0&d_pageSize=40&" \
"d_headId=533b758edee25335934b2a7934818b23&curPage=" + str(i)
response = (url=url, headers=headers)
# 获取页面源码,当url改变时,获取到的源码信息也会改变
infors = get_Infor(source=) # 获取当前页面爬取到的信息
infors_List.extend(infors)
# 使用extend方法将当前页面的数据存起来,因为infors获取的是一个列表,所以使用extend向infors_List中添加元素
print("正在爬取猎聘网招聘Python相关职位信息的第%s页数据..." % (i + 1))
(1)
# 让程序睡眠,防止爬取数据过快被封ip或者数据还没加载出来就爬取造成错误出现
# print(type(infors_List))
# print(infors_List[0])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
1.4将获取的数据写入Excel文件
由上文可知,我将所有网页的数据全部保存在一个大列表(infors_List)中,接下来使用openpyxl库的Workbook将数据写入excel中,此处我使用了一个函数WriteDataToExcel()。
下图展示的是将数据写入excel文件的代码。
def WriteDataToExcel(inputData,outPutfile):
wb =Workbook()
sheet =
= "猎聘网招聘python相关职位数据"
# excel第一行内容
sheet["A1"].value = "jobName"
sheet["B1"].value = "salary"
sheet["C1"].value = "education"
sheet["D1"].value = "experience"
sheet["E1"].value = "company"
sheet["F1"].value = "area"
j=2
# 写入数据
for item in inputData:
sheet["A"+str(j)].value = item['jobName']
sheet["B" + str(j)].value = item['salary']
sheet["C" + str(j)].value = item['education']
sheet["D" + str(j)].value = item['experience']
sheet["E" + str(j)].value = item['company']
sheet["F" + str(j)].value = item['area']
j=j+1
(outPutfile)
# print("数据写入完毕!")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
将获取的所有数据写入excel文件中,直接在__name__ == 'main’中调用此函数即可。
下图展示的是将所获取的所有数据写入excel文件。
2.运行结果
运行代码结果:成功获取所有数据并将其整理到excel文件里。
四、总结
通过这次爬虫实践,我对爬虫也有了更深的了解,也学到了很多知识,例如如何获得多个网页的URL、如何在单个网页中获取目标数据、如何爬取多个网页的数据以及把所有数据整理到excel文件中等等,在深入理解课本理论知识的同时,加深掌握了利用爬虫获取数据的实践操作能力。
虽然此次爬虫实践本人爬取了想要的数据并整理到excel文件中,但是由于本人的经验不足,以及对一些相关的技术、思想、理论掌握的还不够透彻,因此本次爬虫实践还存在着许多不足、许多待完善的地方。