Web 抓取:Set_values 和爬虫的问题
Web Scraping: Issues With Set_values and crawlr
我的目标:使用 R,从 homedepot 中抓取所有灯泡型号和价格。
我的问题:我找不到所有灯泡页面的 URL。我可以抓取一个页面,但我需要找到一种获取 URL 的方法,以便我可以抓取所有内容。
理想情况下我想要这些页面
https://www.homedepot.com/p/TOGGLED-48-in-T8-16-Watt-Cool-White-Linear-LED-Tube-Light-Bulb-A416-40210/205935901
但即使获得这样的列表页也可以
https://www.homedepot.com/b/Lighting-Light-Bulbs/N-5yc1vZbmbu
我试过爬虫 -> 在 homedepot 上不起作用(可能是因为 https?)我试图获取特定页面
我尝试了 Rvest -> 我尝试使用 html_form 和 set_values 将灯泡放入搜索框中,但表格返回
[[1]]
<form> 'headerSearchForm' (GET )
<input hidden> '': 21
<input text> '':
<button > '<unnamed>
和 set_value 将不起作用,因为是 '' 所以错误回来了
错误:尝试使用零长度变量名。
我也试过使用粘贴功能 lapply
tmp <- lapply(0:696, function(page) {
url <- paste0("https://www.homedepot.com/b/Lighting-Light-Bulbs/N-
5yc1vZbmbu?Nao=", page, "4&Ns=None")
page <- read_html(url)
html_table(html_nodes(page, "table"))[[1]]
})
我收到错误:html_table(html_nodes(page,"table"))[[1]] 中的错误:脚本越界。
我真的很茫然,任何建议或提示都会非常棒。
你可以通过 rvest 和 tidyverse 来完成。
您可以找到从本页开始的所有灯泡的列表,每页分页 24 个灯泡,共 30 页:
https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79
查看初始页面底部的分页网格。我在它周围画了一个(丑陋的)黄色椭圆:
您可以通过 following/extracting 分页网格中的 link 将 link 提取到列出 24 个灯泡的每个页面。
然而,仅仅通过比较 urls 就可以明显看出所有页面都遵循一种模式,以“https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79”为根,尾部为
最后一位字符代表显示的第一个灯泡,“?Nao=24”
所以你可以简单地推断出每个 url 指向灯泡显示的结构。以下命令在 R 中创建这样一个列表:
library(rvest)
library(tidyverse)
index_list <- as.list(seq(0,(24*30), 24)) %>% paste0("https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79?Nao=", . )
现在,要为每个灯泡页面提取 url,函数和 purrt 的地图函数的组合会派上用场。
要从索引页中提取单个灯泡 url,我们可以这样调用:
scrap_bulbs <- function(url){
object <- read_html(as.character(url))
object <- html_nodes(x = object, xpath = "//a[@data-pod-type='pr']")
object <- html_attr(x = object, 'href')
Sys.sleep(10) ## Courtesy pause of 10 seconds, prevents the website from possibly blocking your IP
paste0('https://www.homedepot.com', object)
}
现在我们将结果存储在由 map() 创建的列表中。
bulbs_list <- map(.x = index_list, .f = scrap_bulbs)
unlist(bulbs_list)
完成!
我的目标:使用 R,从 homedepot 中抓取所有灯泡型号和价格。 我的问题:我找不到所有灯泡页面的 URL。我可以抓取一个页面,但我需要找到一种获取 URL 的方法,以便我可以抓取所有内容。
理想情况下我想要这些页面 https://www.homedepot.com/p/TOGGLED-48-in-T8-16-Watt-Cool-White-Linear-LED-Tube-Light-Bulb-A416-40210/205935901
但即使获得这样的列表页也可以 https://www.homedepot.com/b/Lighting-Light-Bulbs/N-5yc1vZbmbu
我试过爬虫 -> 在 homedepot 上不起作用(可能是因为 https?)我试图获取特定页面 我尝试了 Rvest -> 我尝试使用 html_form 和 set_values 将灯泡放入搜索框中,但表格返回
[[1]]
<form> 'headerSearchForm' (GET )
<input hidden> '': 21
<input text> '':
<button > '<unnamed>
和 set_value 将不起作用,因为是 '' 所以错误回来了 错误:尝试使用零长度变量名。
我也试过使用粘贴功能 lapply
tmp <- lapply(0:696, function(page) {
url <- paste0("https://www.homedepot.com/b/Lighting-Light-Bulbs/N-
5yc1vZbmbu?Nao=", page, "4&Ns=None")
page <- read_html(url)
html_table(html_nodes(page, "table"))[[1]]
})
我收到错误:html_table(html_nodes(page,"table"))[[1]] 中的错误:脚本越界。
我真的很茫然,任何建议或提示都会非常棒。
你可以通过 rvest 和 tidyverse 来完成。
您可以找到从本页开始的所有灯泡的列表,每页分页 24 个灯泡,共 30 页:
https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79
查看初始页面底部的分页网格。我在它周围画了一个(丑陋的)黄色椭圆:
您可以通过 following/extracting 分页网格中的 link 将 link 提取到列出 24 个灯泡的每个页面。
然而,仅仅通过比较 urls 就可以明显看出所有页面都遵循一种模式,以“https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79”为根,尾部为 最后一位字符代表显示的第一个灯泡,“?Nao=24”
所以你可以简单地推断出每个 url 指向灯泡显示的结构。以下命令在 R 中创建这样一个列表:
library(rvest)
library(tidyverse)
index_list <- as.list(seq(0,(24*30), 24)) %>% paste0("https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79?Nao=", . )
现在,要为每个灯泡页面提取 url,函数和 purrt 的地图函数的组合会派上用场。
要从索引页中提取单个灯泡 url,我们可以这样调用:
scrap_bulbs <- function(url){
object <- read_html(as.character(url))
object <- html_nodes(x = object, xpath = "//a[@data-pod-type='pr']")
object <- html_attr(x = object, 'href')
Sys.sleep(10) ## Courtesy pause of 10 seconds, prevents the website from possibly blocking your IP
paste0('https://www.homedepot.com', object)
}
现在我们将结果存储在由 map() 创建的列表中。
bulbs_list <- map(.x = index_list, .f = scrap_bulbs)
unlist(bulbs_list)
完成!