美文网首页数据科学与R语言
R语言数据抓取的相关问题

R语言数据抓取的相关问题

作者: Abyssal_Fish | 来源:发表于2018-12-11 21:24 被阅读1次

    本文较功利,旨在快速解决问题

    参考书籍:《基于R语言的自动数据收集》

    人大经济论坛下载,中/英文

    相关的库

    XML、rvest、httr、Rselenium、rdom(神器)、 RCurl
    辅助库:tidyverse

    基本流程

    1. 首先尝试静态网页抓取(rvest)
    2. 如果搞不定,那就是javascript搞的鬼,可以用rdom解决之
    3. 先爬一个网页,找出规律,再构造通用架构。注意爬虫并不快...

    静态网页

    url <- "http://jnwater.jinan.gov.cn/col/col22802/index.html?
    Fuid=56254&pageNum=2"
    #这个网页有济南的泉水数据,最后一个参数是js生成的换页参数
    webpage <- read_html(url, encoding="utf-8")
    #读取页面内容,编码这里不一定,视实际情况决定
    data_html <- html_nodes(webpage, '.bt-neirong')
    #在众多节点中返回我们要的那个(些)
    x <- html_text(data_html)
    #让它说人话
    

    接下来我们可以用正则表达式愉快地提取内容了

    Tips

    这里介绍两个常用的技巧

    1. 用谷歌浏览器,按F12进入开发者模式阅读源码。
    2. 安装SelectorGadget,可以实现指哪打哪。(有时候也不好用)
      这里是为了找到html_nodes(webpage, '.bt-neirong')那个第二个参数。

    问题

    经过筛选,我们拿到了一页的数据。然而,问题并没有结束。事实上,我们拿到的是第一页的数据,即http://jnwater.jinan.gov.cn/col/col22802/index.html?Fuid=56254&pageNum=1的。不管我们怎么改变参数,我们的爬虫能看见的也就只有这一页。但是浏览器却能看到,这是为什么呢?
    原因在于这个参数是javascript生成的,我们直接爬多半搞不定。

    动态网页

    接上面的问题,我千辛万苦终于发现了一个库:rdom
    这个库很厉害,基本包打天下。但是有一点需要注意,这个库需要安装无头浏览器phantomjs无头浏览器。我们下载浏览器,解压后是个文件夹,在\bin里有个exe文件,就是它了。这时我们需要配置环境变量,i.e. 在path里面添加一个路径(到\bin就可以)。

    环境变量简介

    至于什么是环境变量,也就是一个程序快速启动的索引。我们不愿意在打开任何程序时都先进入它的工作路径,但是一般来说你不这样就打不开。于是我们把路径添加到环境变量里去,在执行命令时电脑会搜索当前工作环境以及系统变量指示的路径,这就可以高枕无忧了。

    rdom

    一切准备就绪后,安装rdom。只能从github上安装。

    stopifnot(Sys.which("phantomjs") != "")
    # 检测系统路径中是否含有phantomjs,若未下载,或已下载但未添加系统路径都会导致报错。什么也没发生就成功了。
    devtools::install_github("cpsievert/rdom")
    # 安装rdom
    library(rdom)
    library(XML)
    library(tidyverse)
    M <- list()
    for (j in 1:164) {
      url <- 'http://jnwater.jinan.gov.cn/col/col22802/index.html?uid=56254&pageNum='
      url <- paste(url, j, sep = '')
      x <- rdom(url) %>% readHTMLTable(header = T)
      #后面那个函数是XML里面的
      y <- x[[3]] %>% .[2:16, 1:3]
      M[[j]] <- y
    }
    
    

    程序跑的挺慢的,大约一个半小时才完成。现在列表中已经存好了泉水水位数据。
    基本上这个套路可以解决绝大多数问题了,但是这毕竟是个功利的玩法。想打好内力还是得看书,学TCP/IP这里。

    相关文章

      网友评论

        本文标题:R语言数据抓取的相关问题

        本文链接:https://www.haomeiwen.com/subject/imxyhqtx.html