サーバー側で次のアクションを実行したい:
1)Webページをスクレイプする
2)そのページのクリックをシミュレートし、新しいページに移動します。
3)新しいページをスクレイプする
4)新しいページでのボタンクリックのシミュレーション
5)jsonまたは何かを介してクライアントにデータを送り返す
Node.jsで使用することを考えています。
しかし、どのモジュールを使用すべきかについて混乱しています
a)ゾンビ
b)Node.io
c)Phantomjs
d)JSDOM
e)その他
Node、ioをインストールしましたが、コマンドプロンプトで実行できません。
PS:私はWindows 2008サーバーで働いています
Zombie.jsとNode.ioはJSDOMで実行されるため、オプションはJSDOM(または同等のラッパー)、ヘッドレスブラウザー(PhantomJS、SlimerJS)、またはCheerioのいずれかを使用します。
あなたの要件を考えると、私はおそらくヘッドレスブラウザのようなもので行くだろう。特に、私は 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();
フル(ヘッドレス)ブラウザーが必要な場合は、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();
})();
リストしたモジュールは次のことを行います。
要件を確認すると、ファントムまたはゾンビを使用できます。