处理NodeJ中的重定向请求

时间:2016-11-07 20:07:19

标签: node.js request

我正在尝试从网址获取数据:autotrader_url 不幸的是我无法处理重定向。 到目前为止,这是我的代码。

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);    
       });   
    }
});

我缺少什么?

1 个答案:

答案 0 :(得分:0)

followAllRedirects: true选项将遵循从服务器发回的http重定向。它们似乎没有使用http重定向,因为当您在浏览器中访问该页面时,它会加载一个页面,上面写着“我们正在搜索您想要的汽车”,并且该页面使用javascript在浏览器中进行客户端重定向。要遵循这种重定向,您可能需要使用phatomjs之类的内容。

或者使用cheerio(可能)或正则表达式的某种组合,您可以直接从源获取重定向URL,然后在您拥有正确的URL后再自行向该URL发出第二个请求。

<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标头以让他们回复,以便将此添加到您的请求中。< / p>

以下是一个完整的工作示例:

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);
    }

  });
}