ruby 尝试使用Nokogiri抓取图像,但它返回了一个链接,我没有预料到

svdrlsy4  于 2023-02-21  发布在  Ruby
关注(0)|答案(2)|浏览(117)

我正在做一个刮的练习,并试图刮海报从一个网站使用Nokogiri。
这是我想要得到的链接:https://a.ltrbxd.com/resized/film-poster/5/8/6/7/2/3/586723-glass-onion-a-knives-out-mystery-0-460-0-690-crop.jpg?v=ce7ed2a83f
但我得到了这个:https://s.ltrbxd.com/static/img/empty-poster-500.825678f0.png
为什么?
我是这么试的:

url = "https://letterboxd.com/film/glass-onion-a-knives-out-mystery/"
serialized_html = URI.open(url).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('src').value

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

rkue9o1l1#

这和你的ruby代码无关。
如果你在你的终端里运行

curl https://letterboxd.com/film/glass-onion-a-knives-out-mystery/

你可以看到输出的HTML没有你要找的图像,你可以在浏览器中看到,因为在初始加载之后,一些javascript运行并加载了更多的资源。
加载您要查找的图像的 AJAX 调用是https://letterboxd.com/ajax/poster/film/glass-onion-a-knives-out-mystery/std/500x750/?k=0c10a16c
玩你的浏览器的网络检查器,你将能够识别网站的不同部分,以及每个部分是如何加载的。

v8wbuo2f

v8wbuo2f2#

Nokogiri不执行Javascript,但是链接必须在那里,或者至少必须有一个到返回链接的某个API的链接。
我首先要搜索的是图像元素或其父元素的数据属性,但在本例中,它与其他一些关于电影的有趣数据沿着隐藏在内联脚本中。
首先使用curlwget下载网页,并在文本编辑器中打开文件,看看Nokogiri看到了什么。搜索一些你知道的文件,我搜索了图片URL的ce7ed2a83f部分,并找到了JSON。
然后,可以如下提取数据:

require 'nokogiri'
require 'open-uri'
require 'json'

url = "https://letterboxd.com/film/glass-onion-a-knives-out-mystery/"
serialized_html = URI.open(url).read
html = Nokogiri::HTML.parse(serialized_html)

data_str = html.search('script[type="application/ld+json"]').first.to_s.gsub("\n",'').match(/{.*}/).to_s
data = JSON.parse(data_str)
data['image']

相关问题