node.js でリダイレクト先 location を取得

2014年5月6日更新 view: 459 view
photoBy: http://upload.wikimedia.org/wikipedia/commons/thu…

node.jsでリダイレクト先を取得

スクレイピングをしていると、自動で他のURLへ飛ばすサイトがよくある。
でもどこにとんでるかわからない。。。
それを解決する方法です。

bad

なぜか、飛び先まで行ってしまい statuscode 200 を返す。。。

var hoge = request.sync({url: 'http://www.careerjet.jp/job/13afe327fb4ea5084960305bb8849863.html'});
console.log(hoge.statusCode);

これでは飛び先を取得できない

正しい方法

スポンサードリンク
var http = require('http');
url = 'http://www.careerjet.jp/job/13afe327fb4ea5084960305bb8849863.html';
var req = http.get(url, function(res) {
    res.setEncoding('utf8');
    res.on('data', function(str) {
        console.log(str);//htmlが入る
        console.log(res.statusCode);//301とか310
        var location = res.headers.location;
        console.log(location);//リダイレクトされる先
    });
});

request メソッドを使うのではなく、 http を使うことで解決。

応用編 複数のurlをいっきに取得した場合

非同期なので、for each などの繰り返しをすると返り値がめちゃくちゃになる。
なので、引数をおくって、それを解析してデータを取得

//スクレイピング
var cheerio = require("cheerio");

var fibrous = require('fibrous');
var request = require('request');
var client = require('cheerio-httpcli');
var http = require('http');
var url =require('url');







fibrous.run(function(){    // fibrous でラップしないといけない
    var target_url = 'http://www.hoge.jp/search/jobs';
    //var req = request.sync({url: target_url});


    client.fetch(target_url, function (err, $, response) {

        var res = {};

        var tmp = new Array();
     // $ = cheerio.load(req.body);

        $('.job').each(function(i){
            tmp[i] = $(this).html();

            if(!(res[i] instanceof Array)) {
                res[i] = {};
                res[i]['name'] = {};
                res[i]['url'] = {};
            }


            res[i]['name'] = $(this).find('a.title_compact:first-child').text();//なまえ





            //urlをリダイレクト探す。
            //どのURLが帰ってきたか判別するため、 hiki(任意の名前で) という変数に i を渡す
            var req = http.get('http://www.hoge.jp' + res[i]['target_url'] + '?hiki=' + i, function(resp) {
                resp.setEncoding('utf8');
                resp.on('data', function(str) {


                    //リダイレクト後のurlが返ってくるので、
                 tmp = url.parse(resp.req.path);//http://www.ridirect.jp

//tmpの中身
//                 protocol: null,
//                    slashes: null,
//                    auth: null,
//                    host: null,
//                    port: null,
//                    hostname: null,
//                    hash: null,
//                    search: '?hiki=16',
//                    query: 'hiki=16',
//                    pathname: '/job/ef6ed2d2b2425adedd2195a16ca847a7.html',
//                    path: '/job/ef6ed2d2b2425adedd2195a16ca847a7.html?hiki=16',
//                    href: '/job/ef6ed2d2b2425adedd2195a16ca847a7.html?hiki=16' }
                    
                 tmp2 = tmp.query.split('=');//hiki=17

                 res[tmp2[1]]['url'] = url.parse(resp.headers.location);// res[17]['url'] = http://www.ridirect.jp

                 //ここで登録処理



                });
            });






        });





    });


});
スポンサードリンク

関連記事

関連カテゴリ

コロ助

web関連の記事や制作系の記事をどんどんまとめていきます。 宜しくお願いします!

ピックアップ

パソコン・ソフトウェア ランキング

7月25日 ( 火 ) にアクセスが多かった記事はこちら!