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)

完成!