使用 R 抓取动态网页

Web scraping dynamic webpage with R

我的目标是从此站点获取数据:https://www.insee.fr/fr/recherche?q=Emploi-Population+active+en+2018&taille=20&debut=0,尤其是不同项目的 ID 链接。
我知道 GET 函数不起作用,因为它是动态的,需要由 javascript 处理(与 相同)。因此,我通过浏览器的检查器模式获取信息,并找到了一个带有 url 的 POST 查询。

这是一个可重现的示例:

library(httr)

body <- list(q="Emploi-Population%20active%20en%202018",
             start="0",
             sortFields=data.frame(field="score",order="desc"),
             filters=data.frame(NULL),
             rows="50",
             facetsQuery=data.frame(NULL))

TMP   <- httr::POST(url = "http://www.insee.fr/fr/solr/consultation?q=Emploi-Population%20active%20en%202018",
              body = body,
              config = config(http_version=1.1),
              encode = "json",verbose())

请注意,我必须使用 http 而不是 https,否则我什么也得不到(我的代理已正确配置并且 rstudio 可以连接到互联网)。
我得到的只是一个不错的 500 错误。知道我想念什么吗?

您可以更改 q 参数并将其从 url 中删除。我会使用 https 并删除您的配置行以避免 curl 获取错误。但是,下面的适应了 return 100 个结果,仍然有效。

library(httr)

body <- list(
  q = "Emploi-Population active en 2018",
  start = "0",
  sortFields = data.frame(field = "score", order = "desc"),
  rows = "100"
)

TMP <- httr::POST(
  url = "http://www.insee.fr/fr/solr/consultation",
  body = body,
  config = config(http_version = 1.1),
  encode = "json", verbose()
)

data <- fromJSON(content(TMP, type = "text"))

print(data$documents$titre)

我发现将 json 作为字符串传递效果很好:

library(httr)

json <- paste0('{"q":"Emploi-Population active en 2018 ",',
            '"start":"0","sortFields":[{"field":"score","order":"desc"}],',
            '"filters":[],"rows":"20","facetsQuery":[]}')

url <- paste0('https://www.insee.fr/fr/solr/consultation?q=Emploi-Population',
               '%20active%20en%202018%20')

res <- POST(url, body = json, content_type_json())
output <- content(res)

现在 output 是一个庞大的列表,但这里是文档标题的示例:

sapply(output$documents, function(x) x$titre)
#>  [1] "Emploi-Population active en 2018"                                                                          
#>  [2] "Emploi – Population active"                                                                                
#>  [3] "Dossier complet"                                                                                           
#>  [4] "Base du dossier complet"                                                                                   
#>  [5] "Emploi-Population active en 2017"                                                                          
#>  [6] "Comparateur de territoire"                                                                                 
#>  [7] "Emploi – Population active"                                                                                
#>  [8] "L'essentiel sur... les entreprises"                                                                        
#>  [9] "Emploi - population active en 2014"                                                                        
#> [10] "Population active"                                                                                         
#> [11] "Emploi salarié et non salarié par activité"                                                                
#> [12] "Évolution de l'emploi"                                                                                     
#> [13] "Logements, individus, activité, mobilités scolaires et professionnelles, migrations résidentielles en 2018"
#> [14] "Emploi selon le sexe et l’âge"                                                                             
#> [15] "Statut d’emploi et type de contrat selon le sexe et l’âge"                                                 
#> [16] "Sous-emploi selon le sexe et l’âge"                                                                        
#> [17] "Emploi salarié par secteur"                                                                                
#> [18] "Fiche - Chômage"                                                                                           
#> [19] "Emploi-Activité en 2018"                                                                                   
#> [20] "Activité professionnelle des individus : lieu de travail localisé à la zone d'emploi en 2017"

reprex package (v2.0.1)

创建于 2022-05-31