【问题标题】:rvest limits the results to 24 itemsrvest 将结果限制为 24 项
【发布时间】:2018-07-08 14:35:17
【问题描述】:

大家晚上好,

我目前正在尝试抓取 zalando 网站以获取出现在以下网址前两页上的每个产品的名称:(https://www.zalando.nl/damesschoenen-sneakers/)

这是我的代码:

require(rvest)
require(dplyr)

url <- read_html('https://www.zalando.nl/damesschoenen-sneakers/')
selector_name <- '.z-nvg-cognac_brandName-2XZRz'
output <- html_nodes(x = url, css = selector_name) %>% html_text

结果是一个包含 24 个项目的列表,而页面上有 86 个产品。有没有人遇到过这个问题?关于如何解决它的任何想法? 感谢您的帮助。

托马斯

【问题讨论】:

  • 看起来页面在您转到时加载了 24 个项目,并且在您滚动时加载更多。
  • 首先,通过不同的用户代理访问网页通常会产生不同的布局。其次,正如 Gregor 所说,它看起来很像这是一个基于 java 的布局,它不会通过 rvest 轻松加载。通过将 url 对象写入浏览器并将其加载到浏览器中来检查你得到了什么。 IE。 write_html(url, file = "test_url.html")
  • @Gregor 谢谢你的评论。关于如何绕过这个问题的任何想法?
  • @NicolásVelásquez,我刚刚回复了您的评论。

标签: r rvest


【解决方案1】:

我刚刚尝试了 Nicolas Velasqueaz 的建议

url <- read_html('https://www.zalando.nl/damesschoenen-sneakers/')
write_html(url, file = "test_url.html")
selector_name <- '.z-nvg-cognac_brandName-2XZRz'
test_file <- read_html("test_url.html")
output <- html_nodes(x = test_file, css = selector_name) %>% html_text

结果是一样的。我仍然只有 24 个项目出现。 因此,如果有人有解决方案,将不胜感激。

【讨论】:

  • 也许我自己并不清楚。我的建议是让您在浏览器上检查输出的 html(“test_url.html”)中存在的鞋子数量。如果这个数字只有 24,那么这意味着你需要的不仅仅是简单的 rvest 来进行你正在研究的网络垃圾。查看此线程以获得更多见解:stackoverflow.com/questions/29861117/…
  • @NicolásVelásquez,我还检查了 html 文件中的项目数,它们都出现了。我还使用浏览器的“检查”功能检查页面,所有产品都嵌入在同一个 css 下,所以我真的不知道是什么问题。我认为这可能是 read_html 没有让网页完全加载的事实。如果是这种情况,我该如何控制加载时间?
  • 查看“test_url.html”的代码,我在 css = '.z-nvg-cognac_brandName-2XZRz' 定义的第 24 个节点之后发现了一个 java 脚本。查看第 284 行(
    Superga
    )和第 691 行(
  • 要执行这些 JavaScript,您需要学习如何通过 Selenium 或 WebDriver 导航,或者在保存之前加载整个页面(即 iMacros 或无头 Chrome)。同样,我敢打赌,这个 SO 是您开始的好地方:stackoverflow.com/questions/29861117/…
【解决方案2】:

感谢您的友好回答。我会朝那个方向深入。 我还找到了一种无需 RSelenium 即可获得品牌名称的方法,这是我的代码:

library('httr')
library('magrittr')
library('rvest')

################# FUNCTION #################
extract_data <- function(firstPosition,lastPosition){
  mapply(function(first,last){
    substr(pageContent, first, last) %>% 
    gsub( "\\W", "\\1 ",.)  %>%
    gsub("^ *|(?<= ) | *$", "", ., perl = TRUE)
  },
  firstPosition, lastPosition )
}
############################################

url <- 'https://www.zalando.nl/damesschoenen-sneakers/'
page <- GET(url)
pageContent <- content(page, as='text')

# Get the brand name of the products
firstPosition <-   
unlist(gregexpr('brand_name',pageContent))+nchar('brand_name')+1
lastPosition <- unlist(gregexpr('is_premium',pageContent))-2

extract_data(firstPosition, lastPosition)

不幸的是,当您想要品牌名称以外的其他东西时,它开始变得困难,所以最好的解决方案是使用 RSelenium。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多