selenium手册_selenium爬虫操作网页(实战篇)

前面我们遇到了一个爬虫难题:爬虫最怕遇到JavaScript依赖性的动态网页,选择了[在R里面配置selenium爬虫环境](),仅仅是安装和配置好了在R里面使用selenium爬虫,打开一个JavaScript控制的动态网页仅仅是爬虫的开始,接下来需要跟这个网页进行各式各样的交互。首先放出 一些学习链接
  • https://ropensci.org/tutorials/rselenium_tutorial/
  • http://thatdatatho.com/2019/01/22/tutorial-web-scraping-rselenium/
  • https://www.selenium.dev/

查看源代码

如果你使用谷歌浏览器自行打开网页:http://www.brics.ac.cn/plasmid/template/plasmid/plasmid_list.html会发现它的源代码里面根本就没有各式各样的下一页等按钮,全部被隐藏在了如下所示的JavaScript脚本里面:
    <script type="text/javascript">
        document.write('<script src="../../js/common/base.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
        document.write('<script src="../../js/util/jump.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
        document.write('<script src="../../js/common/common_methods.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
        document.write('<script src="../../js/common/parts.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
        document.write('<script src="../../js/plasmid/plasmid_list.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
        document.write('<script src="../../js/plasmid/plasmid_list_mobile.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');script>
但是这些JavaScript脚本是网页开发者并不会公开的,所以我们没办法去查看它们里面的函数。但是可以使用selenium爬虫打开的网页,代码如下:
library(RSelenium)library(rvest)library(stringr)################调用R包#########################################library(rvest)        # 为了read_html函数library(RSelenium)    # 为了使用JavaScript进行网页抓取###############连接Server并打开浏览器############################
remDr "127.0.0.1" 
                      , port = 4444
                      , browserName = "chrome")#连接Server
remDr$open() #打开浏览器
remDr$navigate("http://www.brics.ac.cn/plasmid/template/plasmid/plasmid_list.html") #打开网页

查看新的源代码

这个时候查看源代码里面就有一些内容了,需要重点关注的就是“下一页”,需要对HTML有一点认知,知道 id,class,css,name的区别:
    
"pages">
"layui-box layui-laypage layui-laypage-default" id="layui-laypage-1">"javascript:;" class="layui-laypage-prev layui-disabled" data-page="0">上一页"layui-laypage-curr">"layui-laypage-em">1"javascript:;" data-page="2">2"layui-laypage-spr">…"javascript:;" class="layui-laypage-last" title="尾页" data-page="3396">3396"javascript:;" class="layui-laypage-next" data-page="2">下一页

搜寻下一页并且传递鼠标点击操作

代码非常简单,两句话就可以了:
#  下一页
# 解析上面的html源代码
webElem 'class', value =  "layui-laypage-next") 
webElem$clickElement()运行R代码的同时,你还可以看到浏览器的变化。

我的需求是拿到全部links

这个网页每次仅仅是刷新部分plasmid出来,所以需要依次循环3396次,拿到全部plasmid信息,获取其超链接url。

62481a199248e98da6ec4d9fc98e4787.gif

代码如下:
# Extracting links
links=remDr$getPageSource()[[1]] %>% 
  read_html() %>%
  html_nodes("a") %>% html_attr("href") 
links
i=1while(i<3396){
  i=i+1
  webElem 'class', value = "layui-laypage-next") 
  webElem$clickElement()
  lks=remDr$getPageSource()[[1]] %>% 
    read_html() %>%
    html_nodes("a") %>% html_attr("href") 
  print(lks)
  links=c(links,lks)
}
links=unique(links)
links
save(links,file = 'plasmid_detail_links.Rdata')
当然了,拿到的links本身,还需进行二次访问,继续摘取里面的信息。

第二次访问具体每个网页

前面的links变量里面储存了全部的plasmid的介绍页面的url

259338f8fc887e3b0fbfb5a84ffaf2ba.gif

接下来就循环访问每个plasmid网页获取信息,代码如下:
load(file = 'plasmid_detail_links.Rdata')
links
kp=grepl('plasmid_detail.html',links)
links=links[kp]
length(links)
remDr "127.0.0.1" 
                      , port = 4444
                      , browserName = "chrome")#连接Server
remDr$open() #打开浏览器for (i in 1:5000) {
  print(i) 
  url=links[i]
  remDr$navigate(url) #打开网页
  Sys.sleep(0.5)
  print(remDr$getCurrentUrl())
  htmls=remDr$getPageSource()[[1]] #     

  bodys % 
    read_html() %>%   html_nodes('.panel-body')
  c1 1]] %>%  html_text()  
  c2 2]] %>%  html_text()  
  c3 3]] %>%  html_text()  
  c1=gsub('\t','',c1);c1=gsub('\n','',c1);
  c2=gsub('\t','',c2);c2=gsub('\n','',c2);
  c3=gsub('\t','',c3);c3=gsub('\n','',c3);# id="plasmidName"
  plasmidName % 
    read_html() %>%   html_nodes('#plasmidName') %>%  html_text()  # id="plasmid_identification"
  plasmid_identification % 
    read_html() %>%   html_nodes('#plasmid_identification') %>%  html_text() 
  info=data.frame(plasmidName,plasmid_identification,c1,c2,c3)
  rm(htmls)
  write.table(info,file = 'info1.txt',
              col.names = F,row.names = F,
              append = T)
}保存为文件:

a2ad5d3d4f9de30218ae9c9bad84ac5e.gif

更复杂的使用RSelenium+rvest爬取动态或需登录页面教程

参考: https://www.jianshu.com/p/e5b252c90e0dhttps://blog.csdn.net/qq_33291559/article/details/80028119https://www.jianshu.com/p/1fc6a6817160其它爬虫基础知识: css selector手册:https://www.runoob.com/cssref/css-selectors.htmlxpath selector手册:https://www.runoob.com/xpath/xpath-tutorial.htmlxpath查找节点:https://www.cnblogs.com/txwen/p/7999485.html关于GET和POST的有趣的解释:https://zhuanlan.zhihu.com/p/22536382RCurl解析:https://blog.csdn.net/kMD8d5R/article/details/78933384html文件及http基本知识:https://www.w3school.com.cn/tags/html_ref_byfunc.asppost/get格式化工具:http://coolaf.comrvest模拟浏览行为:https://blog.csdn.net/weixu22/article/details/79237512rvest模拟点击网页:https://www.jb51.cc/html/224799.html
文末友情宣传
强烈建议你推荐我们生信技能树给身边的博士后以及年轻生物学PI,帮助他们多一点数据认知,让科研更上一个台阶: 生信爆款入门-全球听(买一得五)(第5期)(可能是最后一期)你的生物信息学入门课(必看!)数据挖掘第3期(两天变三周,实力加量),医学生/临床医师首选技能提高课生信技能树的2019年终总结  ,你的生物信息学成长宝藏2020学习主旋律,B站74小时免费教学视频为你领路,还等什么,看啊!!!90160989e31b1e5a1996ffdf86c3e52e.png推荐阅读

cb8bc0d687630adf3d54dc95707828d2.png

39c6c5cc92d625bd78b473575d8f0c1b.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值