抓取动态网页(实习僧招聘网爬虫打造灵活强大的网络爬虫(组图))

优采云 发布时间: 2021-09-13 01:17

  抓取动态网页(实习僧招聘网爬虫打造灵活强大的网络爬虫(组图))

  关于基础网络数据抓取相关内容,本公众号已经多次分享,特别是R语言的爬虫框架(RCurl+XML/httr+rvest[xml2+selectr])形成了比较丰富的教程体系。

  但所有这些都是基于静态页面的(抓包和API访问除外)。很多动态网页不提供API访问,只能希望selenium是基于浏览器驱动的技术。

  好在R语言已经有selenium接口包-RSelenium包,让我们爬取动态网页成为可能。今年年初写了一个实习生网站的爬虫,使用另一个R语言的基于selenium驱动的接口包-Rwebdriver完成。

  实习僧招聘网络爬虫数据可视化

  当时技术还不成熟,想法也比较幼稚。我使用导航器突然遍历了 500 页内容。虽然最后爬取了所有的数据,但是耗时很长(将近40分钟),效率也比较低。 . (有兴趣的朋友可以参考上面的文章,不过实习和尚官网最近改版很大,现在爬肯定比刚开始难!那个代码可能不能用)

  最近抽空学习了一下RSelenium包的相关内容。感谢陈彦平先生在R语言上海会议上的“用RSelenium构建灵活强大的网络爬虫”的演讲。虽然不在现场,但我有幸观看了。视频版之后,一些细节解决了我最近的一些困惑,谢谢大家。

  *敏*感*词*陈彦平:《用RSelenium打造灵活强大的网络爬虫》/course/88 老外关于RSelenium的介绍视频(youtube,请自行翻墙):/watch?v=ic65SWRWrKA&feature=youtu.be

  目前有几个包可以解析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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线