4

Node.js パッケージの request と jsdom を使用して Web ページをスクレイピングしようとしていますが、フォームを送信して応答を取得する方法を知りたいです。これが jsdom または別のモジュールで可能かどうかはわかりませんが、リクエストが Cookie をサポートしていることは知っています。

次のコードは、jsdom を (リクエストと jQuery と共に) 使用して Web ページ (この場合はウィキペディアのホームページ) を取得および解析する方法を示しています。(このコードは、このチュートリアルhttp://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejsの jquery-request.js コードから適用されていることに注意してください)

var request = require('request'),
    jsdom = require('jsdom'),

    url = 'http://www.wikipedia.org';

request({ uri:url }, function (error, response, body) {
  if (error && response.statusCode !== 200) {
    console.log('Error when contacting '+url);
  }

  jsdom.env({
    html: body,
    scripts: [
      'http://code.jquery.com/jquery-1.5.min.js'
    ]
  }, function (err, window) {
    var $ = window.jQuery,
        // jQuery is now loaded on the jsdom window created from 'agent.body'
        $searchform = $('#searchform'); //search form jQuery object

    $('#searchInput').val('Wood');

    console.log('form HTML is ' + $searchform.html(),
      'search value is ' + $('#searchInput').val()

    //how I'd like to submit the search form
    $('#searchform .searchButton').click();
    );
  });
});

上記のコードは、ウィキペディアの検索フォームから HTML を出力し、次に searchInput フィールドに設定した値である "Wood" を出力します。もちろん、ここでは click() メソッドは実際には何もしません。jQuery はブラウザーで動作していないからです。jsdom が何らかの種類のイベント処理をサポートしているかどうかさえわかりません。

この方法で、または同様の非jQueryの方法でWebページとやり取りするのに役立つモジュールはありますか? これはjsdomで行うことができますか?

前もって感謝します!

4

2 に答える 2

4

他の回答のように POST リクエストを自分で処理したくない場合は、ブラウザーでより多くのことをサポートする jsdom の代替手段を使用できます。

http://www.phantomjs.org/

于 2012-01-10T19:54:55.680 に答える
0

Webページの完全にインタラクティブなクライアント側ビューを取得できるnodejsライブラリには慣れていませんが、あまり心配することなくフォーム送信の結果を取得できます.

HTML フォームは基本的に、HTTP 要求を特定の URL (タグのaction属性として見つけることができます) に送信する方法にすぎません。formDOM にアクセスすると、これらの値を取り出して、指定された URL に対する独自のリクエストを作成できます。

ウィキペディアのホームページへのリクエストからのコールバックとして、英語で「keyboard cat」を検索すると、次のような結果が得られます。

var $ = window.jQuery;

var search_term = "keyboard cat";
var search_term_safe = encodeURIComponent(search_term).replace("%20", "+");

var lang = "en";
var lang_safe = encodeURIComponent(lang).replace("%20", "+");

var search_submit_url = $("#searchform").attr("action");
var search_input_name = $("#searchInput").attr("name");
var search_language_name = $("#language").attr("name");

var search_string = search_input_name + "=" + search_term_safe + "&" + search_language_name + "=" + lang_safe;

// Note the wikipedia specific hack by prepending "http:".
var full_search_uri = "http:" + search_submit_url + "?" + search_string;

request({ uri: full_search_uri }, function(error, response) {
    if (error && response.statusCode != 200) {
        console.log("Got an error from the search page: " + error);
    } else {
        // Do some stuff with the response page here.
    }
});

基本的に重要なことは次のとおりです。

  1. 「検索を送信する」とは、タグの属性で指定された URL にHTTPGETまたはリクエストを送信することを意味します。POSTactionform
  2. nameフォームの各タグの属性を使用して、フォームの送信に使用する文字列を作成し、input実際に送信する値を次の形式で組み合わせます。name1=value1&name2=value2
  3. リクエストの場合GETは、その文字列をクエリ文字列として URL に追加するだけです ( URL?query-string)
  4. リクエストの場合POST、その文字列をリクエストの本文として投稿します。
  5. フォームの送信に使用される文字列はエスケープする必要があり、スペースは として表す必要があることに注意してください+
于 2012-01-10T15:35:19.873 に答える