web-dev-qa-db-ja.com

Webページをスクレイプし、ボタンをクリックしてナビゲートする

サーバー側で次のアクションを実行したい:

1)Webページをスクレイプする
2)そのページのクリックをシミュレートし、新しいページに移動します。
3)新しいページをスクレイプする
4)新しいページでのボタンクリックのシミュレーション
5)jsonまたは何かを介してクライアントにデータを送り返す

Node.jsで使用することを考えています。

しかし、どのモジュールを使用すべきかについて混乱しています
a)ゾンビ
b)Node.io
c)Phantomjs
d)JSDOM
e)その他

Node、ioをインストールしましたが、コマンドプロンプトで実行できません。

PS:私はWindows 2008サーバーで働いています

30
user2129794

Zombie.jsとNode.ioはJSDOMで実行されるため、オプションはJSDOM(または同等のラッパー)、ヘッドレスブラウザー(PhantomJS、SlimerJS)、またはCheerioのいずれかを使用します。

  • JSDOMは、Node.jsでDOMとCSSOMを再作成する必要があるため、かなり低速です。
  • PhantomJS/SlimerJSは適切なヘッドレスブラウザーであるため、パフォーマンスは問題なく、非常に信頼性が高くなります。
  • Cheerio はJSDOMの軽量の代替です。 Node.jsでページ全体を再作成するわけではありません(DOMをダウンロードして解析するだけで、javascriptは実行されません)。したがって、ボタン/リンクをクリックすることはできませんが、Webページをスクレイピングするのは非常に高速です。

あなたの要件を考えると、私はおそらくヘッドレスブラウザのようなもので行くだろう。特に、私は CasperJS を選択します。これは、ニースで表現力豊かなAPIを備えているため、高速で信頼性が高い(JSDOMのようにdomまたはcssを解析およびレンダリングする方法について車輪を再発明する必要がないため)し、ボタンやリンクなどの要素とのやり取りは非常に簡単です。

CasperJSのワークフローは、次のようになります。

casper.start();

casper
  .then(function(){
    console.log("Start:");
  })
  .thenOpen("https://www.domain.com/page1")
  .then(function(){
    // scrape something
    this.echo(this.getHTML('h1#foobar'));
  })
  .thenClick("#button1")
  .then(function(){
    // scrape something else
    this.echo(this.getHTML('h2#foobar'));
  })
  .thenClick("#button2")
  thenOpen("http://myserver.com", {
    method: "post",
    data: {
        my: 'data',
    }
  }, function() {
      this.echo("data sent back to the server")
  });

casper.run(); 
43
danielepolencic

短い答え(2019年):操り人形師を使用する

フル(ヘッドレス)ブラウザーが必要な場合は、PhantomJSの代わりに puppeteer を使用してください。リッチな [〜#〜] api [〜#〜 ] ブラウザのクロールとスクレイピングのタスクを自動化します。ページ内でJavaScriptを実行せずにHTMLドキュメントのみを解析したい場合は、 jsdom および cheerio をチェックアウトする必要があります。

説明

jsdom (または cheerio )などのツールを使用すると、HTMLドキュメントを解析して情報を抽出できます。これは高速で、WebサイトにJavaScriptが含まれていない限り機能します。 JavaScriptで構築されたWebサイトから情報を抽出することは非常に難しいか、不可能です。たとえば、jsdomはスクリプトを実行できますが、Node.js環境のサンドボックス内でスクリプトを実行します。これは非常に危険であり、アプリケーションをクラッシュさせる可能性があります。 docs を引用するには:

ただし、これは信頼できないコンテンツを扱う場合にも非常に危険です。

したがって、より複雑なWebサイトを確実にクロールするには、実際のブラウザーが必要です。長年、このタスクの最も一般的なソリューションはPhantomJSでした。しかし、2018年、PhantomJSの開発は 正式に中断 でした。ありがたいことに、2017年4月以降、Google ChromeチームはChromeブラウザをヘッドレスで実行できるようになりました( announcement )。 JavaScriptを完全にサポートする最新のブラウザを使用して、ウェブサイトをクロールできます。

ブラウザを制御するために、ライブラリ puppeteer は、Google開発者によっても管理されており、ノード内で使用するための豊富な [〜#〜] api [〜#〜] を提供します。 .js環境。

コードサンプル

以下の行は、簡単な例を示しています。 Promisesとasync/await構文を使用して、多くのタスクを実行します。まず、ブラウザが起動されます( puppeteer.launch )そしてURLが開かれます page.goto 。その後、 page.evaluate および page.click は、情報を抽出し、ページでアクションを実行するために使用されます。最後に、ブラウザが閉じられます( browser.close )。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://example.com');

  // example: get innerHTML of an element
  const someContent = await page.$eval('#selector', el => el.innerHTML);

  // Use Promise.all to wait for two actions (navigation and click)
  await Promise.all([
    page.waitForNavigation(), // wait for navigation to happen
    page.click('a.some-link'), // click link to cause navigation
  ]);

  // another example, this time using the evaluate function to return innerText of body
  const moreContent = await page.evaluate(() => document.body.innerText);

  // click another button
  await page.click('#button');

  // close brower when we are done
  await browser.close();
})();
3
Thomas Dondorf

リストしたモジュールは次のことを行います。

  • Phantomjs/Zombie-ブラウザーをシミュレートします(ヘッドレス-実際には何も表示されません)。静的または動的なスクレイピングに使用できます。または、HTMLページのテスト。
  • Node.io/jsdom-webscraping:ページからデータを抽出(静的)。

要件を確認すると、ファントムまたはゾンビを使用できます。

2
user568109