使用rvest包爬取需Cookie验证的表单类网站数据遇到问题求助
需求可行性确认
该需求完全可以实现,你提到的两个核心障碍都有成熟的解决方案,且该站点属于欧盟公共数据开放站点,无禁止非商业抓取的规则,只要控制请求频率避免给服务器造成额外压力即可正常操作。
具体实现步骤
- 处理Cookie同意步骤:不需要模拟页面点击操作,你可以直接通过浏览器F12开发者工具的「网络」面板,手动点击同意Cookie时抓取对应的提交请求,获取请求携带的所有表单参数,用
rvest的会话机制保持Cookie状态,将同意参数提交后即可正常访问后续页面。 - 构造下载请求:不需要通过页面表单填充的方式触发下载,你可以先在浏览器中手动选择好「全部国家、全部时间范围、全部历史数据」的条件,点击Download按钮时抓取该下载请求的完整URL、请求方法、所有提交参数,直接在R中构造对应请求发送即可获取完整CSV文件,这种方式比页面元素定位填充的兼容性更高,也不需要找对应参数的页面引用。
参考代码框架
library(httr) library(rvest) # 初始化会话 fleet_session <- session("https://webgate.ec.europa.eu/fleet-europa/index_en") # 提交Cookie同意,参数替换为你抓包获取的实际字段 consent_res <- fleet_session %>% session_submit( form = list( # 此处替换为抓包拿到的同意Cookie的所有参数 consent = "accept_all", required_cookies = "1", analytics_cookies = "1" ) ) # 构造下载请求,URL和参数替换为你抓包Download按钮拿到的实际内容 csv_res <- consent_res %>% session_jump_to( url = "此处替换为你抓包拿到的下载接口地址", method = "POST", body = list( # 此处替换为全量数据下载对应的所有请求参数 country_filter = "all", time_filter = "all", include_history = "true", export_type = "csv" ) ) # 保存并加载数据 writeBin(content(csv_res, "raw"), "fleet_full_data.csv") fleet_data <- read.csv("fleet_full_data.csv", encoding = "UTF-8")
注意事项
所有请求参数请以你自己抓包获取的内容为准,不同站点的参数命名、接口地址都有差异,抓包获取的参数是最准确的,不需要参考其他案例的参数格式,直接套用自己抓包的结果即可。
内容的提问来源于stack exchange,提问作者Fred-LM
相关产品推荐
相关产品推荐

