You need to enable JavaScript to run this app. 使用rvest爬取期刊摘要时返回character(0)的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

使用rvest爬取期刊摘要时返回character(0)的问题咨询

ScienceDirect平台论文摘要爬取调整方案

返回空结果的实际原因

  • 问题根本不在选择器写错,是请求环节就被拦了:rvest默认发起请求时携带的库自身标识User-Agent,会被目标站点的反爬机制识别,返回的HTML只是个跳转占位/人机验证页面,根本不包含摘要对应的DOM结构,自然匹配不到任何节点。
  • 你从页面源码看到的section-paragraph类节点,实际是嵌套在摘要父容器内部的段落元素,不是顶层挂载的独立div,直接写顶层div的选择器本身就存在层级匹配错误的问题。

具体可落地的调整步骤

  1. 给请求补上真实浏览器的请求头,绕开基础反爬校验
    直接用rvest自带的read_html()不会携带自定义请求参数,需要先通过httr库发起带请求头的GET请求,拿到真实页面响应后再做解析,对应代码如下:
    library(rvest)
    library(httr)
    
    # 构造和真实浏览器一致的请求头
    req_headers <- add_headers(
      `User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
      `Accept-Language` = "en-US,en;q=0.9"
    )
    
    # 发起请求,自动跟随DOI链接跳转至最终期刊落地页
    resp <- GET(
      url = "https://doi.org/10.1016/j.biopsych.2020.05.020",
      config = req_headers
    )
    
    # 解析拿到的真实页面内容
    page <- read_html(resp)
    
  2. 修正节点选择器,适配真实DOM层级
    真实页面里,带section-paragraph类名的元素是摘要容器下的p标签,调整选择逻辑后就能匹配到全部摘要内容:
    # 定位摘要容器下所有带section-paragraph类名的段落
    abstract_paragraphs <- page %>%
      html_nodes("div.abstracts p.section-paragraph") %>%
      html_text(trim = TRUE)
    
    # 把分段内容拼接为完整的摘要文本
    full_abstract <- paste(abstract_paragraphs, collapse = "\n")
    

后续排查参考

  • 调整代码后如果还是返回空值,可以先把响应的原始文本打印出来检查,如果内容里包含人机验证、自动跳转等待的提示,说明还是被反爬拦截了,此时可以适当拉长请求间隔,避免短时间高频请求触发拦截规则。
  • 优先用CSS选择器定位节点,比起SelectorGadget生成的复杂多类名匹配XPath,CSS选择器在rvest中的匹配稳定性更高,不会因为类名前后空格、多类名拼接的问题出现匹配失败。

内容的提问来源于stack exchange,提问作者user15141497

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 18:45:07