2

我想用我编写的网络抓取脚本中的信息更新 Rails 中的 erb.html 页面,但我不希望每次进入新信息时都必须刷​​新页面。

我不知道将后台脚本放在哪里,rails 将如何调用它等等。

我该怎么做呢?

4

1 回答 1

2

在构造方面有多种方法可以实现您想要的结果,但最终您将使用 Javascript 和 AJAX 调用,因为没有其他方法可以使用抓取的数据更新页面上的内容。

下面是我如何使用 AJAX 和屏幕抓取来实现 RoR:

应用程序.js

在我们的应用程序 JS 文件中,我们监听一个字段何时更改(用户输入一个 web url 或某种数据),然后我们对我们的爬虫进行 AJAX 调用(稍后在 Routes.rb 中设置的 url)和我们的数据以 JSON 格式返回(当调用 AJAX 的成功触发器时),我们循环并在两个字段中显示抓取的数据,这些字段以与我们的 JSON 键值对的键类似的格式命名。

$('#item_url').live('change', function() {          
     $.ajax({
            url: "/scrape/siteandnum", 
            data: {item_url: document.getElementById('item_url').value},             
            dataType: 'json', 
            success: function(data) {                                                               
                    $.each(data, function(key, value) {                        
                        document.forms['new_qued_item'].elements['qued_item_' + key].value = value
                    });         
                }
            });
}); 

qued_items_controller.rb

在我们的控制器中,我们有一个方法是 Ruby 抓取代码。它接收 item_url 的参数(从 AJAX 调用的数据传入)——在本例中,它接收 eBay 拍卖 URL 并为我们提供 eBay 站点域和商品编号。

def scrape_site_and_num
    url = params[:item_url] 
    itemnumber = url.match(/\d{12}/)[0].to_i 
    site = url.match(/ebay.(co.uk|com|de|fr|it|ca)/)[0]

    render :json => {'itemnumber' => itemnumber, 'site' => site}
end 

路线.rb

当然,我们必须有一个路由,以便 AJAX 调用知道从哪里访问我们的抓取方法。

  get "scrape/siteandnum/" => "qued_items#scrape_site_and_num"

所以你有它。使用此方法可以输入任何类型的数据,并且“幕后”Ruby 方法将处理用户输入并返回一些屏幕抓取的数据,而无需重新加载页面!

于 2012-06-15T00:01:47.910 回答