模拟鼠标滚动红宝石

时间:2015-05-21 20:17:50

标签: ruby

假设我想从网站备份每张图片,所以我写了一个简单的脚本

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张图片。有没有办法将它们全部加载?

1 个答案:

答案 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等内容的来电。你只需要迭代那些直到你得到空白结果。