使用 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,而 0
在 09
之后无效。并且网站 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)
我正在从一个网站上抓取表格,并且一直在抓取每个网页,但由于 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,而 0
在 09
之后无效。并且网站 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
-
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)