使用无限滚动抓取动态电子商务页面
Scraping a dynamic ecommerce page with infinite scroll
我在 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)。但这似乎需要大量工作(我计划在不同的部分执行此操作)。应该有一个程序化的解决方法。
正如@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()
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等等,这样你就可以轻松抓取数据
编辑日期为 07/05/2019
网站元素已更改。因此新代码
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()
我在 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)。但这似乎需要大量工作(我计划在不同的部分执行此操作)。应该有一个程序化的解决方法。
正如@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()
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等等,这样你就可以轻松抓取数据
编辑日期为 07/05/2019
网站元素已更改。因此新代码
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()