【问题标题】:How to automate webscraping with for loop如何使用 for 循环自动抓取网页
【发布时间】:2021-07-27 04:08:36
【问题描述】:

我有一个包含两列的 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 循环,但我不确定。有任何想法吗?非常感谢任何帮助。

【问题讨论】:

    标签: r dataframe loops for-loop web-scraping


    【解决方案1】:

    这很简单,但我会使用异步,这样您就不必等待每个。

    
    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
    
    

    有关异步的更多信息,请参阅this page

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2021-07-27
      • 2021-09-18
      • 1970-01-01
      • 2022-07-06
      • 2021-04-13
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多