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