You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PhantomJS+R爬取网页遇请求超时错误,求解决方法

问题描述

尝试爬取牛津抽象虚拟活动的人员页面,但始终下载到空页面,页面显示:

Connection error.
Sorry, your request to load the app is timing out.
Please check your internet connection and refresh the page.
If the issue continues, try in a different browser and then contact support
Refresh page →

当前使用PhantomJS通过R语言驱动,代码如下:

library(readr)
library(webdriver)

dr <- run_phantomjs()
ses <- Session$new(port = dr$port)

ses$go("https://virtual.oxfordabstracts.com/#/event/3738/people?page=114")
Sys.sleep(2) # just in case

# save
readr::write_lines(ses$getSource(), "page114.html")

# problem: empty page

这个提示的“超时”不一定是本地网络问题,更大可能是网站反爬机制识别了PhantomJS、动态内容加载不充分,或是网站对请求频率/客户端身份有限制。以下是可尝试的解决技巧:

解决技巧

1. 替换PhantomJS为现代无头浏览器

PhantomJS已停止维护,多数反爬机制会直接拦截它。换成Chrome或Firefox的无头模式,兼容性和隐蔽性更好:

library(webdriver)
# 启动Chrome无头模式
dr <- run_chrome(args = c("--headless=new", "--disable-gpu"))
ses <- Session$new(port = dr$port)

ses$go("https://virtual.oxfordabstracts.com/#/event/3738/people?page=114")
# 用显式等待替代固定sleep,确保内容加载完成
ses$waitForElement(css = ".person-item") # 替换为页面实际存在的人员元素选择器
readr::write_lines(ses$getSource(), "page114.html")

ses$close()
dr$stop()

2. 添加请求头伪装

网站会通过User-Agent识别爬虫,添加真实浏览器的请求头:

ses <- Session$new(port = dr$port)
# 设置真实浏览器的User-Agent
ses$setHeaders(
  `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"
)
ses$go("https://virtual.oxfordabstracts.com/#/event/3738/people?page=114")

3. 优化等待逻辑

固定的Sys.sleep(2)不可靠,改用显式等待核心元素加载,避免提前抓取空内容:

tryCatch({
  # 等待页面主体加载,最多10秒
  ses$waitForElement(css = "body", timeout = 10000)
  # 等待人员列表动态加载完成
  ses$waitForElement(css = "[data-testid='person-list']", timeout = 10000)
}, error = function(e) {
  cat("等待元素超时:", e$message, "\n")
})

4. 排查网络与请求频率

  • 手动用普通浏览器打开目标URL,确认是否能正常加载:如果手动也超时,才是本地网络或网站服务器问题。
  • 降低请求频率,每次请求后增加3-5秒的随机间隔,避免被网站限流。

5. 直接抓取API接口数据

这类动态页面的数据通常通过AJAX请求获取,打开浏览器开发者工具(F12)的Network标签,刷新页面找到加载人员数据的API接口,直接请求接口效率更高:

library(httr)
# 示例(需实际抓包确认真实API地址)
response <- GET(
  url = "https://virtual.oxfordabstracts.com/api/event/3738/people",
  query = list(page = 114),
  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",
    `Referer` = "https://virtual.oxfordabstracts.com/#/event/3738/people"
  )
)
data <- content(response, "parsed")
# 后续处理数据

6. 尝试禁用JavaScript(仅静态内容场景)

如果页面存在静态内容,可尝试禁用JS,但这类SPA页面通常依赖JS加载数据,此方法可能无效:

# 启动PhantomJS时禁用JS
dr <- run_phantomjs(args = c("--load-images=no", "--javascript=no"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:13:19