作者:李誉辉
四川大学在读研究生
简介:rvest
是Hadley大神开发的包,使用非常简单,不需要懂得太多的HTML和CSS知识,
当然对于反爬虫的web,基本上就力不从心了,这种情况还是使用Python吧,毕竟术业有专攻。
首先安装 SelectorGadget
(https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb),这个插件很方便,可以获得网页中某些部分的相关tags。
如果不懂HTML和CSS,最好安装,如果懂,还是用Python吧。
常用函数:
read_html()
, 读取html文档或链接,可以是url链接,也可以是本地的html文件,
甚至是包含html的字符串。html_nodes()
, 选择提取文档中指定元素的部分。
支持css
路径选择, 或xpath
路径选择。
如果tags层数较多,必须使用selectorGadget复制准确的路径。
使用方式:开启SelectorGadget,然后鼠标选中位置,右击选择检查元素,光标移动到tags上。
然后选择copy,选择selector或xpath 选项。html_text()
,提取tags内文本,html_table()
, 提前tags内表格。html_form()
,set_values()
, 和submit_form()
分别表示提取、修改和提交表单。
1.文本提取
我们以 boss直聘
https://www.zhipin.com/?ka=header-home-logo,网站为例进行演示。 首先在搜索框内输入“数据分析”进行搜索,范围选择全国, 可以打开如下页面:
然后我们单击Selector Gadget插件按钮以开启该功能,再次点击可关闭。
单击后,鼠标指针悬浮于web上任意的tags元素,都会出现黄色的高亮框。如下图所示:
选中需要的元素后,右击,然后“检查”就能打开源代码并定位到该元素,如下图:
通过浏览器,发现左侧的岗位tags为.info-primary .name
,公司名称为.info-company .name
。
其中的句点.
表示类对象,多级类对象用空格隔开。
然后用read_html()
打开该web。
1library(rvest)
2library(magrittr)
3
4# 打开网页
5site_1 <- "https://www.zhipin.com/job_detail/?query=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&scity=100010000&industry=&position="
6web_1 <- read_html(x = site_1)
7
8tag_job <- ".info-primary .name .job-title" # 岗位名字
9tag_rev <- ".info-primary .name .red" # 薪水
10tag_com <- ".info-company .company-text .name" # 公司名字
11
12# 开始抓取
13job_1 <- html_nodes(x = web_1, css = tag_job)
14rev_1 <- html_nodes(x = web_1, css = tag_rev)
15com_1 <- html_nodes(x = web_1, css = tag_com)
16
17# 从tags中提取文本内容
18job_1 %<>% html_text()
19rev_1 %<>% html_text()
20com_1 %<>% html_text()
21
22# 合并向量为数据框
23job_com <- data.frame(job = job_1,
24 revenue = rev_1,
25 company = com_1,
26 stringsAsFactors = FALSE)
27head(job_com)
28rm(site_1, web_1, job_1, com_1)
提取web中的文本,就采用这种方法,很多时候,文本内容复制,
无法直接用html_text()
将文本提取出来,
这时候就需要用正则表达式和stringr
包。
2.多重页面
很多时候,一个web项目中,有多重页面,即下一页。
这就需要找到每一页的url规律,找到规律后,增加循环就能搞定了。
这里我们发现第2页开始,url就出现变化了,从第2页到最后一页(最后1页还没找到), 每一页都只改变url末尾的page=n。事实上,大多数网页都有这个page=n。
通过不断点击下一页,发现最后一页是第10页,