2016-11-07 8 views
0

URLからデータを取得しようとしています。autotrader_url 残念ながらリダイレクトを処理できません。 ここまでは私のコードです。NodeJsのリダイレクトリクエストの処理

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

request({followAllRedirects: true,url:"http://www.autotrader.com/cars-for-sale/showcase.xhtml?zip=94536&endYear=2017&Log=0&modelCode1=LEGACY&sortBy=derivedpriceDESC&startYear=1981&makeCode1=SUB&numRecords=25&searchRadius=25&mmt=%5BSUB%5BLEGACY%5B%5D%5D%5B%5D%5D&makeCodes=SUB"}, 
function (error, response, html) { 
    console.log(response) 
    if (!error && response.statusCode == 200) { 
    console.log("yo"); 
    var $ = cheerio.load(html); 
    console.log($("title").text()); 
    $('div.listing-title h2').each(function(i, element){ 
     var a = $(this);  
     console.log(a.innerHTML);  
     }); 
    } 
}); 

何が欠けていますか?

答えて

0

followAllRedirects: trueオプションは、サーバーから送信されたhttpリダイレクトに従います。 httpリダイレクトを使用していないように見えるのは、ブラウザでそのページにアクセスしたときに、「私たちはあなたが望む車を探しています」というページを読み込み、そのページがクライアント側でjavascript 。そのようなリダイレクトに従うには、おそらくphatomjsのようなものを使用する必要があります。

cheerio(多分)や正規表現の組み合わせを使用すると、ソースから直接リダイレクトURLを取得し、適切なURLを取得すれば、自分自身で2回目のリクエストを行うことができます。

<script type="text/javascript"> 
    $(function() { 
     atc.create(atc.showcaseRedirect, { 
      destinationUrl: '/cars-for-sale/Subaru/Legacy/Fremont+CA-94536?endYear=2017&firstRecord=0&makeCode1=SUB&mmt=%5BSUB%5BLEGACY%5B%5D%5D%5B%5D%5D&modelCode1=LEGACY&searchRadius=25&showcaseOwnerId=68619541&startYear=1981&Log=0', 
      queryString: '', 
      .... 
     }).init(); 
    }); 
</script> 

destinationUrlを取得するだけです。今言われていることで、これはあなたが前進する前にあなたが間違いなくそれを調べるべきであるために、彼らがあなたの使用条件を破っていないことを前提としています。

最後にバグがある場合、または人々が掻爬するのを防止しようとしている場合にはUser-Agentヘッダーを設定してリクエストに追加する必要があるかどうかはわかりません。ここで

はフル実施例である:

var request = require('request'); 
var cheerio = require('cheerio'); 
var firstUrl = "http://www.autotrader.com/cars-for-sale/showcase.xhtml?zip=94536&endYear=2017&Log=0&modelCode1=LEGACY&sortBy=derivedpriceDESC&startYear=1981&makeCode1=SUB&numRecords=25&searchRadius=25&mmt=%5BSUB%5BLEGACY%5B%5D%5D%5B%5D%5D&makeCodes=SUB"; 

makeRequest(firstUrl, function(err, html) { 
    if(err) { 
    return console.log('There was a problem'); 
    } 
    // get "redirect" url from page source 
    var re = new RegExp("destinationUrl\:[^\,\}]*"); 
    var redirectUrl = 'http://www.autotrader.com' + html.match(re)[0].replace('destinationUrl: ', '').replace('\'', ''); 
    console.log('redirectUrl', redirectUrl); 
    // make the second request and process the markup with cheerio 
    makeRequest(redirectUrl, processFinalMarkup); 
}); 

function processFinalMarkup(err, html) { 
    var $ = cheerio.load(html); 
    console.log($("title").text()); 
    $('div.listing-title h2').each(function(i, element){ 
    var a = $(this);  
    console.log(a.innerHTML);  
    });  
} 

function makeRequest(url, callback) { 
    request({ 
    // Their page requires a User-Agent to be set. 
    headers: { 
     'User-Agent': 'express' 
    }, 
    followAllRedirects: true, 
    url: url 
    }, 
    function (error, response, html) { 
     console.log(response.headers, response.statusCode); 
    if (!error && response.statusCode == 200) { 
     console.log("yo"); 
     callback(null, html); 
    } 

    }); 
} 
関連する問題