查看原文
其他

R 爬虫之爬取 CRAN 官网 R 包信息

JunJunLab 老俊俊的生信笔记 2022-08-15

点击上方关注我们





有一些公众号会时不时分享介绍一些按月份出炉的新 R 包,虽然有各个领域不同功能的,拓展我们的眼界也是挺好的。我也会时不时去 CRAN 官网里去看看最新的 R 包,看看有没有什么好玩的。

今天去爬取一下官网的所有 R 包的信息。

首先我们去官网找到 package,按照发表时间排序,先百度搜索:

网址:https://cran.r-project.org/web/packages/index.html

然后按发表时间排序进入页面,总共收集了 17957 个 R 包:

页面展示的是一个类似于表格的形式:

我们右键检查元素,定位到整个表格:

html_table 函数



介绍一下我们的 html_table 函数,可以提取网页里的表格内容,然后输出也是一个表格形式!

我们看看 html 结构的 table 元素组成部分:

html <- minimal_html("
  <table>
    <tr>
      <th>x</th>
      <th>y</th>
    </tr>
    <tr>
      <td>1.5</td>
      <td>2.7</td>
    </tr>
    <tr>
      <td>4.9</td>
      <td>1.3</td>
    </tr>
    <tr>
      <td>7.2</td>
      <td>8.1</td>
    </tr>
  </table>
  "
)

html 格式的 table 主要由 4 个部分组成:<table><tr> (table 行),<th> (table 标题行),和 <td> (table 数据)。

用上面测试提取:

html %>%
  html_node("table") %>%
  html_table()
#> # A tibble: 3 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1   1.5   2.7
#> 2   4.9   1.3
#> 3   7.2   8.1

实战



然后我们可以对官网的表格进行提取了,网页已经显示了 所有的 R 包 ,并不需要翻页:

提取:

# 地址
url <- 'https://cran.r-project.org/web/packages/available_packages_by_date.html'

# 提取表格
r_package <- url %>% read_html() %>% html_table() %>% as.data.frame()

# 查看结果
nrow(r_package)
[117959
# 查看内容
head(r_package,3)
        Date   Package                                       Title
1 2021-08-03   amanida         Meta-Analysis for Non-Integral Data
2 2021-08-03 chameleon Automatic Colors for Multi-Dimensional Data
3 2021-08-03    cleanr                   Helps You to Code Cleaner

还可以提取每个 R 包的链接地址,需要 替换一下前缀

# 查看内容
head(r_package,3)

r_package_link <- url %>%
  read_html() %>%
  html_nodes('a') %>%
  html_attr('href')
# 查看数量
length(r_package_link)
[117959

# 查看网址内容
head(r_package_link,3)
[1"../../web/packages/amanida/index.html"   "../../web/packages/chameleon/index.html"
[3"../../web/packages/cleanr/index.html"

# 替换
package_link <- gsub('../../','https://cran.r-project.org/',r_package_link)

# 查看替换后的内容
head(package_link,3)
[1"https://cran.r-project.org/web/packages/amanida/index.html"
[2"https://cran.r-project.org/web/packages/chameleon/index.html"
[3"https://cran.r-project.org/web/packages/cleanr/index.html"

点进每个 R 包里,都会有一段对R 包的简要描述,我们也可以爬取一下:

先拿第一个包试一下:

# 循环每个R包网页
summa <- c()

for (i in 1:length(package_link[1])) {
  descrb <- package_link[i] %>%
    read_html() %>%
    html_nodes('p') %>%
    html_text()
  # 储存
  summa <- c(summa,descrb)
}

# 查看数量
length(summa)
[12

# 查看内容
head(summa,3)
[1"Combination of results for meta-analysis using significance and effect size only. P-values and fold-change are combined to obtain a global significance on each metabolite. Produces a volcano plot summarising the relevant results from meta-analysis. Vote-counting reports for metabolites. And explore plot to detect discrepancies between studies at a first glance. "
[2"Please use the canonical form\nhttps://CRAN.R-project.org/package=amanida\nto link to this page."

发现返回了两段文字,检查以后发现把最下面的也提取出来了:

我们只需要取第一段文字就行了,再来一次,所有内容批量

# 循环每个R包网页
summa <- c()

for (i in 1:length(package_link[1:200])) {
  descrb <- package_link[i] %>%
    read_html() %>%
    html_nodes('p') %>%
    html_text()
  descrb <- descrb[1]
  # 储存
  summa <- c(summa,descrb)
}

Error in open.connection(x, "rb") : HTTP error 404.

哈哈,什么鬼,网页 404 了,我换成 5 个网页试试是可以的:

# 循环每个R包网页
summa <- c()

for (i in 1:length(package_link[1:5])) {
  descrb <- package_link[i] %>%
    read_html() %>%
    html_nodes('p') %>%
    html_text()
  descrb <- descrb[1]
  # 储存
  summa <- c(summa,descrb)
}

# 查看数量
length(summa)
[15

# 查看内容
head(summa,3)
[1"Combination of results for meta-analysis using significance and effect size only. P-values and fold-change are combined to obtain a global significance on each metabolite. Produces a volcano plot summarising the relevant results from meta-analysis. Vote-counting reports for metabolites. And explore plot to detect discrepancies between studies at a first glance. "
[2"Assign distinct colors to arbitrary multi-dimensional data, considering its structure."
[3"Check your R code for some of the most common\n    layout flaws.  Many tried to teach us how to write code less dreadful,\n    be it implicitly as B. W. Kernighan and D. M. Ritchie (1988)\n    <ISBN:0-13-110362-8> in 'The C Programming Language' did, be it\n    explicitly as R.C. Martin (2008) <ISBN:0-13-235088-2> in 'Clean Code:\n    A Handbook of Agile Software Craftsmanship' did.  So we should check\n    our code for files too long or wide, functions with too many lines,\n    too wide lines, too many arguments or too many levels of nesting.\n    Note: This is not a static code analyzer like pylint or the like.\n    Checkout <https://cran.r-project.org/package=lintr> instead."

很可能服务器把 rvest 这种请求当成爬虫了,直接拒绝访问了哈!

最后我们把网址拼一下:

# 新增link列
r_package$link <- package_link
# 查看
head(r_package)
        Date      Package                                                        Title
1 2021-08-03      amanida                          Meta-Analysis for Non-Integral Data
2 2021-08-03    chameleon                  Automatic Colors for Multi-Dimensional Data
3 2021-08-03       cleanr                                    Helps You to Code Cleaner
4 2021-08-03    contentid                   An Interface for Content-Based Identifiers
5 2021-08-03 crctStepdown Univariate Analysis of Cluster Trials with Multiple Outcomes
6 2021-08-03           do                                                Data Operator
                                                                        link
1                 https://cran.r-project.org/web/packages/amanida/index.html
2               https://cran.r-project.org/web/packages/chameleon/index.html
3                  https://cran.r-project.org/web/packages/cleanr/index.html
4               https://cran.r-project.org/web/packages/contentid/index.html
5            https://cran.r-project.org/web/packages/crctStepdown/index.html
6 https://cran.r-project.org/web/packaghttps://cran.r-project.org/index.html


所以今天你学习了吗?

发现更多精彩

关注公众号

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!

推 荐 阅 读




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存