R 中的网页抓取:循环/自动化如何?

时间:2021-02-22 19:10:15

标签: r web-scraping

我想抓取网页 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"),它收集页面中显示的所有价格。我只想要一个价格,就是交通的月票费用。

非常感谢您提前

2 个答案:

答案 0 :(得分:0)

Stackoverflow 不鼓励“代码看起来如何”问题。也许我的步骤可以帮助您自己编写代码,如果您在某处迷路了,您可以再问一次。

步骤 1. 获取所有城市名称并将它们放入一个向量中。好的做法:从维基百科获取城市列表,它们应该在一个可以很好地抓取的表格中。获取该列表的前 80 个条目并将它们放入一个变量中。或者只是将列表复制并粘贴到 RStudio 中并手动创建矢量。 wiki link

第 2 步。使用该向量创建一个 data.table。您的向量是 data.table 的第一列。将第一列命名为“城市”。向 data.table 添加第二个空列,称为“运输成本”。

第 3 步。创建一个循环,执行以下操作:

  • 创建城市网站的路径
  • 连接到城市的网站
  • 从该城市抓取您要查找的值(使用 CSS Selector 小工具或浏览器的开发者工具查找正确的值)
  • 将值放入 data.table 的正确位置
  • 从下一个城市再次开始循环

第 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]))

}

}