R语言Web Scraping:GET请求返回特殊字符串的处理咨询
解决方法
你遇到的问题是服务器返回了gzip压缩的原始内容,而httr::content()没有自动完成解压,导致得到一串无法识别的字符串。以下是具体的解决步骤和代码:
1. 检查响应状态与压缩类型
先确认响应是否被压缩:
library(httr) resp <- GET("https://pmfby.gov.in/landingPage/districtState?stateID=2F3DE245-46E6-4C4D-9297-C0B23C803B15&sssyID=02012223") # 查看响应头中的编码信息 print(resp$headers[["content-encoding"]])
如果输出gzip,说明内容确实是gzip压缩的。
2. 手动解压并解析内容
通过添加浏览器请求头模拟正常访问,再手动处理压缩内容:
library(httr) library(jsonlite) # 发送带完整请求头的请求 resp <- GET( url = "https://pmfby.gov.in/landingPage/districtState?stateID=2F3DE245-46E6-4C4D-9297-C0B23C803B15&sssyID=02012223", add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept" = "application/json, text/javascript, */*; q=0.01", "Accept-Encoding" = "gzip, deflate, br" ) ) # 提取原始二进制内容并解压 raw_content <- content(resp, as = "raw") decompressed_text <- memDecompress(raw_content, type = "gzip", asChar = TRUE) # 解析为JSON格式 district_list <- fromJSON(decompressed_text) print(district_list)
3. 备选方案:使用会话保持Cookie
部分政府网站会验证会话Cookie,可先访问主页建立会话再请求数据:
library(httr) library(jsonlite) # 初始化会话,获取必要的Cookie session <- html_session("https://pmfby.gov.in/") # 在会话内发送目标请求 resp <- session %>% GET( path = "/landingPage/districtState", query = list( stateID = "2F3DE245-46E6-4C4D-9297-C0B23C803B15", sssyID = "02012223" ), add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept" = "application/json, text/javascript, */*; q=0.01" ) ) # 直接解析响应内容 district_list <- content(resp, type = "application/json") print(district_list)
核心原因
服务器会对非浏览器的请求返回压缩后的原始数据,同时可能验证请求头的合法性。通过模拟浏览器的User-Agent和Accept头,并手动处理gzip压缩,就能正确获取并解析地区列表的JSON数据。
内容的提问来源于stack exchange,提问作者NoAlibi
相关产品推荐
相关产品推荐

