web-dev-qa-db-ja.com

AJAXページをどのようにスクレイピングしますか?

AJAXページ。

52
xxxxxxx

概要:

すべての画面スクレイピングでは、最初にリソースを抽出するページを手動で確認する必要があります。 AJAXを扱う場合、通常は単にHTMLだけでなく、もう少し分析する必要があります。

AJAXを扱うとき、これは単にあなたが望む値があなたが要求した最初のHTMLドキュメントにないことを意味しますが、あなたが望む余分な情報をサーバに求めるjavascriptが実行されます。

したがって、通常は単にJavaScriptを分析し、JavaScriptがどのリクエストを行うかを確認し、最初から代わりにこのURLを呼び出すだけです。


例:

これを例に取ります。スクレイピングするページに次のスクリプトがあると仮定します。

<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.myForm.time.value=xmlHttp.responseText;
      }
    }
  xmlHttp.open("GET","time.asp",true);
  xmlHttp.send(null);
  }
</script>

次に、代わりに同じサーバーのtime.aspにHTTPリクエストを行うだけです。 w3schoolsの例


C++による高度なスクレイピング:

複雑な使用方法で、C++を使用している場合は、Firefox JavaScriptエンジン SpiderMonkey を使用してページでJavaScriptを実行することも検討できます。

Javaによる高度なスクレイピング:

複雑な使用方法で、Javaを使用している場合は、Java Rhino

。NETによる高度なスクレイピング:

複雑な使用法の場合、および.Netを使用している場合は、Microsoft.vsaアセンブリの使用も検討できます。最近ICodeCompiler/CodeDOMに置き換えられました。

53
Brian R. Bondy

私の意見では、最も簡単な解決策は Casperjs を使用することです。これは、WebKitヘッドレスブラウザーphantomjsに基づくフレームワークです。

ページ全体がロードされ、Ajax関連のデータを非常に簡単にスクレイピングします。この基本的なチュートリアルを確認して学習することができます PhantomJSとCasperJSによるスクレイピングの自動化

また、Googleの提案キーワードをこすり落とす方法については、このサンプルコードをご覧ください。

/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var Word = casper.cli.get(0);

if (!Word) {
    casper.echo('please provide a Word').exit(1);
}

casper.start('http://www.google.com/', function() {
    this.sendKeys('input[name=q]', Word);
});

casper.waitFor(function() {
  return this.fetchText('.gsq_a table span').indexOf(Word) === 0
}, function() {
  suggestions = this.evaluate(function() {
      var nodes = document.querySelectorAll('.gsq_a table span');
      return [].map.call(nodes, function(node){
          return node.textContent;
      });
  });
});

casper.run(function() {
  this.echo(suggestions.join('\n')).exit();
});
8
mattspain

理解できたら、DOMツリーを調べてみてください。 Selenium は、ページのテストの一部としてこれを行います。また、ボタンをクリックしてリンクをたどる機能もあり、便利な場合があります。

7
sblundy

