使用Rcurl进行Web Scraping

时间:2014-12-02 23:58:23

标签: regex r grep rcurl

我们想知道2014年1月R-help列表中最常见的10张海报的情况,我使用了getURL从ETHZ安全网站检索数据。

  library("RCurl")
    library("XML")
     jan14 <- getURL("https://stat.ethz.ch/pipermail/r-help/2009-January/date.html",
                       ssl.verifypeer = FALSE)
 1)how can I parse jan14 file using htmltreeparse().
 2)how can I use the regular expressions to pull out the author lines and delete unwanted characters in the lines.

2 个答案:

答案 0 :(得分:4)

或者你可以通过rvest(最终使用RCurl)和CSS选择器以更易读的方式做到这一点:

library(rvest)

jan14 <- html("https://stat.ethz.ch/pipermail/r-help/2009-January/date.html")

authors <- jan14 %>% 
  html_nodes("li>i") %>% # CSS selector for <i> after <li>
  html_text() %>%        # get the text
  gsub("\\n", "", .)     # remove the newline for each author

tail(sort(table(authors)))

## authors
##  Wacek Kusnierczyk        jim holtman     Duncan Murdoch  Prof Brian Ripley 
##                 55                 80                 84                 84 
##    David Winsemius Gabor Grothendieck 
##                 93                116 

而且,我们甚至可以添加一些dplyrggplot作为衡量标准:

library(dplyr)
library(ggplot2)

dat <- data.frame(table(authors)) %>% arrange(-Freq)

gg <- ggplot(dat[1:25,], aes(x=reorder(authors, Freq), y=Freq))
gg <- gg + geom_bar(stat="identity")
gg <- gg + scale_x_discrete(expand=c(0,0))
gg <- gg + scale_y_continuous(expand=c(0,0))
gg <- gg + labs(x=NULL, y="# Posts", title="Top 25 Posters to R-help (Jan 2009)")
gg <- gg + coord_flip()
gg <- gg + theme_bw()
gg <- gg + theme(panel.grid=element_blank())
gg <- gg + theme(panel.border=element_blank())
gg

enter image description here

答案 1 :(得分:2)

检索文件。我们必须使用getURL(),因为架构是https:,否则我们可以直接使用doc <- htmlParse(url)

url <- "https://stat.ethz.ch/pipermail/r-help/2009-January/date.html"
jan14 <- getURL(url, ssl.verifypeer = FALSE)

htmlParse()解析我们刚检索到的文本。它与htmlTreeParse()相同,但更容易输入。

doc <- htmlParse(jan14, asText=TRUE)

我们不需要正则表达式来解析文本文件;这将是容易出错和困难的。相反,我们使用XPath来标识列表中斜体项的文本值;这是作者姓名出现在html中的地方。

who <- sapply(doc["//li/i/text()"], xmlValue)

who是贡献者名称的字符向量;唯一的&#39;不需要的&#39;字符是每个元素末尾的空格字符(包括新行)。匹配字符向量末尾的一个或多个空格字符的正则表达式为[[:space:]]+$;我们可以使用sub()来替换每个匹配项("")。 table()函数创建一个表,计算每个作者贡献的次数。 sort()获取此结果,并从最少到最频繁的贡献者订购这些结果。 tail()返回最后一个(默认为6个,我们指定10个)条目。

tail(sort(table(sub("[[:space:]]+$", "", who))), 10)

结果是

> tail(sort(table(sub("[[:space:]]+$", "", who))), 10)

           Greg Snow Henrique Dallazuanna       hadley wickham 
                  35                   36                   40 
       Marc Schwartz    Wacek Kusnierczyk          jim holtman 
                  48                   55                   80 
      Duncan Murdoch    Prof Brian Ripley      David Winsemius 
                  84                   84                   93 
  Gabor Grothendieck 
                 116