【发布时间】:2020-09-19 22:34:37
【问题描述】:
我正在尝试从德国乐天网站上抓取数据。乐天公司是一家总部位于日本的全球知名企业,通过互联网销售各种商品。问题是他们为不同的国家采用不同的市场策略。例如,在美国,在支付所谓的订阅费之前无法获得产品。在德国则不同,人们可以立即获得产品和价格。因此,乐天的链接似乎带有地理标记,即如果从另一个目的地登录,则无法看到内容。此序言对于尝试按照我的步骤操作并遇到连接错误的每个人都很重要。
好的,也就是说,我想读取数据并将其保存到数据框中。
这是我的初始代码:
library(rvest)
library(purrr)
library(dplyr)
rakuten <- "https://www.rakuten.de/suchen/kitchenAid?category=0"
ra_html <- read_html(rakuten)
title <- html_nodes(ra_html, ".vw-productCard .name")
price <- html_nodes(ra_html, ".vw-productCard .price .actual")
discount <- html_nodes(ra_html, ".vw-productCard .thumb .discount .text")
如您所见,我想抓取产品描述(标题对象)、价格(价格对象)和折扣可用性(折扣对象)(如果有)。他们出售的每种产品总是有描述和价格(我正在查看 KitchenAid 价格),但折扣很少发生。
然后我解析数据:
urlrakuten <- sprintf("https://www.rakuten.de/suchen/kitchenAid?category=0", 1:10)
#define empty data frame to store all data
alllistings <- data.frame()
for (i in urlrakuten){
print(i)
#read the page just once
page <- read_html(i)
# parse titles
title <- page%>%html_nodes('.vw-productCard .name') %>% html_text()
# parse prices
price <- page %>% html_nodes('.vw-productCard .price .actual') %>% html_text()
# parse discounts
discount <- page %>% html_nodes('.vw-productCard .thumb .discount .text') %>% html_text()
#create temporary dataframe to store data from this loop
tempdf <- data.frame(title, price, discount)
#combine temp with all data
alllistings <- rbind(alllistings, tempdf)
}
它对前两个对象的效果非常好,但对最后一个对象不适用(折扣)。第一页只有四个折扣,R 将所有折扣都刮掉,然后用这四个值的重复填充其余行,请参阅我的输出:
我肯定遗漏了一些东西,但我不知道如何修复它。我希望有相同的输出,第三列值组织到它们所属的行,其余的只填充 NA。
【问题讨论】:
-
@ Dave2e 感谢您的快速回复,Dave。不,不幸的是,这种重新排列只给了我三行(观察)的 NA。我在您的代码中包含了带有 url 的第四列,这些 url 被很好地收集和呈现。我认为我在这里的包装实现是不正确的。
标签: r web-scraping na rvest