作者:王亨 ,R语言中文社区专栏作者,跟着菜鸟一起一步步学习R语言,争做R语言高手。
个人公众号:跟着菜鸟一起学R语言(微信ID:learn_R)
前不久,我用rvest包爬取了政府工作报告,通过jiebaR分词,并用wordcloud2进行了词云分析。
今天,我们来用rvest包爬取猎聘网上的招聘信息。
链接为
https://www.liepin.com/zhaopin/?init=1
。打开的页面如上图,今天任务要爬取红色区域里面用绿色标记的那些信息,爬取完之后保存下来。
在开始之前,我先简单的介绍一下下面几个函数:
在写爬虫之前要对css和html有简单的了解才行,否侧就找不到节点。在这里给大家提供两个谷歌浏览器插件SelectorGadget和数据抓取分析工具,它们可以帮助我们很快分析出css。
在这种图片中,我已经框出标签了。ul.sojob_list下的div.sojob-item-main clearfix下的div.job-info,里面h3的a里面,嵌套的比较多,我那张图中没有把h3打开,你们可以使一下。这需要注意几个点:
-
标签名称中间如何有空格可以把空格后面的单词忽略不计,如何div.sojob-item-main clearfix就可以写成div.sojob-item-main。
只要网页节点没有命名重复的其实节点也不用写这么具体,大家可以对比一下提取
职位
和
工作地点
代码中节点的区别。
-
html_nodes()函数中,先写父节点,再写子节点,中间用空格隔开,或者
>
隔开。如果节点是标题时,需要用“
,
”逗号与前面隔开。可以对比下面提取
职位
和
链接
的代码。
一. 爬取网页代码
library(rvest)
url"https://www.liepin.com/zhaopin/?init=1"
#我们都知道这些数据更新频率比较快,因此为防止网页数据变化造成后面数据不一致,可以先将网页数据保存在page变量中
二.
提取职位
position%>%html_nodes('ul.sojob_list div.sojob-item-main div.job-info,h3 a')%>%html_text(trim =TRUE)
position #查看职位
position#删除第41个
爬取的职位如下:
三.提
取职位链接
我们都知道,每一个职位下面都有一个链接,打开这个链接就是这个职位的详细介绍。
link%>% html_nodes('ul.sojob_list div.job-info,h3 a')%>%html_attrs()
#也可以写成'ul.sojob_list div.sojob-item-main div.job-info,h3 a
link[1]#读取数据,规定编码
position% html_nodes("div.pages_content") %>% html_text()
link其实就是一个list,查看link第一个时可以发现链接就是link的href。因此我用下面一个循环提取出来链接。
link1<-c(1:length(link)) #初始化一个和link长度相等的link1
for(i in 1:length(link))
link1[i]<-link[[i]][1]
link1 #查看link1
link2<-link1[-41] #删除最后一行
link2#查看link2
link<-link2 #将link2重新赋值给link
如上图,就是我们提取的链接。
四.
提取薪水
salary % html_nodes('span.text-warning') %>% html_text()
salary
OK,薪资也提取出来了。
五.
提取工作地点
experience % html_nodes('p.condition span') %>% html_text()
experience
六.
提取教育背景
edu% html_nodes('span.edu') %>% html_text()
edu
七.
提取工作经验
experience % html_nodes('p.condition span') %>% html_text()
experience
结果我们不但爬取了工作经验要求,也爬到了薪水,和学历。我们来看看下面这张截图,我只截取了前4个。
如果大家仔细观察的话,可以发现一个规律,experience的前三个是第一个职位的薪水,学历要求,和工作经验要求,第4个到6个是第二个职位的薪水,学历要求,和工作经验要求。依次可以类推。因此我们可以用一个双重循环来分别提取这三个内容。
dt3,3) #定义一个数据框,报存数据,也是为了方便后面数据进行对比
colnames(dt)"sal","ed","exp") #数据框列命名 第一个是薪水,第二个是学历,第三个是经验
for(n in 1:3) #n代表第n列
{
j1 #列数自加
i
while(i<=length(experience))
{
dt[j,n]=experience[i];
j1
i 3
}
}