[编者按:周末把动态网页抓取当作一个Project来做,现攻克?️差不多了,特此记之,以飨观众]
动态网页是跟静态网页相对,特指网页的内容动态生成,比如需要在浏览器中滑动鼠标、或点击方向箭头才能看到新的东西,或者网页呈现的东西都是服务器即时生成。这些动态的内容一般通过在html文件中插入Java代码实现(至于为啥是Java,听说背后有故事,然后Java要收费了)。
今天我要涉及的动态网页主要有两个,一个是百度,另一个是非常random(河北省三甲医院大全:https://m.yyk.99.com.cn/sanjia/hebei/)。百度是常见的动态网页,因为我们输入关键词搜索后得到的结果全部依赖于Java,而第二个网页要浏览完75家医院需要鼠标滑动四次,背后同样是Java的功劳。动态网页如果用静态网页抓取的方法估计什么也抓取不到(或者抓取不全),原因是动态网页结果的显示需要借助浏览器(有时需要人和鼠标的操作)。如果想用R进行动态网页内容抓取需经过浏览器操作才能看到全部内容。所以问题的关键在于如何让R命令浏览器做事,先让浏览器把Java控制的内容部分渲染出来,然后再对结果进行内容抓取。
如何让R命令浏览器呢?目前市面上通行的方法是构造一个虚拟的服务器Selenium Server,然后让R能跟Selenium对话。Selenium是一个用于网页测试的Java开源软件,可以模拟浏览器的点击、滚动、滑动以及文字输入等操作。为了让测试环境更加纯粹、干净,我们最好在docker里进行上述测试,而docker类似一个轻量级的虚拟光驱或者镜像,可以包含测试过程中需要用到的其它软件,其中关键是Selenium测试的对象,即某个浏览器(本文采用Chrome)。
在进行动态网页抓取之前,需要做很多准备工作,大体如前一段所描述那样:
0. 确保电脑支持Java (如Mac的JDK)
1. 安装Selenium Server(模拟浏览器的点击、滚动、滑动以及文字输入等)
下载地址:
https://docs.seleniumhq.org/download/
下载完安装命令(terminal里运行)
java -jar selenium-server-standalone-3.141.59.jar (注意版本号)
Vignette可以查看:
https://rpubs.com/johndharrison/RSelenium-Basics
2. 安装d