动态网页抓取(用RSelenium打造灵活强大的网络爬虫(youtobe+XML) )
优采云 发布时间: 2021-12-06 00:15动态网页抓取(用RSelenium打造灵活强大的网络爬虫(youtobe+XML)
)
关于基础网络数据抓取相关内容,这个公众号已经分享了很多次,尤其是R语言的爬虫框架(RCurl+XML/httr+rvest[xml2+selectr])形成了比较丰富的教程体系。
但所有这些都是基于静态页面的(抓包和API访问除外)。很多动态网页不提供API访问,所以我们只能希望selenium是基于浏览器驱动的技术。
好在R语言已经有一个selenium接口包-RSelenium包,让我们爬取动态网页成为可能。今年年初写了一个实习和尚网站的爬虫,使用另一个基于R语言的selenium驱动的接口包-Rwebdriver完成。
实习僧招聘网络的爬虫数据可视化
当时技术还不成熟,思想还很幼稚。我使用导航器突然遍历了 500 页的内容。虽然最后爬取了所有的数据,但是耗时很长(将近40分钟),效率也比较低。(有兴趣的朋友可以参考上面的文章,不过实习生官网最近改版很大,现在爬起来肯定比以前难了!那个代码可能不能用了)
最近抽空学习了一下RSelenium包的相关内容。感谢陈彦平先生在R语言上海会议上以“用RSelenium构建灵活强大的网络爬虫”的演讲。虽然不在现场,但有幸看到了视频版。, 一些细节解决了我最近的一些困惑,在此谢谢大家。
陈彦平老师:《用RSelenium打造灵活强大的网络爬虫》 老外关于RSelenium的介绍视频(对于你来说,请访问国外网站):
目前R语言有几个可以解析动态网页的包(欢迎补充):
本节以下内容正式分享今天的案例,目标是拉勾网(不要问为什么,因为我之前没有爬过拉勾)!
在介绍案例之前,请确保系统具备以下条件:
本地有selenium服务器并添加系统路径;本地有一个plantomjs浏览器,并添加了系统路径;安装了 RSelenium 包。
因为涉及到自动化点击操作,Chrome浏览器整个下午都在点击链接里硬生生的崩溃了,找到原因了,因为dragnet页面很长,而且下一页按钮不在默认窗口范围内,而且js脚本用于控制滑块。失败,原因不明。见过有人用firefox浏览器测试成功。我还没试过。这里我切换到plantomjs无头浏览器(无需考虑元素是否被窗口遮挡。)
R语言版本:
#!!!这两句是在cmd后者PowerShell中运行的!
#RSelenium服务未关闭之前,请务必保持该窗口状态!
###启动selenium服务:
cd D:\
java -jar selenium-server-standalone-3.3.1.jar
##selenium服务器也可以直接在R语言中启动(无弹出窗口)
system("java -jar \"D:/selenium-server-standalone-2.53.1.jar\"",wait = FALSE,invisible = FALSE)
#加载包
library("RSelenium")
library("magrittr")
library("xml2")
启动服务
#给plantomjs浏览器伪装UserAgent
eCap % xml_text(trim=TRUE)
#职位所述行业
position.industry % read_html() %>% xml_find_all('//div[@class="industry"]') %>% xml_text(trim=TRUE) %>% gsub("[[:space:]\\u00a0]+|\\n", "",.)
#职位福利
position.bonus % read_html() %>% xml_find_all('//div[@class="list_item_bot"]/div[@class="li_b_l"]') %>% xml_text(trim=TRUE) %>% gsub("[[:space:]\\u00a0]+|\\n", "/",.)
#职位工作环境
position.environment% read_html() %>% xml_find_all('//div[@class="li_b_r"]') %>% xml_text(trim=TRUE)
#收集数据
mydata% xml_find_all('//div[@class="page-number"]/span[1]') %>% xml_text() !="30"){
#如果页面未到尾部,则点击下一页
remDr$findElement('xpath','//div[@class="pager_container"]/a[last()]')$clickElement()
#但因当前任务进度
cat(sprintf("第【%d】页抓取成功",i),sep = "\n")
} else {
#如果页面到尾部则跳出while循环
break
}
}
#跳出循环后关闭remDr服务窗口
remDr$close()
#但因全局任务状态(也即任务结束)
cat("all work is done!!!",sep = "\n")
#返回最终数据
return(myresult)
}
运行抓取功能
<p>url