使用rvest爬取fanfiction.net持续报503错误的解决方案咨询
问题解决步骤
- 固定使用合规标识类User-Agent
你之前传入机构、姓名、邮箱组合的UA曾成功拿到200响应,优先固定使用该类UA即可,不要尝试模拟浏览器UA,该站点对带特殊符号、格式复杂的常规浏览器UA反爬校验规则更严格,容易触发403错误。UA格式参考:"Non-commercial academic research crawler: Name XXX, Institution XXX, Contact XXX@xxx.edu" - 补充完整请求头字段
仅传入UA不足以通过基础反爬校验,需要补充常规浏览器会携带的请求头字段,包括Accept、Accept-Language、Accept-Encoding等,降低被识别为自动化请求的概率。 - 开启会话保持机制
使用httr::session()创建持久会话,自动存储站点返回的Cookie,后续所有请求复用同一个会话实例。多数首次请求触发的503错误是因为请求未携带有效Cookie,携带站点下发的Cookie后即可正常访问。 - 增加请求间隔与退避重试机制
首次请求前增加2~3秒的随机延迟,所有请求之间严格遵守robots.txt要求设置不低于5秒的间隔。若返回503/403错误,使用指数退避策略重试,重试次数不超过3次,每次重试间隔翻倍,避免触发频率限制。
优化后可直接运行的代码示例
library(httr) library(rvest) # 替换为你自己的真实信息作为UA userAgent <- "Non-commercial academic research crawler: 张三, XX大学文学院, zhangsan@xxx.edu.cn" # 创建持久会话,先请求robots.txt符合爬虫礼仪 sess <- session( url = "https://www.fanfiction.net/robots.txt", user_agent(userAgent), add_headers( Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", `Accept-Language` = "en-US,en;q=0.9", `Accept-Encoding` = "gzip, deflate, br", Connection = "keep-alive" ) ) # 遵守5秒爬取间隔要求 Sys.sleep(5) # 复用会话请求目标页面 resp <- session_jump_to(sess, "https://www.fanfiction.net") # 解析页面内容 page_content <- read_html(resp)
注意事项
- 仅爬取研究所需的最小数据集,不要批量下载全站点内容,避免给服务器造成额外负担
- 若持续返回验证页面,可手动在本地浏览器中访问一次站点,将浏览器中拿到的有效Cookie写入请求头中临时使用,不要频繁更换IP触发更严格的反爬规则
内容的提问来源于stack exchange,提问作者Anastasia Pupynina
相关产品推荐
相关产品推荐

