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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:22:44