从网页抓取数据(关于网络爬虫最简单易用的扩展包是rvest的方法)

优采云 发布时间: 2021-12-21 21:15

  从网页抓取数据(关于网络爬虫最简单易用的扩展包是rvest的方法)

  在 R 中,最简单易用的网络爬虫扩展包是 rvest。运行以下代码以从 CRAN 安装:

  install.packages("rvest")

  首先加载包并使用read_html()读取data/single-table.html,然后尝试从网页中提取表格:

  图书馆(rvest)

  ##加载需要的包:xml2

  single_table_page single_table_page

  ## {xml_document}

  ##

  ## [1]

  ## [2] \n

  下面是一张表

  \n 注意single_table_page是一个HTML解析文档,HTML节点的嵌套数据结构。

  使用rvest函数抓取网页信息的典型流程是这样的。一、定位需要从中提取数据

  数据的 HTML 节点。然后,使用 CSS 选择器或 XPath 表达式过滤 HTML 节点以选择

  需要节点,删除不需要的节点。最后,为解析的页面使用适当的选择器,使用 html_

  nodes() 提取节点的子集,使用 html_attrs() 提取属性,使用 html_text() 提取文本。

  rvest 包还提供了一些简单的功能,可以直接从网页中提取数据并返回数据框。例如,

  为了提取网页中的所有元素,我们直接调用html_table():

  html_ _table(single_table_page)

  ## [[1]]

  ## 姓名年龄

  ## 1 珍妮 18

  ## 2 詹姆斯 19

  为了提取表格中的第一个元素,当我们使用CSS选择器表格时,调用

  html_node() 选择第一个节点,然后在选择的节点上调用 html_table() 得到一个数据框:

  html_ _table(html_ _node(single_table_page, "table"))

  ## 姓名年龄

  ## 1 珍妮 18

  ## 2 詹姆斯 19

  一个很自然的想法是使用管道操作,就像第十二章介绍的 dplyr 包中使用的 %>% 管道一样。

  道路运营商。回顾一下,%>% 执行 x %>% f(...) 的基本方法是 f(x,...),因此,嵌入

  可以反汇编设置调用以提高可读性。上面的代码可以用 %>% 重写为:

  single_table_page %>%

  html_ _node("表") %>%

  html_ _table()

  ## 姓名年龄

  ## 1 珍妮 18

  ## 2 詹姆斯 19

  现在,读取 data/products.html 并使用 html_nodes() 来匹配节点:

  products_page products_page %>%

  html_ _nodes(".product-list li .name")

  ## {xml_nodeset (3)}

  ## [1] 产品-A

  ## [2] 产品-B

  ## [3] 产品-C

  注意我们要选择的节点是product-list类的label下属于name类的section

  观点。因此,使用 .product-list li .name 来选择这样的嵌套节点。如果你不熟悉这些符号

  是的,请查看常用的 CSS 表。

  之后,使用 html_text() 从所选节点中提取内容。此函数返回一个字符向量:

  products_page %>%

  html_ _nodes(".product-list li .name") %>%

  html_ _text()

  ## [1]“产品-A”“产品-B”“产品-C”

  同样,以下代码提取产品价格:

  products_page %>%

  html_ _nodes(".product-list li .price") %>%

  html_ _text()

  ## [1] "$199.95" "$129.95" "$99.95"

  在前面的代码中, html_nodes() 返回 HTML 节点的集合,

  并且 html_text() 智能地从每个 HTML 节点中提取内部文本,然后返回一个字符向量。

  但是,这些价格保留了它们的原创格式,即字符串形式,而不是数字。下面的代码提到

  取相同的数据并将其转换为更常用的格式:

  product_items%

  html_ _nodes(".product-list li")

  产品名称 = product_items %>%

  html_ _nodes(".name") %>%

  html_ _text(),

  价格 = product_items %>%

  html_ _nodes(".price") %>%

  html_ _text() %>%

  gsub("$", "", ., 固定 = TRUE) %>%

  as.numeric(),

  stringsAsFactors = FALSE

  )

  产品

  ##名称价格

  ## 1 产品-A 199.95

  ## 2 产品-B 129.95

  ## 3 产品-C 99.95

  请注意,选择节点的中间结果可以存储在变量中以供重复使用。跟进

  html_nodes() 或 html_node() 只匹配内部节点。

  由于产品价格是数字,我们可以使用gsub()从原价中去掉$,然后转换结果

  转化为数值向量。流水线操作中的 gsub() 调用有点特殊,因为之前的结果(用 . 表示)

  它应该放在第三个参数位置,而不是第一个。

  在本例中,.product-list li .name 可以简写为.name,.product-list 也是如此

  li .price 可以替换为 .price。在实际应用中,CSS 类被广泛使用,因此,一个通用的

  的选择器可能匹配太多不需要的元素。因此,最好选择更清晰的描述和更严格的条件

  网格的选择器以匹配感兴趣的节点。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线