假设我想从网站备份每张图片,所以我写了一个简单的脚本
require "open-uri"
require "pathname"
unless ARGV[0]
puts "Usage: ruby imageScrape.rb <URL>"
exit
end
url = ARGV[0].strip
begin
open(url, "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5; Windows´98)") do |source|
source.each_line do |x|
if x =~ / height="[0-9][0-9][0-9]" src="(.+. [jpeg|gif])"\s+/
name = $1.split('"').first
name = url + name if Pathname.new(name).absolute?
copy = name.split('/').last
File.open(copy, 'wb') do |f|
f.write(open(name).read)
end
end
end
end
rescue => e
puts "Error"
puts e
end
但问题是这个网站只在滚动鼠标滚轮后加载更多内容。因此,在运行脚本后,我得到5张图片而不是150张图片。有没有办法将它们全部加载?
答案 0 :(得分:1)
你在这里遇到了几个问题。
首先,open
调用将HTML作为字符串返回。您应该使用类似Nokogiri的内容来解析它并提取所有img
标记。这通常很简单:
Nokogiri::HTML(source.read).css('img').each do |img_tag|
href = img_tag.attr('src')
# ... Other code to fetch and save image
end
第二个问题是服务器只发送了一页内容,其余的则加载了JavaScript。模拟“鼠标滚动”在这里是徒劳的,因为没有浏览器可以模拟它。相反,通过阅读源或查看所做的网络调用来查看JavaScript正在做什么,并在Ruby中模拟它们。通常,您会在网址末尾看到包含?page=2
或?offset=50
等内容的来电。你只需要迭代那些直到你得到空白结果。