2

Request と Cheerio を使用してhttps://www.freelance.nl/opdrachten/zoekenのデータをスクレイピングしようとしていますが、検索語を投稿する際に問題が発生しています。

サイトを使用しているときに投稿中に検索文字列と選択したカテゴリがどこに送信されるか、ノード アプリケーションからの検索を自動化するために Request でそれらを使用する方法がわかりません。

基本的に、リクエストを使用してさまざまな検索用語を送信できるようにしたいので、返された html から必要なデータを取得できます。

これまでのところ、私はこれを持っています:

request.post('https://www.freelance.nl/opdrachten/zoeken', { form: { key: 'value' } },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body)

        }
    }
);

しかし、開発ツールでフォーム データが保存されている場所がわからないため、「フォーム」オブジェクトで正しい値を送信できません。リクエストペイロードにあると確信していますが、ノードアプリケーションからどうすればそれを取得できますか?

これを行う簡単な方法はありますか?私は完全に時間を無駄にしていますか?

開発ツールのスクリーンショット

4

2 に答える 2

0

目を開けてください ;) 画像の下部にあるRequest Payloadを見てください

projectFilterForm[keywords]
projectFilterForm[category][]
projectFilterForm[province][]

アップデート

var request = require('request');
var querystring = require('querystring');

require('request').debug = true;

var data = querystring.stringify({
    'projectFilterForm[keywords]': 'java'
});

var options = {
    followAllRedirects: true,
    uri: 'https://www.freelance.nl/opdrachten/zoeken',
    method: 'POST',
    headers: {
        'Content-Length': Buffer.byteLength(data),
        'cache-control': 'no-cache',
        'Content-Type': 'multipart/form-data',
        'origin': 'https://www.freelance.nl',
        'referer': 'https://www.freelance.nl/opdrachten/zoeken',
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36'
    }
};

var req = request(options, function (error, response, body) {
    console.log(body);
});

req.write(data);
req.end();

私はすべてを試しました =)) 何もしません... リダイレクト後、デフォルトのページが表示されます。たぶん、彼らはいくつかのセッションベース保護を使用していますか?

これはノードの問題ではありません。クロムの郵便配達員の拡張機能でも運が悪かったので、これをやろうとしました。

于 2015-07-08T12:12:30.017 に答える
0

私はあなたのコードを少し修正しました:

payload = {'projectFilterForm[keywords]':'javascript','projectFilterForm[category][]': '1'}
request.post('https://www.freelance.nl/opdrachten/zoeken', { data:payload },
function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body)
    }
}

);

于 2015-07-08T13:25:53.193 に答える