0

私のスクレーパーアプリは、クエリ文字列が添付された 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 が要求しているコンテンツをスクレイパーに提供したくないのはなぜでしょうか?

4

1 に答える 1

0

あなたの例の詳細をあまり調べずに、http://phantomjs.org/のようなものを使用して Vimeo サイトの JavaScript を解析する必要があると思います。Phantom.js は、通常どおり Cheerio メソッドを適用できるオブジェクトを返します。

于 2013-12-21T19:37:30.683 に答える