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 <- remoteDriver(remoteServerAddr = "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的区别:
<div id="pages"><div class="layui-box layui-laypage layui-laypage-default" id="layui-laypage-1">
 <a href="javascript:;" class="layui-laypage-prev layui-disabled" data-page="0">上一页</a>
 <span class="layui-laypage-curr"><em class="layui-laypage-em"></em><em>1</em></span>
 <a href="javascript:;" data-page="2">2</a><span class="layui-laypage-spr">…</span>
 <a href="javascript:;" class="layui-laypage-last" title="尾页" data-page="3396">3396</a>
 <a href="javascript:;" class="layui-laypage-next" data-page="2">下一页</a></div></div>
搜寻下一页并且传递鼠标点击操作
代码非常简单,两句话就可以了:
#  <a href="javascript:;" class="layui-laypage-next" data-page="2">下一页</a></div></div>
# 解析上面的html源代码
webElem <- remDr$findElement(using = 'class', value = "layui-laypage-next") 
webElem$clickElement()
运行R代码的同时,你还可以看到浏览器的变化。
我的需求是拿到全部links
这个网页每次仅仅是刷新部分plasmid出来,所以需要依次循环3396次,拿到全部plasmid信息,获取其超链接url。
代码如下:
# Extracting links
links=remDr$getPageSource()[[1]] %>% 
  read_html() %>%
  html_nodes("a") %>% html_attr("href") 
links
i=1
while(i<3396){
  i=i+1
  webElem <- remDr$findElement(using = '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
接下来就循环访问每个plasmid网页获取信息,代码如下:
load(file = 'plasmid_detail_links.Rdata')
links
kp=grepl('plasmid_detail.html',links)
links=links[kp]
length(links)
remDr <- remoteDriver(remoteServerAddr = "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]] 
  #  <div class="panel-body">
  bodys <- htmls %>% 
 read_html() %>%   html_nodes('.panel-body')
  c1 <- bodys[[1]] %>%  html_text()  
  c2 <- bodys[[2]] %>%  html_text()  
  c3 <- bodys[[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 <- htmls %>% 
 read_html() %>%   html_nodes('#plasmidName') %>%  html_text()  
  # id="plasmid_identification"
  plasmid_identification <- htmls %>% 
 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)
}

保存为文件:
更复杂的使用RSelenium+rvest爬取动态或需登录页面教程
参考:
  • https://www.jianshu.com/p/e5b252c90e0d
  • https://blog.csdn.net/qq_33291559/article/details/80028119
  • https://www.jianshu.com/p/1fc6a6817160
其它爬虫基础知识:
  • css selector手册:https://www.runoob.com/cssref/css-selectors.html
  • xpath selector手册:https://www.runoob.com/xpath/xpath-tutorial.html
  • xpath查找节点:https://www.cnblogs.com/txwen/p/7999485.html
  • 关于GET和POST的有趣的解释:https://zhuanlan.zhihu.com/p/22536382
  • RCurl解析:https://blog.csdn.net/kMD8d5R/article/details/78933384
  • html文件及http基本知识:https://www.w3school.com.cn/tags/html_ref_byfunc.asp
  • post/get格式化工具:http://coolaf.com
  • rvest模拟浏览行为:https://blog.csdn.net/weixu22/article/details/79237512
  • rvest模拟点击网页:https://www.jb51.cc/html/224799.html

文末友情宣传

强烈建议你推荐我们生信技能树给身边的博士后以及年轻生物学PI,帮助他们多一点数据认知,让科研更上一个台阶:
推荐阅读

(0)

相关推荐

  • python自动化测试需要知识

    一.概念: 设计程序自动执行测试用例,从而减少人工消耗在功能测试上的大量时间,提高测试效率的一种测试方法.从自动化测试的概念便可以看出学习自动化测试的重点:设计程序,也就是编写代码. 二.前提准备:掌 ...

  • 入门爬虫?一文搞定!

    为了感谢大家对"Python客栈"的关注与支持,我们每天会在留言中随机抽取三位粉丝发放6.6元小红包.快来参与吧! 文章分三个个部分 两个爬虫库requests和selenium如 ...

  • 从零开始学理财|实战篇:如何操作一只基金的买卖?

    「怎么做」: 1.怎么选择投资标的: 2.怎么买入一只基金: 3.怎么选择卖出时机. 今天,浮云君就会按照这个顺序给大家进行分享. 打开凤凰新闻,查看更多高清图片 也有一些小伙伴经过一段时间毫无章法的 ...

  • 爬虫必备网页解析库——BeautifulSoup详解汇总(含Python代码举例讲解 爬虫实战)

    大家好,我是辰哥 本文带大家学习网页解析库BeautifulSoup, 并通过python代码举例讲解常用的BeautifulSoup用法 最后实战爬取小说网页:重点在于爬取的网页通过Beautifu ...

  • 四物汤实战篇!(加减脏腑病妇科病)

    一.四物汤加减脏腑病 1 血虚腹痛.微汗恶风.加官桂(七分).倍芍药. 2 嗽痰.加桑白皮.杏仁.麻黄.贝母( 各等分). 3 大便秘.加桃仁.大黄.麻仁.枳壳(减半余各等分). 4 血虚头眩.加天麻 ...

  • 分时图看盘技巧——实战篇1

    分时图看盘技巧——实战篇1

  • 秘传八字推命的十大法则(高级实战篇)

    八字推命的十大法则 八字命理的起源,和八字的起源不同.甲子历法中对年月日时计时,年.月.日.时均有干支两个字组成,简称八字.这种甲子历法在中国据考从伏羲氏就开始有创建,从中国古代的夏朝就已经开始使用. ...

  • 成立业主委员会攻略——实战篇

    很多人都纳闷,一个美食公众号,为啥会去做业主委员会这个版块?其实也很简单,宛南美食密探这个公众号注册认证的就是三个版块儿,美食.业委会.汉服. 起初,主编杨表哥也是南阳市一个大型小区的业委会主任,三年 ...

  • 实战篇:活血化瘀18法!

    姜春华先生从丰富的临床实践中,拟定了活血化瘀十八法,即活血清热法.活血解毒法.活血益气法.活血补血法.活血养阴法.活血助阳法.活血理气法.活血攻下法.活血凉血法.活血止血法.活血开窍法.活血利水法.活 ...

  • 杨清娟盲派八字命理实战篇 盲派说法

    八字五行在中华民族传统文化之中其实一直有着重要的席位,因为每一个人都有自己的生辰八字和五行命理,并且在人们的生活之中.通过对八字和五行的分析,人们可以进一步了解自己在未来的发展过程之中,究竟会有什么样 ...

  • 出现这四种k线形态 就是买入良机(实战篇)

    █阶梯式买入法 这种K线组合是指在股价的上行趋势中出现中继缩量调整区,在这段时间内(一般为5天左右),K线没有大的变化,以小K线或十字线阴阳相伴运行,我们可以选择在整理区间内买入待涨. 图(1) 由图 ...