簡體   English   中英

如何使用 for 循環自動進行網頁抓取

[英]How to automate webscraping with for loop

我有一個包含兩列的 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的變量。 這是我想要實現的:

        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 循環,但我不確定。 有任何想法嗎? 我會非常感謝任何幫助。

這很簡單,但我會使用異步的 go ,因此您不必等待每個。


ids <- c("P173165", "P175875", "P175841", "P175730")

df <- data.table(
    id=ids,
    url = sprintf(
        "https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=%s&apilang=en",
        ids
    )
)

library(remotes)
remotes::install_github("r-lib/async")
library(async)

async_get <- async(function(url,project) {
    http_get(url)$
        then(function(x) { rawToChar(x$content)})$
        then(function(x) { fromJSON(x)})$
        then(function(x) { x$projects[[1]]$parentprojid } )
})
parent.ids <- df$synchronise(async_map(df$url, async_get, .limit=5)) ## 5 is a nice limit not to bombard the site

df$par_proj_id <- parent.ids

有關異步的更多信息,請參閱此頁面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM