使用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.
相关产品推荐
相关产品推荐

