我的目标:使用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将不起作用,因为是”,因此错误返回 错误:尝试使用零长度的变量名。
我也尝试使用粘贴功能并套用
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]]错误:脚本超出范围。
我很茫然,任何建议或技巧都太棒了。
答案 0 :(得分:2)
您可以通过rvest和tidyverse进行操作。
您可以从此页开始找到所有灯泡的列表,其中每页24个灯泡分30页:
https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79
看看初始页面底部的分页网格。我在周围画了一个(丑陋的)黄色椭圆形:
您可以通过跟踪/提取该分页网格中的链接来提取指向列出24个灯泡的每个页面的链接。
但是,仅通过比较url就可以看出,所有页面都遵循一个模式,以“ 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=", . )
现在,要提取每个灯泡页面的网址,函数和Purrt的map函数的组合将很方便。
要从索引页面中提取单个灯泡的网址,我们可以这样称呼:
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)
完成!