使用Nokogiri爬取电影海报返回非预期链接的问题咨询
问题原因及解决方案
原因分析
- 动态内容加载限制:Letterboxd的海报图片并非直接嵌入静态HTML,而是通过JavaScript动态加载的。你用
URI.open获取的是页面初始的静态源码,此时<img>标签的src属性被设置为空占位图,真实的海报链接通常存储在data-src或类似的自定义属性中。 - 反爬策略拦截:网站可能识别出你的请求来自非浏览器环境(缺少标准的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
相关产品推荐
相关产品推荐

