0

レコードをグリッドページごとに表示する Web ページ (Mechanize を使用) をスクリーンスクレイピングしようとしています。最初のページに表示された値を読み取ることができますが、次のページに移動して適切な値を読み取る必要があります。

<tr>
    <td><span>1</span></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$2')">2</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$3')" >3</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$4')" >4</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$5')" >5</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$6')">6</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$7')" >7</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$8')">8</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$9')" >9</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$10')" >10</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$11')">...</a></td>
</tr>

私はすべてのリンクを通過することができますが、これを試してみると:-

links = (row/"a")
links.each do |link|
    agent.click link.attributes['href']   # This fails 
    agent.click link   # This also fails
end

その理由は、agent.click が URL を引数として想定しているためです。

ページごとに表示されているすべての値を読み取る方法はありますか? そうでない場合、href が URL ではなくポストバックである場合、どうすればそのようなクリック アクションを実行できますか??

4

4 に答える 4

5

Mechanize は JavaScript を処理できないため、基本的に次の 2 つのオプションがあります。

  • Scraytと firewatir を使用します。これは、ブラウザーをスクリプト化する方法です (したがって、Firefox が JavaScript 部分を処理します)。
  • ベース URL を手動で確認し、ページ番号を動的に追加する

何かのようなもの:

base_url = 'http://example.com/gvw_offcies&page='
links.each do |link|
  page_number = ... #get the page number from link
  agent.get base_url+page_number
end
于 2009-03-21T18:56:08.163 に答える
1

上記の解決策はすべて、過去にかなりの時間 (特に Celerity で) 試しましたが、私の結論は、それらはすべて恐ろしく、同じ HtmlUnit エンジンに基づいているため、人生を非常に困難にする重大な欠点があるということです。 Javascriptの扱い。

Celerity はスクリーン スクレイピング ツールではなく、Windows Management が欠けており、Javascript の処理がまったく得意ではない HTMLUNIT エンジンに基づいています。ただし、最小レベルから中レベルの Javascript および AJAX リクエストを使用するサイトでは高速に動作します。Javaが苦手な方にも安心なrubyベースです。

あなたの最善の策は、Selenium WebDriver API を使用することです。これには、Linux サーバーに X ディスプレイが必要であり、HtmlUnit よりも低速ですが、派生したものを使用したり、HtmlUnit をラップしたりする際に発生する多くの問題に悩まされることはありません。HtmlUnit を使用するオプションがありますが、速度のために精度と一貫性を犠牲にします。HtmlUnit は、スクレイピングがはるかに高速です。

ただし、所有していない他のサイトをスクレイピングすると、通常は IP 禁止が保証されるため、速度は常に良いことではありません.

私の個人的なアドバイスは、HtmlUnit エンジンを使用することは避け、選択したブラウザーを直接リモート コントロールする Selenium を使用して、最大の精度と信頼性を実現することです。

于 2010-09-23T19:36:41.817 に答える
0

webscarabのようなものを使用して、Javascriptが行うPOSTリクエストが実際にどこに向かっているのかを簡単に確認します。特にAJAXのものについては、とにかくそれらは単なるHTTPリクエストです。
起動してFirefoxでプロキシとして設定するだけです。ほとんどの場合、ある種のパターンを確認して、それらのURLを直接スクレイプすることができます

于 2009-12-12T11:10:08.623 に答える
0

Jruby で Celerity を使用してみて、ページを HTML 解析ライブラリに渡すことができます。Celerity は、Watir に準拠した API であると想定されており、HtmlUnit のラッパーです。私はデータ収集に mechanize を使用していましたが、JS で生成されたいくつかのサイトではこれに切り替える必要がありました。

http://celerity.rubyforge.org/

于 2010-01-20T22:03:48.777 に答える