Ajaxを使用してWebページを、またはJavascriptを使用して一般的なページをスクレイピングする最良の方法は、ブラウザー自体またはヘッドレスブラウザー(GUIのない​​ブラウザー)を使用することです。現在、 phantomjs は、WebKitを使用したよく知られたヘッドレスブラウザです。私が成功して使用した代替手段は、 HtmlUnit (in Javaまたは.NET via [〜#〜] ikvm [〜#〜] 、これはシミュレートされたブラウザです。別の既知の代替手段は、 Selenium

ウェブスクレイピングAjaxおよびJavascriptサイト および 自動ブラウザレスOAuth Twitterの認証 。最初の記事の終わりには、2011年以降にコンパイルしてきた多くの追加リソースがあります。

4
sw.

私は PhearJS が好きですが、それは私がそれを作ったからかもしれません。

つまり、バックグラウンドで実行するサービスであり、HTTP(S)を使用して、必要なメタデータを含め、ページをJSONとしてレンダリングします。

2
TTT

Ajaxページに依存します。画面スクレイピングの最初の部分は、ページの動作を決定することです。ページからすべてのデータを要求するために反復できる変数のようなものはありますか?個人的に私は Web Scraper Plus をスクリーンスクレイピング関連のタスクの多くに使用しました。

サイドノート:使用条件はおそらくこれを行う前に確認したいところです。すべてのサイトを反復処理するサイトによっては、いくつかのフラグが立てられる場合があります。

2
wonderchook

低コストのソリューションとして、 SWExplorerAutomation (SWEA)を試すこともできます。このプログラムは、HTML、DHTML、またはAJAXで開発されたWebアプリケーション用の自動化APIを作成します。

1
Alex

ブライアンR.ボンディの答えは、ソースコードが読みやすいときに役立ちます。 WiresharkやHttpAnalyzerなどのツールを使用してパケットをキャプチャし、「ホスト」フィールドと「GET」フィールドからURLを取得する簡単な方法を好みます。

たとえば、次のようなパケットをキャプチャします。

GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
 HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive

次に、URLは次のとおりです。

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330
1
yxc

Selenium WebDriverは優れたソリューションです。ブラウザーをプログラムし、ブラウザーで行う必要のあることを自動化します。ブラウザ(Chrome、Firefoxなど)は、Seleniumで動作する独自のドライバーを提供します。自動化されたREAL browserとして機能するため、ページ(javascriptおよびAjaxを含む)は、そのブラウザーを使用する人間と同じようにロードされます。

欠点は、処理が遅いということです(その単一ページでスクレイピングを行う前に、すべての画像とスクリプトがロードされるのを待ちたいと思うでしょう)。

1
hekimgil

Ajaxページをスクレイプするための回答として、以前はMITの溶媒とEnvJSにリンクしていました。これらのプロジェクトにはアクセスできなくなっているようです。

まったくの必要性から、私は実際にAjaxページをスクレイピングする別の方法を発明しました。そして、ヘッドレスjavascriptエンジンを見つけてデータを表示しないメソッドを持つfindthecompanyのような厳しいサイトで機能しました。

テクニックは、chrome拡張機能を使用してスクレイピングを実行することです。Chrome拡張機能は、JavaScriptで修正されたDOMへのアクセスを実際に許可するため、Ajaxページ。テクニックは次のとおりです、私は確かにいつかコードをオープンソースにします。chromeエクステンションを作成します(あなたがそれを作成する方法とそのアーキテクチャと機能を知っていると仮定します。サンプルがたくさんあるので練習してください)、

  1. Xpathを使用して、コンテンツスクリプトを使用してDOMにアクセスします。リストまたはテーブル全体を取得するか、xpathを使用して文字列HTMLノードとして変数に動的にレンダリングされたコンテンツを取得します。 (コンテンツスクリプトのみがDOMにアクセスできますが、XMLHTTPを使用してURLにアクセスすることはできません)
  2. コンテンツスクリプトから、メッセージパッシングを使用して、削除されたDOM全体を文字列としてバックグラウンドスクリプトに送信します。 (バックグラウンドスクリプトはURLと通信できますが、DOMに触れることはできません)。メッセージパッシングを使用して、これらを話させます。
  3. さまざまなイベントを使用してWebページをループし、各ストリップされたHTML Nodeコンテンツをバックグラウンドスクリプトに渡すことができます。
  4. 次に、バックグラウンドスクリプトを使用して、Nodejs/pythonを使用して作成された単純な外部サーバー(localhost)に接続します。 HTMLノード全体を文字列としてサーバーに送信するだけで、サーバーはページ番号またはURLを識別するための適切な変数とともに、投稿されたコンテンツをファイルに保存します。
  5. これでAJAXコンテンツ(文字列としてのHTMLノード))をスクレイピングしましたが、これらは部分的なhtmlノードです。お気に入りのXPATHライブラリを使用してこれらをメモリにロードし、またはテキスト。

あなたが理解できない場合はコメントしてください、私はそれをより良く書くことができます。 ( 最初の試み )。また、できるだけ早くサンプルコードをリリースしようとしています。

0