使用 for 循环抓取网址

Web scraping urls using a for loop

我正在从一个网站上抓取表格,并且一直在抓取每个网页,但由于 url 遵循一种模式,我正在考虑 运行 url通过 for 循环。

我正在尝试使用以下脚本:

for(i in 1:38) {
  webpage <- read_html(paste0("www.website.com/", i))
  data <- webpage %>%
    html_nodes("table") %>%
    .[[1]] %>% 
    html_table()
}

我的主要问题是我正在抓取的网站不遵循我能够在上面的 for 循环中放入的模式,而是阅读如下(如果不包含 /W 它将使它成为容易得多):www.website.com/sample/test-01/W, www.website.com/sample/test-02/W, www.website.com/sample/test-03/W

我觉得好像有一种非常简单的方法可以将它们放入上面的 for 循环中,但我不确定语法。

编辑:另一个问题是 url www.website.com/sample/test-01/W 中的 0。我无法在 0 之后粘贴 i,因为模式为 06-07-08-09-10-11,而 009 之后无效。并且网站 www.website.com/sample/test-012/W 不存在。

为了在末尾附加 \W,您只需要在 webpage.

上再次使用 pate0 函数
for(i in 1:38) {
  webpage <- paste0("www.website.com/", i)
  temp <- paste0(webpage, "/W")

它将使 URL 看起来像这样:

www.website.com/1/W
www.website.com/2/W
...

要获取数字部分,您可以使用基数 R 中的 sprintf。要获取 two-digit 数字,您必须在循环中使用 sprintf("%02d", i)

代码将如下所示:

for(i in 1:38) {
  webpage <- paste0("www.website.com/", sprintf("%02d", i))
  temp <- paste0(webpage, "/W")
  print(temp)
}

注意:我已经修改了代码来证明我的观点。

输出将如下所示:

[1] "www.website.com/01/W"
[1] "www.website.com/02/W"
[1] "www.website.com/03/W"
[1] "www.website.com/04/W"
[1] "www.website.com/05/W"
[1] "www.website.com/06/W"
[1] "www.website.com/07/W"
[1] "www.website.com/08/W"
[1] "www.website.com/09/W"
[1] "www.website.com/10/W"
[1] "www.website.com/11/W"
[1] "www.website.com/12/W"
[1] "www.website.com/13/W"
[1] "www.website.com/14/W"
[1] "www.website.com/15/W"
[1] "www.website.com/16/W"
[1] "www.website.com/17/W"
[1] "www.website.com/18/W"
[1] "www.website.com/19/W"
[1] "www.website.com/20/W"
[1] "www.website.com/21/W"
[1] "www.website.com/22/W"
[1] "www.website.com/23/W"
[1] "www.website.com/24/W"
[1] "www.website.com/25/W"
[1] "www.website.com/26/W"
[1] "www.website.com/27/W"
[1] "www.website.com/28/W"
[1] "www.website.com/29/W"
[1] "www.website.com/30/W"
[1] "www.website.com/31/W"
[1] "www.website.com/32/W"
[1] "www.website.com/33/W"
[1] "www.website.com/34/W"
[1] "www.website.com/35/W"
[1] "www.website.com/36/W"
[1] "www.website.com/37/W"
[1] "www.website.com/38/W"

您可以使用 sprintf -

创建一个 url 的向量
web_urls <- sprintf('www.website.com/test-%02d/W', 1:38)

然后使用lapply从每个url中提取table。

library(rvest)

extract_table <- function(url) {
  webpage <- read_html(url)
  data <- webpage %>%
    html_nodes("table") %>%
    .[[1]] %>% 
    html_table()
}

result <- lapply(web_urls, extract_table)