Railsのerb.htmlページを、自分が作成したWebスクレイピングスクリプトの情報で更新したいのですが、新しい情報が届くたびにページを更新する必要はありません。
バックグラウンドスクリプトをどこに配置するか、railsがどのようにスクリプトを呼び出すかなどはわかりません。
どうすればよいですか?
Railsのerb.htmlページを、自分が作成したWebスクレイピングスクリプトの情報で更新したいのですが、新しい情報が届くたびにページを更新する必要はありません。
バックグラウンドスクリプトをどこに配置するか、railsがどのようにスクリプトを呼び出すかなどはわかりません。
どうすればよいですか?
構築に関して望ましい結果を達成する方法はいくつかありますが、最終的には、スクレイピングされたデータでページのコンテンツを更新する他の方法がないため、JavascriptとAJAX呼び出しを使用することになります。
RoRにAJAXとスクリーンスクレイピングを使用する方法は次のとおりです。
application.js
アプリケーションのJSファイルでは、フィールドが変更されたとき(ユーザーがWeb URLまたはある種のデータを入力したとき)をリッスンし、スクレイパー(後でRoutes.rbで設定されたURL)とデータはJSON形式で返され(AJAXの成功トリガーが呼び出された場合)、ループして、JSONキーのキーである値のペアと同様の形式で名前が付けられた2つのフィールドにスクレイピングされたデータを表示します。
$('#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呼び出しがscrapメソッドにアクセスする場所を認識できるようにルートを用意する必要があります。
get "scrape/siteandnum/" => "qued_items#scrape_site_and_num"
だからあなたはそれを持っています。このメソッドを使用すると、あらゆる種類のデータを入力でき、「舞台裏」のRubyメソッドがユーザー入力を処理し、ページをリロードせずに画面スクレイピングされたデータを返します。