修改R语言europepmc包GET请求 获取机构授权的PMC文献全文
问题根因
epmc_ftxt默认请求的是Europe PMC的公开开放获取接口,该接口仅对OA子集文献返回XML全文,本身不支持机构订阅权限校验,无论给这个接口加什么认证凭证,都无法获取非OA文献,这也是持续收到404报错的核心原因,和请求有没有带凭证没有关系。- 院校订阅的授权逻辑是:在机构IP段/VPN/认证代理环境下,访问出版商或PMC的授权服务端点才能获取对应内容,和Europe PMC的公开OA接口是两套独立体系。
可落地修改方案
方案1:机构网络环境下直连PMC全文端点
连接院校VPN或处于校园网IP段时,直接将请求目标替换为PMC官方的全文服务端点即可,修改后的函数如下:
epmc_ftxt_auth <- function(ext_id = NULL) { if (!grepl("^PMC", ext_id)) { stop("请输入以PMC开头的PMCID") } # 拼接PMC全文接口地址 pmc_id_num <- gsub("^PMC", "", ext_id) req <- httr::RETRY( verb = "GET", url = paste0( "https://www.ncbi.nlm.nih.gov/pmc/oai/oai.cgi?", "verb=GetRecord&metadataPrefix=pmc&identifier=oai:pubmedcentral.nih.gov:", pmc_id_num ), # 若机构要求指定代理访问,取消下方注释并填入对应代理参数 # config = httr::use_proxy(url = "机构代理地址", port = 代理端口) ) httr::stop_for_status(req, "获取全文,请确认当前处于机构授权网络环境") httr::content(req, as = "text", encoding = "utf-8") %>% xml2::read_xml() }
- 校外访问时如果机构要求走专属代理,把代码里注释的代理配置补全即可。
方案2:携带认证Cookie访问
如果机构需要网页登录认证后才能访问文献资源,可以先通过浏览器登录院校的文献访问入口,从开发者工具复制有效Cookie,传入请求头即可:
# 从浏览器开发者工具中复制登录后的有效Cookie字符串 valid_auth_cookie <- "替换为你实际获取的Cookie内容" epmc_ftxt_cookie <- function(ext_id = NULL, auth_cookie = NULL) { if (!grepl("^PMC", ext_id)) { stop("请输入以PMC开头的PMCID") } pmc_id_num <- gsub("^PMC", "", ext_id) req <- httr::RETRY( verb = "GET", url = paste0( "https://www.ncbi.nlm.nih.gov/pmc/oai/oai.cgi?", "verb=GetRecord&metadataPrefix=pmc&identifier=oai:pubmedcentral.nih.gov:", pmc_id_num ), config = httr::add_headers(Cookie = auth_cookie) ) httr::stop_for_status(req, "获取全文,请确认Cookie有效且账号拥有对应文献访问权限") httr::content(req, as = "text", encoding = "utf-8") %>% xml2::read_xml() } # 调用示例 # epmc_ftxt_cookie("PMC2701033", auth_cookie = valid_auth_cookie)
注意事项
- 无需浪费时间修改原函数给Europe PMC的OA接口加认证信息,该端点本身不返回非OA内容,任何认证参数都不会生效。
- 下载的文献仅可用于个人学术研究,严格遵守数据库和机构的资源使用规范,禁止批量爬取或商用。
- 如果机构未订阅对应期刊/文献,即使处于授权网络或携带有效凭证,依然会返回权限错误。
内容的提问来源于stack exchange,提问作者Francesca Longhin
相关产品推荐
相关产品推荐

