这里主要是因为有些网站是非静态的,比如下面的内容就是通过动态翻页实现的(简单理解的话,就是不同的页面均显示为一个地址):

03. R 获取动态网站 - 图1

1. 下载及安装

首先是chromedriver 与selenium server 的配置:

参见:https://blog.csdn.net/weixin_40628687/article/details/78971934

  1. java -Dwebdriver.chrome.driver="/Users/appe/Desktop/B.计算机学习笔记/R练习/爬虫/selenium_file/chromedriver" -jar /Users/appe/Desktop/B.计算机学习笔记/R练习/爬虫/selenium_file/selenium-server-standalone-3.141.59.jar

首先是两个包:

  1. install_github("crubba/Rwebdriver")
  2. install.packages("RSelenium")

ps: 这里真的非常的玄学。

我之前用mac 一直装不上,这次直接换win 尝试,发现又出现了之前的问题:

03. R 获取动态网站 - 图2

很显然是电脑找不到我的chromedriver了。(然而我该添加环境变量都添加了啊~~~)

而mac 这边,则是一下就成功了。

03. R 获取动态网站 - 图3

ps:今天刚开始也用不了,然后挂上梯子又突然可以了。😢

贴一下代码:

  1. # 0. packages loaded && data preparation ----
  2. my_packages<- c("maftools", "data.table", "RColorBrewer",
  3. "paletteer", "devtools", "Rwebdriver",
  4. "RSelenium")
  5. tmp <- sapply(my_packages, function(x) library(x, character.only = T)); rm(tmp)
  6. # install_github("crubba/Rwebdriver")
  7. # 1. test and startup Rselenium ----
  8. remDr <- remoteDriver(remoteServerAddr = "localhost"
  9. , port = 4444
  10. , browserName = "chrome")
  11. remDr$open() #打开浏览器
  12. remDr$navigate("http://herb.ac.cn/Browse/")

2. 几个功能的实现

我们需要将这个代码想像成真实人类的操作逻辑。

我们上网获取数据一般有哪些操作呢?简单来说包括:

  • 翻页
  • 点击子页面
  • 获取页面中的内容

但其实归结起来,我们的动作无非就是两种:

  • 点击
  • 选中指定数据复制
  • 粘贴

点击

其实也就是获取按钮的地址,这里通过XPATH 获取。

首先调取检查:

03. R 获取动态网站 - 图4

接着直接复制XPATH 地址:
03. R 获取动态网站 - 图5

将其按钮对象通过findElement 函数获取,并通过clickElement 点击:

  1. xpath <- '//*[@id="root"]/section/main/div/div[1]/div[2]/div/div/ul/li[10]/a'
  2. nextBtn <- remDr$findElement(using ='xpath',
  3. value = xpath)
  4. nextBtn$clickElement()

03. R 获取动态网站 - 图6

实现了这一步,其实翻页也就实现了。(循环该步骤即可)

那么该如何实现循环点击每个子页面呢?

03. R 获取动态网站 - 图7

循环访问每个子页面

其实也非常简单,我们看看每个子链接的Xpath 有没有什么规律:

  1. //*[@id="root"]/section/main/div/div[1]/div[2]/div/div/div/div/div/table/tbody/tr[1]/td[1]/span/a
  2. //*[@id="root"]/section/main/div/div[1]/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[1]/span/a
  3. //*[@id="root"]/section/main/div/div[1]/div[2]/div/div/div/div/div/table/tbody/tr[14]/td[1]/span/a

结果显而易见,仅仅是tr** 更换了数字,且每个页面都是相同的。

我们直接paste 整列数据即可。

演示如下:

03. R 获取动态网站 - 图8

获取网页中的指定文本

3. 开始抓取-以herb 数据库herb-ingrediant 信息为例

这里发现herbs 数据库不完全需要动态爬取,每个子页面就包含了全部的信息。而子页面的地址也非常的有规律:

  1. http://herb.ac.cn/Detail/?v=HERB000001&label=Herb
  2. http://herb.ac.cn/Detail/?v=HERB000002&label=Herb
  3. http://herb.ac.cn/Detail/?v=HERB000003&label=Herb
  4. ...
  5. http://herb.ac.cn/Detail/?v=HERB007263&label=Herb

但进入到具体的子界面,还是需要实现一个翻页获取的动作:

03. R 获取动态网站 - 图9

但也仅此而已。