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

使用Nokogiri爬取电影海报返回非预期链接的问题咨询

问题原因及解决方案

原因分析

  1. 动态内容加载限制:Letterboxd的海报图片并非直接嵌入静态HTML,而是通过JavaScript动态加载的。你用URI.open获取的是页面初始的静态源码,此时<img>标签的src属性被设置为空占位图,真实的海报链接通常存储在data-src或类似的自定义属性中。
  2. 反爬策略拦截:网站可能识别出你的请求来自非浏览器环境(缺少标准的User-Agent头),返回的内容经过简化,未包含真实海报链接。

解决方法

方法1:提取正确的属性值

查看页面源码,找到海报图片标签中存储真实链接的属性(比如data-src),修改代码中获取海报的部分:

poster = html.search('.film-poster img').attribute('data-src').value

如果data-src不存在,可以检查data-original或其他自定义属性,以实际页面源码为准。

方法2:添加浏览器请求头

给请求添加标准的User-Agent,模拟浏览器访问,避免被反爬机制拦截:

url = "https://letterboxd.com/film/glass-onion-a-knives-out-mystery/"
headers = { "User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" }
serialized_html = URI.open(url, headers).read

html = Nokogiri::HTML.parse(serialized_html)

title = html.search('.headline-1').text.strip
overview = html.search('.truncate p').text.strip
poster = html.search('.film-poster img').attribute('data-src').value # 或对应属性

{
  title: title,
  overview: overview,
  poster_url: poster,
}

方法3:使用支持JS渲染的工具

如果海报完全依赖JavaScript生成,静态爬取无法获取,可使用capybara或watir配合浏览器驱动(如ChromeDriver)获取渲染后的页面内容。示例(capybara):

require 'capybara/dsl'
require 'capybara/chromedriver'

Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome)
end

session = Capybara::Session.new(:chrome)
session.visit("https://letterboxd.com/film/glass-onion-a-knives-out-mystery/")

title = session.find('.headline-1').text.strip
overview = session.find('.truncate p').text.strip
poster = session.find('.film-poster img')['src']

{
  title: title,
  overview: overview,
  poster_url: poster,
}

内容的提问来源于stack exchange,提问作者user3686152

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:04