Ruby+open-uri读取URL遇403错误,树莓派爬虫突然失效求助
问题诊断与解决方法
可能的原因
- 目标网站升级反爬机制,通过TLS指纹/HTTP客户端特征识别请求来源:即便User-Agent一致,树莓派上
open-uri/Net::HTTP依赖的底层TLS库(如libssl)版本、支持的加密套件与笔记本存在差异,请求被判定为非浏览器发起。 - 反爬规则拦截无JS支持的请求:
open-uri/Net::HTTP完全不处理JS,而lynx作为文本浏览器会模拟基础浏览器行为(包括处理Cookie、发送更贴近真实用户的请求头),因此能绕过检测。 - 请求头完整性不足:仅设置User-Agent不够,缺少浏览器常用的
Accept、Accept-Language、Referer、Cookie等字段,被反爬系统标记为异常。
解决步骤
1. 模拟完整浏览器请求头
放弃open-uri,改用Net::HTTP手动构建包含完整请求头的请求,示例代码:
uri = URI.parse("你的目标URL") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true if uri.scheme == 'https' request = Net::HTTP::Get.new(uri) request['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' request['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' request['Accept-Language'] = 'en-US,en;q=0.5' request['Referer'] = 'https://www.google.com/' # 可根据目标网站调整 request['Cookie'] = '从lynx访问时获取的Cookie值' # 可选,若网站要求 response = http.request(request) page = Nokogiri::HTML(response.body, nil, "UTF-8")
2. 调整树莓派TLS配置
Ubuntu 20.04默认libssl版本较旧,可能导致TLS握手特征被识别:
- 强制使用TLS 1.3版本:
http.ssl_version = :TLSv1_3 - 更新libssl到backports版本:
sudo apt update && sudo apt install -t focal-backports libssl1.1
3. 使用Headless浏览器模拟真实行为
若目标网站依赖JS渲染或严格检测浏览器环境,直接用HTTP库难以绕过,建议用Playwright的Headless模式:
# 先安装依赖 gem install playwright-ruby-client playwright install chromium # 示例代码 require 'playwright' require 'nokogiri' Playwright.create do |playwright| playwright.chromium.launch(headless: true) do |browser| page = browser.new_page page.goto('你的目标URL') html = page.content doc = Nokogiri::HTML(html) # 后续解析逻辑 end end
4. 复用lynx的Cookie
利用lynx能正常访问的特性,先获取Cookie再复用:
- 用lynx保存Cookie:
lynx -cookie_file=./cookies.txt "你的目标URL" - 在Ruby代码中读取并使用:
cookie_content = File.read('./cookies.txt').split("\n").map { |line| line.split("\t").last }.join('; ') # 将cookie_content赋值给request['Cookie']
内容的提问来源于stack exchange,提问作者MarkB
相关产品推荐
相关产品推荐

