繁体   English   中英

如何在 r 中使用 for 循环进行网页抓取

[英]How to use a for loop for webscraping in r

我有一个包含两列的 df:id 和 url。 id 包含项目 id,url 包含我想用于抓取父项目的 id 的网站链接。 这是我拥有的 df 示例:

这是一个示例df:

df <- structure(list(id = c("P173165", "P175875", "P175841", "P175730"
), url = c("https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en", 
"https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en", 
"https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en", 
"https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en"
)), row.names = c(NA, -4L), class = c("data.table", "data.frame"))

> df
        id                                                                                 url
1: P173165 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en
2: P175875 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en
3: P175841 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en
4: P175730 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en

@Sirius 建议我可以使用以下代码刮取父项目 ID:

library(jsonlite)

#let's do an example for row 1

json_data <- fromJSON("https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en")
json_data$projects[["P173165"]]$parentprojid

如您所见,我从第一行输入了 url; 然后我从第一行输入 id。 此代码输出父项目 ID:

[1] "P147665"

我想编写一个代码来自动化这个过程,并创建一个包含父项目ID的向量。 然后我会将此向量作为第三列分配给我的 df。 这就是我想要实现的目标:

        id                                                                                 url par_proj_id
1: P173165 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en     P147665
2: P175875 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en     P173883
3: P175841 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en     P170267
4: P175730 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en     P173799

我想我应该在这里使用 for 循环,但我不确定如何。 有任何想法吗? 我会非常感谢任何帮助。

您可以将请求放入 function 中,然后使用 purrr 中的 map2 传入子 ID 和 url。 这应该比使用 for 循环更有效,也更时髦。

library(magrittr)
library(jsonlite)
library(purrr)

get_parent_id <- function(child_id, url){
  json_data <- jsonlite::fromJSON(url)
  return(json_data$projects[[child_id]]$parentprojid)
}


df <- structure(list(id = c("P173165", "P175875", "P175841", "P175730"
), url = c("https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en", 
           "https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en", 
           "https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en", 
           "https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en"
)), row.names = c(NA, -4L), class = c("data.table", "data.frame"))


df$par_proj_id <- purrr::map2(df$id, df$url, get_parent_id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM