无限滚动抓取动态电子商务页面

Posted

技术标签:

【中文标题】无限滚动抓取动态电子商务页面【英文标题】:Scraping a dynamic ecommerce page with infinite scroll 【发布时间】:2015-07-03 20:41:45 【问题描述】:

我在 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 中或 R 之外)——查看 XML 包。 Rvest不能做吗?我已经看到 Rvest 导入 XML。我读过一些关于 XML 的东西。但我是示例中的 URL,我没有从 XML 中看到这个元标记。你能帮帮我吗? 在这里,我想这可能会帮助你在rvest:***.com/questions/27812259/… @Hack-R。我看过你的例子,但我所拥有的有点不同。在我的示例中,没有“下一步”按钮或“第 2 页”。但是,我看到一个 :"Página 4"(从 2 变为 X)在我滚动时激活。如果您有任何其他提示会很好。 @OmarGonzales 您可能需要查看 RSelenium 才能实现这一点 - 请参阅 this related post。 【参考方案1】:

正如@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 循环。请给我一份关于这方面的文件吗? 这是一个 R for 循环而不是 javascript 循环,一些信息 here 谢谢,但我说的是
scroll(0,"i*10000,")
我听说 Javascript 中使用了“scroll”命令(比如这个:单击、悬停等)。 2.- 为什么是'i*10000'?是不是:对于每个循环,滚动 10,000 像素?
我尝试执行与上面相同的代码,但它给了我“character(0)”.. 为什么会这样?? 这已经过时了,它似乎使用 Docker 代替【参考方案2】:
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 年 7 月 5 日编辑

网站元素发生了变化。因此新代码

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 年。 是的,他们单独更改了 css 元素。它仍然适用于此代码@OmarGonzales library(rvest) url&lt;-"https://www.linio.com.co/c/celulares-y-tablets?page=1" page&lt;-html_session(url) html_nodes(page,css=".price-main") %&gt;% html_text()

以上是关于无限滚动抓取动态电子商务页面的主要内容,如果未能解决你的问题,请参考以下文章

Java HTML 解析具有无限滚动的页面

使用 Python/PhantomJS/Selenium 滚动无限页面

无限滚动抓取网站

使用 python 抓取具有无限滚动的站点

在 Python 中使用 PhantomJS 向下滚动到无限页面的底部

Vue组件滚动加载懒加载功能的实现,无限滚动加载组件实例演示