【问题标题】:Use a loop/automation for html web scraping使用循环/自动化进行 html 网页抓取
【发布时间】:2022-07-06 01:24:42
【问题描述】:

我正在 R 中(使用 rvest)对各种网页上的一组特定数据执行网络抓取。所有网页的格式都相同,因此我可以毫无问题地使用正确的节点从每个页面上的位置提取目标数据。但是,有 100 个不同的网页,都具有相同的 url(除了最后)。有没有办法使用循环自动执行该过程?

我正在使用以下代码:

webpage_urls <- paste0("https://exampleurl=", endings)

其中endings 是一个包含 100 个结尾的向量,这些结尾给出了单独的网页。

然后

htmltemplate <- read_html(webpage_urls)

但是,我随后收到Error: `x` must be a string of length 1

在这一步之后,我想执行以下提取:

webscraping <- htmltemplate %>%
html_nodes("td") %>%
html_text()

nth_element <- function(vector, starting_position, n) {vector[seq(starting_position, length(vector), n)]}

result <- nth_element(webscraping, 10, 5) 

当我为每个网页手动执行提取代码时,所有代码都单独工作,但是我无法为每个网页自动重复该功能。

我对循环/迭代以及如何编写代码相当不熟悉。有没有办法为每个网页运行这个提取过程,然后将每个提取过程的result 存储到一个单独的向量中,以便我可以将它们编译到一个表中?如果不是循环,是否有另一种方法可以自动化该过程,以便我可以克服需要单个字符串的错误?

【问题讨论】:

  • read_html 想要一个 URL,而不是 100 个,我认为这里的错误很明显。您是否已验证您的代码可用于单个 URL? (即read_html(webpage_urls[1])
  • 是的,该代码适用于单个 URL。我的问题是如何使其自动化,以便它可以为每个网页执行 html 读取(以及以下网络抓取提取)。你知道如何重复/自动化该功能吗?
  • allresults &lt;- lapply(webpage_urls, function(oneurl) { htmltemplate &lt;- read_html(oneurl); ...; }) 将创建一个包含所有结果的列表,每个列表元素一个 url。
  • 谢谢,这就是我想做的,但我有点困惑。您的解决方案如何与我的其余代码和功能相匹配?整体看起来如何?

标签: r loops web-scraping rvest


【解决方案1】:
nth_element <- function(vector, starting_position, n) {vector[seq(starting_position, length(vector), n)]}

allresults <- lapply(webpage_urls, function(oneurl) {
  read_html(oneurl) %>%
    html_nodes("td") %>%
    html_text() %>%
    nth_element(10, 5)
})

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2020-11-15
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多