如何在R语言网页爬取请求中添加请求头并获取IFC项目动态加载数据
解决IFC项目数据爬取的动态加载与SSL握手问题
嘿,你的思路完全没问题——静态页面拿不到动态数据、API需要请求头这些判断都很准确,现在主要解决SSL握手错误和正确模拟浏览器请求的问题,一步步来:
1. 换用更友好的工具包解决SSL问题
你用的RCurl的getURL在Windows下经常踩SSL证书的坑,推荐换成httr包,它基于curl库,对Windows的证书支持更完善,用法也更直观。先安装加载:
install.packages("httr") library(httr) library(jsonlite)
2. 带上浏览器请求头发送API请求
你已经抓到了Firefox的请求头,服务器会校验核心字段(尤其是Origin、Referer和User-Agent),缺了就会拒绝访问。直接用下面的代码:
# 目标API地址 url2 <- "https://disclosuresservice.ifc.org/api/ProjectAccess/SIIProject?projectId=45315" # 构造请求头,把你抓到的关键字段填进去 request_headers <- add_headers( Host = "disclosuresservice.ifc.org", `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0", Accept = "application/json, text/plain, */*", `Accept-Language` = "de,en-US;q=0.7,en;q=0.3", Origin = "https://disclosures.ifc.org", Referer = "https://disclosures.ifc.org/", `Cache-Control` = "max-age=0" ) # 发送GET请求,httr会自动处理SSL证书 response <- GET(url2, request_headers) # 先检查请求是否成功(状态码200就是成功) stop_for_status(response) # 解析返回的JSON数据 project_data <- fromJSON(content(response, "text")) # 看看数据结构,确认拿到了想要的内容 str(project_data)
3. 关键细节说明
- 为啥不用
getURL?:RCurl在Windows下的SSL配置比较麻烦,httr默认会调用系统的证书存储,直接避免了握手失败的问题。 - 请求头不能少哪些?:
Origin和Referer是服务器用来验证请求来源的,User-Agent模拟浏览器身份,这几个是核心;其他字段比如Accept-Language可以根据情况调整,但带上更稳妥。 - 压缩自动处理:
httr会自动处理Accept-Encoding里的gzip/deflate,不用手动设置。
4. 要是还遇到SSL错误的备用方案
如果还是报SSL相关的错,可能是本地证书的问题,可以临时关闭SSL验证(仅限测试,正式爬取不推荐):
response <- GET(url2, request_headers, config(ssl_verifypeer = FALSE))
或者更新你的curl库,确保版本是新的:
install.packages("curl") library(curl) # 查看当前curl版本 curl::curl_version()
这样应该就能顺利拿到你需要的项目数据啦!
内容的提问来源于stack exchange,提问作者LololoTheGreat
相关产品推荐
相关产品推荐

