使用无限滚动的动态电子商务页面进行抓取

22

我正在使用R语言中的rvest库进行爬虫,我了解一些HTML和CSS。

我想获取一个URI中每个产品的价格:

http://www.linio.com.co/tecnologia/celulares-telefonia-gps/

随着页面向下滚动,新的商品会被加载出来。

到目前为止,我已经做了什么:

Linio_Celulares <- html("http://www.linio.com.co/celulares-telefonia-gps/")

Linio_Celulares %>%
  html_nodes(".product-itm-price-new") %>%
  html_text()

我得到了我需要的东西,但只针对前25个元素(这些是默认加载的)。

 [1] "$ 1.999.900" "$ 1.999.900" "$ 1.999.900" "$ 2.299.900" "$ 2.279.900"
 [6] "$ 2.279.900" "$ 1.159.900" "$ 1.749.900" "$ 1.879.900" "$ 189.900"  
[11] "$ 2.299.900" "$ 2.499.900" "$ 2.499.900" "$ 2.799.000" "$ 529.900"  
[16] "$ 2.699.900" "$ 2.149.900" "$ 189.900"   "$ 2.549.900" "$ 1.395.900"
[21] "$ 249.900"   "$ 41.900"    "$ 319.900"   "$ 149.900" 

问题:如何获取这个动态部分的所有元素?

我猜,我可以滚动页面直到所有元素都加载完毕,然后使用html(URL)。但这似乎是很麻烦的(因为我打算在不同的部分进行此操作)。应该有一种编程的解决方法。


您需要使用XPath(在R内部或外部)--请查看XML包。 - Hack-R
不能用Rvest完成吗?我看到Rvest可以导入XML。我也读了一些关于XML的东西。但是在我的例子中,我在URL中没有看到这些来自XML的元标记。你能帮我解决吗? - Omar Gonzales
这里,我认为这可能会帮助您在 rvest 中完成它:https://dev59.com/Uobca4cB1Zd3GeqPYqv- - Hack-R
@Hack-R。我看到了你的例子,但是我的情况有点不同。在我的例子中,没有“下一页”按钮或“第2页”。然而,我看到一个:<div id="page-number">页面4</div>(这个数字从2变成X),当我滚动时它会激活。如果你有其他的提示,那就太好了。 - Omar Gonzales
@OmarGonzales 你可能需要研究一下 RSelenium 来实现这个功能 - 参见这篇相关帖子 - nrussell
我已经查看了许多链接,但最终人们都会重定向到Selenium。在rvest或任何R软件包中激活无限滚动页面并爬取最终的滚动数据不可能吗?我们能否请求@hadley在这里提供帮助。 - Lazarus Thurston
2个回答

26

如@nrussell所建议,您可以使用RSelenium在获取源代码之前通过编程方式向下滚动页面。

例如,您可以执行以下操作:

library(RSelenium)
library(rvest)
#start RSelenium
checkForServer()
startServer()
remDr <- remoteDriver()
remDr$open()

#navigate to your page
remDr$navigate("http://www.linio.com.co/tecnologia/celulares-telefonia-gps/")

#scroll down 5 times, waiting for the page to load at each time
for(i in 1:5){      
remDr$executeScript(paste("scroll(0,",i*10000,");"))
Sys.sleep(3)    
}

#get the page html
page_source<-remDr$getPageSource()

#parse it
html(page_source[[1]]) %>% html_nodes(".product-itm-price-new") %>%
  html_text()

我一直在学习JavaScript,但是我不理解你使用的for循环。你能给我指一下相关文档吗? - Omar Gonzales
这是一个R的for循环,而不是JavaScript的。这里有一些信息:http://paleocave.sciencesortof.com/2013/03/writing-a-for-loop-in-r/ - NicE
谢谢,但我说的是<pre>scroll(0,"i10000,")</pre>。我听说"scroll"命令在Javascript中使用(比如click、hover等)。2.-为什么是'i10000'?它的意思是:每循环一次,滚动10,000个像素吗? - Omar Gonzales
我尝试使用与上面相同的代码,但它给了我“character(0)”..为什么会这样? - deepesh
这已经过时了,看起来应该使用Docker。 - Laurence_jj

-1
library(rvest)
url<-"https://www.linio.com.co/c/celulares-y-tablets?page=1"
page<-html_session(url)

html_nodes(page,css=".price-secondary") %>% html_text()

遍历网站https://www.linio.com.co/c/celulares-y-tablets?page=2以及3等页面,这样您就可以轻松地爬取数据了。

编辑于 2019 年 07 月 05 日。

由于网站元素已更改,因此需要新的代码。

library(rvest)
url<-"https://www.linio.com.co/c/celulares-y-tablets?page=1"
page<-html_session(url)

html_nodes(page,css=".price-main") %>% html_text()

Lineo更改了它的URL结构,不是像你说的那样容易抓取它们的产品。这不是在2015年发生的事情。 - Omar Gonzales
是的,他们只是更改了CSS元素。它仍然可以与此代码一起使用@OmarGonzales`library(rvest) url<-"https://www.linio.com.co/c/celulares-y-tablets?page=1" page<-html_session(url)html_nodes(page,css=".price-main") %>% html_text()` - Bharath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接