我想抓取网页 www.numbeo.com,该网页提供任何城市的价格比较。 我的重点是德国 80 个最大的城市,就居民而言。 由于我最近重新开始使用 R,我的技能已经过时了。
这是我的代码:
library(rvest)
library(dplyr)
link = "https://www.numbeo.com/cost-of-living/in/Kaiserslautern"
page = read_html(link)
name = page %>% html_nodes(".priceValue") %>% html_text()
问题 1:我想通过循环(而不是“Kaiserslautern” f.e.)将 80 个城市名称插入到 URL 中,通过它我收集网页上给出的每个城市的特定价格。此收集应保存在数据框中的 csv 文件中。代码看起来如何?
问题 2:目前我正在访问节点 html_nodes(".priceValue"),它收集页面中显示的所有价格。我只想要一个价格,就是交通的月票费用。
非常感谢您提前
答案 0 :(得分:0)
Stackoverflow 不鼓励“代码看起来如何”问题。也许我的步骤可以帮助您自己编写代码,如果您在某处迷路了,您可以再问一次。
步骤 1. 获取所有城市名称并将它们放入一个向量中。好的做法:从维基百科获取城市列表,它们应该在一个可以很好地抓取的表格中。获取该列表的前 80 个条目并将它们放入一个变量中。或者只是将列表复制并粘贴到 RStudio 中并手动创建矢量。 wiki link
第 2 步。使用该向量创建一个 data.table。您的向量是 data.table 的第一列。将第一列命名为“城市”。向 data.table 添加第二个空列,称为“运输成本”。
第 3 步。创建一个循环,执行以下操作:
第 4 步。您应该最终得到一个包含 80 个城市名称和 80 个值的 data.table。将 data.table 导出为 csv。
这不是很多代码,它可以用很少的代码行编写。我建议使用更多的代码行,直到它正常工作,然后开始优化。
答案 1 :(得分:0)
我对以下部分有一个具体问题。我事先创建了一个城市列表,以在 URL 末尾自动添加城市名称。不幸的是,该网站有时也会在某些城市的末尾加上“-Germany”。因此,我想为此编写一个性感的 if/else 代码。但是有什么问题吗?
ds=list("柏林"、"汉堡"...81 个城市)
city_cost= data.frame()
for(ds 中的城市){
num_link= paste0("https://www.numbeo.com/cost-of-living/in/", city)
num_page= read_html(num_link)
if (is.null(num_page)){
num_link_new= paste0("https://www.numbeo.com/cost-of-living/in/", city, "-Germany")
num_page_new= read_html(num_link_new)
num_table= num_page_new %>% html_nodes("table") %>% .[2] %>% html_table() %>% .[[1]]
city_cost = rbind(city_cost,data.frame(num_table[31,2]))
}
其他{
num_table= num_page %>% html_nodes("table") %>% .[2] %>% html_table() %>% .[[1]]
city_cost = rbind(city_cost,data.frame(num_table[31,2]))
}
}