R语言rvest爬取Hepsiburada页面报HTTP 403错误如何解决
问题根因
两个报错属于连锁触发,不需要分开定位:
- 核心错误是
HTTP error 403:Hepsiburada站点配置了反爬规则,rvest默认发起的请求携带的User-Agent标识会暴露自身为R爬虫程序,而非真实用户使用的浏览器,服务器直接拒绝返回页面内容。 - 后续的
xml_find_all方法适配错误是连带问题:read_html()执行失败后,page变量未被赋值为目标网页的解析对象,R环境会默认调用内置的page分页函数(属于function类型),对函数对象调用html_nodes()自然会触发类型不匹配报错,解决403问题后该报错会自动消失,无需单独处理。
排查思路
按以下顺序排查即可:
- 先把目标链接复制到本地普通浏览器中打开,确认链接未失效、站点可正常访问、本地IP未被站点永久封禁
- 检查请求标识:确认请求携带的User-Agent是否为真实浏览器的标识,是否缺少站点校验要求的基础请求头
- 检查请求频率:确认短时间内是否对该站点发起了过高频率的请求,触发了流量拦截规则
解决方案
通过httr包构造模拟真实浏览器的请求头,拿到正常响应后再交给rvest解析,可直接运行以下代码:
# 加载依赖,未安装的话先运行install.packages(c("rvest","dplyr","httr"))安装 library(rvest) library(dplyr) library(httr) link <- "https://www.hepsiburada.com/lg-70nano756pa-70-177-ekran-uydu-alicili-4k-ultra-hd-smart-led-tv-p-HBCV00000YCM48" # 构造模拟桌面端Chrome的合法请求 response <- GET( link, # 模拟浏览器UA标识 user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"), add_headers( `Accept` = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", `Accept-Language` = "tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3", `Referer` = "https://www.hepsiburada.com/" ) ) # 校验请求状态,返回"Success"才代表请求成功 http_status(response)$category # 解析响应内容为HTML文档 page <- read_html(response) # 执行原有信息提取逻辑 price <- page %>% html_nodes(".productPrice") %>% html_text() seller <- page %>% html_nodes(".merchantName") %>% html_text()
补充注意事项
- 如果运行后仍返回403,可在浏览器中打开目标站点,按F12调出开发者工具,在「网络」面板中找到任意一个对hepsiburada的请求,复制请求头里真实的User-Agent值替换代码中对应字段即可
- 控制请求频率,批量抓取时单次请求间隔设置为1~2秒,避免短时间大量请求触发IP临时封禁
- 如果后续发现提取节点返回空值,是因为站点部分商品信息通过JS动态渲染,静态请求拿不到渲染后的内容,可结合
chromote包调用本地Chrome完成页面渲染后再解析,不要高频硬撞反爬规则
内容的提问来源于stack exchange,提问作者Kubilay Güzel
相关产品推荐
相关产品推荐

