Web爬网:Set_values和搜寻器的问题

时间:2018-06-25 17:47:39

标签: r url web-scraping rvest

我的目标:使用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]]错误:脚本超出范围。

我很茫然,任何建议或技巧都太棒了。

1 个答案:

答案 0 :(得分:2)

您可以通过rvest和tidyverse进行操作。

您可以从此页开始找到所有灯泡的列表,其中每页24个灯泡分30页:

https://www.homedepot.com/b/Lighting-Light-Bulbs-LED-Bulbs/N-5yc1vZbm79

看看初始页面底部的分页网格。我在周围画了一个(丑陋的)黄色椭圆形:

Pagination grid with 30 pages/links

您可以通过跟踪/提取该分页网格中的链接来提取指向列出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)

完成!