javascript动态网页代码_爬虫最怕遇到JavaScript依赖性的动态网页

静态网站内容爬取,rvest、RCurl、XML这几个包都可以实现这个功能。比如下面的网页:
  • http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/xsjj/index.phtml?num=20&p=
很明显看到,页面有一个表格:

5a025a7d6fff0e85cd26943295edfc44.png

表格内容这些内容都是存放在该网页的html源代码里面,所以爬虫代码非常简单:
rm(list = ls())library(rvest)
url 'http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/xsjj/index.phtml?num=20&p=',1:6)
trade function(x){
  html_table(read_html(x), header =T)[[1]]
})
trade1 
对全部的6个页面,循环走一下read_html函数即可,然后使用html_table提取里面的表格,然后综合起来。我以前介绍过的peerJ期刊的爬虫也是如此。当然了,这个循环会以为某些url(如果你的url成百上千个)失效而断掉,所以你其实是需要加上一个判断机制,所以我修改后的代码是:
library(rvest)
url='http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/xsjj/index.phtml?p='
get_tables function(url){
  fittry(web TRUE)if('try-error' %in% class(fit)){
    cat('HTTP error 404\n')
  }else{return(html_table(web) [[1]])
  }
}
trade=lapply(1:6, function(i){
  get_tables(paste0(url,i))
})
trade1 
但并不是所有的网页内容都会显示在其对应的html源代码里面,比如局部动态刷新网站。
  • http://www.brics.ac.cn/plasmid/template/plasmid/plasmid_list.html
可以看到,无论我们如何点击下一页,虽然网页的内容一直在修改,但是网页的url是不会变化的,而且使用rvest包根本就读不到真实的网页内容信息。

d17b102d6e48b55bb3778cdc0e1cd9f7.png

没有内容的html源代码第一个想法是,使用rvest包模拟一个浏览器请求去访问这个网页,第二个想法是使用其它R包可以访问动态网页的,第三个想法是,使用JavaScript把网页交互后的源代码保存下来,然后去解析里面的信息。

关于局部动态刷新网站

这样的网页爬虫的确很难搞,我看到了一个教程:
  • https://blog.csdn.net/eastmount/article/details/80088948
但是它使用的是 python爬虫的selenium模块,代码步骤如下:
   1.定位驱动:driver = webdriver.Firefox()
   2.访问网址:driver.get(url)
   3.定位节点获取第一页内容并爬取:driver.find_elements_by_xpath()
   4.获取“下一页”按钮,并调用click()函数点击跳转
   5.爬取第2页的网站内容:driver.find_elements_by_xpath()
其核心步骤是获取“下一页”按钮,并调用Selenium自动点击按钮技术,从而实现跳转,之后再爬取第2页内容。但是,我没有时间去学习python了,而且python爬虫本来就是另外一个大的学习方向。本来准备是求助一个python大神,但是想了想开不了口,我好歹也是一方风云人物。唉,只好硬着头皮继续上。接下来测试使用JavaScript把网页交互后的源代码保存下来,然后去解析里面的信息。
  • https://zhuanlan.zhihu.com/p/24772389

关于phantomjs

学起来也是一个大工程:https://phantomjs.org/
  • https://phantomjs.org/quick-start.html
  • https://javascript.ruanyifeng.com/tool/phantomjs.html
  • https://mp.weixin.qq.com/s/mGwm-rAdwyr63l8mv0l_DQ
需要了解的是webpage模块是PhantomJS的核心模块,用于网页操作。所以标准代码头部如下:
var webPage = require('webpage');var page = webPage.create();
我略微思考,写出来了下面的代码,因为不会JavaScript,所以这个代码其实是有问题的。

dd337831f4f765e8e27cc48ecfc16012.png

摸索起来的代码是主要的原因其实是phantomjs打开的网页,仍然不是最终的HTML源代码,虽然是可以使用 page.content保存那个HTML源代码,但是并不能解析获取里面的“下一页”去点击它。有意思的是我看到了PhantomJS从入门到放弃,https://www.jianshu.com/p/8210a17bcdb8

最后本来是准备按照url规律都保存为html网页文件

看了看,总共是33951 个记录 plasmid,但是很明显ID过界了。不过这个并不是重点:
  • http://www.brics.ac.cn/plasmid/template/plasmid/plasmid_detail.html?id=39983
  • http://www.brics.ac.cn/plasmid/template/plasmid/plasmid_detail.html?id=39982
  • http://www.brics.ac.cn/plasmid/template/plasmid/plasmid_detail.html?id=39979
关键是 phantomjs  仍然是拿不到里面的信息:
var webPage = require('webpage');var page = webPage.create();var fs = require('fs');var path = 'test.html'
page.open('http://www.brics.ac.cn/plasmid/template/plasmid/plasmid_detail.html?id=39983', function (status) {var content = page.content;
  fs.write(path,content,'w')
  phantom.exit();
});
即使我暴力循环10000到99999的全部ID,仍然是拿不到里面真正的HTML源代码里面的信息。

回到了selenium

我的想法是,既然python爬虫的selenium模块可以做到,R里面也应该是有selenium类似的,略微搜索,居然真的有!我花了半个小时学了一下selenium的R代码实现方式,就解决了这个问题。明天分享这个解决过程,预计会出4个教程。效果如下:

38f3bc69a47efc3b2e51403c05f2099e.gif

是不是很精彩!感兴趣的可以参加我们的入门课程,虽然不会讲解这个爬虫,但是会有一系列的学习经验分享哦!
文末友情宣传
强烈建议你推荐我们生信技能树给身边的 博士后以及年轻生物学PI,帮助他们多一点数据认知,让科研更上一个台阶:
  • 生信爆款入门-全球听(买一得五)(第5期)(可能是最后一期)你的生物信息学入门课
  • (必看!)数据挖掘第3期(两天变三周,实力加量),医学生/临床医师首选技能提高课
  • 生信技能树的2019年终总结  ,你的生物信息学成长宝藏
  • 2020学习主旋律,B站74小时免费教学视频为你领路,还等什么,看啊!!!
ec316906c25a4a659f584755f10ab9ac.png 推荐 阅读

eee5016f1ff2bfc8332396e917bb30bb.png

a43fec7aa658a978d5de6b2dfe8e3a7a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值