我想在服务器端执行以下操作:
1)抓取网页
2)模拟点击该页面,然后导航到新页面。
3)刮新页面
4)模拟一些按钮点击新页面
5)通过json或其他方式将数据发送回客户端
我正在考虑将它与 Node.js 一起使用。
但是我对我应该使用哪个模块感到困惑
a) Zombie
b) Node.io
c) Phantomjs
d) JSDOM
e) 其他任何东西
我已经安装了 node,io 但无法通过命令提示符运行它。
PS:我在windows 2008服务器上工作
我想在服务器端执行以下操作:
1)抓取网页
2)模拟点击该页面,然后导航到新页面。
3)刮新页面
4)模拟一些按钮点击新页面
5)通过json或其他方式将数据发送回客户端
我正在考虑将它与 Node.js 一起使用。
但是我对我应该使用哪个模块感到困惑
a) Zombie
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();
如果您需要一个完整的(无头)浏览器,请使用puppeteer而不是 PhantomJS,因为它提供了具有丰富API的最新 Chromium 浏览器,可以自动执行任何浏览器抓取和抓取任务。如果您只想解析 HTML 文档(而不在页面内执行 JavaScript),您应该查看jsdom和Cheerio。
像jsdom(或cheerio)这样的工具允许它通过解析从 HTML 文档中提取信息。只要网站不包含 JavaScript,这速度很快并且效果很好。从基于 JavaScript 的网站中提取信息将非常困难,甚至是不可能的。例如,jsdom 能够执行脚本,但在您的 Node.js 环境中的沙箱中运行它们,这可能非常危险并且可能使您的应用程序崩溃。引用文档:
但是,在处理不受信任的内容时,这也是非常危险的。
因此,要可靠地抓取更复杂的网站,您需要一个实际的浏览器。多年来,这个任务最流行的解决方案是PhantomJS。但在 2018 年,PhantomJS 的开发正式暂停。值得庆幸的是,自 2017 年 4 月以来,Google Chrome 团队使无头运行 Chrome 浏览器成为可能(公告)。这使得可以使用完全支持 JavaScript 的最新浏览器来抓取网站。
为了控制浏览器,同样由 Google 开发人员维护的库puppeteer提供了丰富的API供在 Node.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();
})();
您列出的模块执行以下操作:
查看您的要求,您可以使用幻影或僵尸。