私のスクレーパーアプリは、クエリ文字列が添付された Vimeo URL を検索しています。
'http://vimeo.com/search?q=angularjs'
request()
その URL を Chrome に読み込むと、スクレイパーからその URLに表示されない多くの要素が表示されます。Chrome とスクレイパーの両方で読み込める HTML は、ナビゲーション バーとフッターにある HTML のような静的要素のようです。クエリ文字列を処理する Vimeo によって生成される要素にアクセスしようとするとsearch?q=angularjs
、スクレーパーが Chrome に表示されるビデオ ギャラリー グリッドにアクセスできません。これまでの私のスクレーパーは次のとおりです。
var request = require('request'),
cheerio = require('cheerio'),
searchURL = 'http://vimeo.com/search?q=angularjs';
request(searchURL, function(err, resp, body){
if(err)
throw err;
$ = cheerio.load(body);
console.log($('#site_header .join a').text());
console.log($('#page_header h1').text());
$('#browse_content .browse_videos li a').each(function(){
console.log(this.attr('href'));
});
});
$
Cheerio で本体をロードした後、実行します
console.log($('#site_header .join a').text());
Join
コンソールにログを記録します。それはうまくいきます。偉大な。でももしそうなら
console.log($('#page_header h1').text());
コンソールに記録されるのはPlease Try Again
、クエリを実行できなかったことを意味すると思います。そして、Chrome のページ ソースにその HTML が表示されると、次のように表示されます。
<header id="page_header">
<h1>Search videos for <mark class="txt_normal">angularjs</mark></h1>
</header>
そして、確かに私は走った
console.log($('html').html());
browse_content
ビデオサムネイルギャラリーグリッドを含むdivが欠落しているHTMLページを吐き出します。これが、次のコードが何も返さない理由です。
$('#browse_content .browse_videos li a').each(function(){
console.log(this.attr('href'));
});
では、Vimeo が要求しているコンテンツをスクレイパーに提供したくないのはなぜでしょうか?