[英]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.