使用 Node.js 爬行
Posted
技术标签:
【中文标题】使用 Node.js 爬行【英文标题】:Crawling with Node.js 【发布时间】:2011-07-19 02:10:37 【问题描述】:完整的 Node.js 菜鸟,所以不要评判我...
我有一个简单的要求。爬取网站,查找所有产品页面,并保存产品页面中的一些数据。
说的更简单,做的更简单。
查看 Node.js 示例,我找不到类似的东西。
有一个请求刮刀:
request(uri:'http://www.google.com', function (error, response, body)
if (!error && response.statusCode == 200)
var window = jsdom.jsdom(body).createWindow();
jsdom.jQueryify(window, 'path/to/jquery.js', function (window, jquery)
// jQuery is now loaded on the jsdom window created from 'body'
jQuery('.someClass').each(function () /* Your custom logic */ );
);
);
但是我不知道如何在它抓取根页面后调用它自己,或者填充它需要抓取的数组或 url。
然后是http代理方式:
var agent = httpAgent.create('www.google.com', ['finance', 'news', 'images']);
agent.addListener('next', function (err, agent)
var window = jsdom.jsdom(agent.body).createWindow();
jsdom.jQueryify(window, 'path/to/jquery.js', function (window, jquery)
// jQuery is now loaded on the jsdom window created from 'agent.body'
jquery('.someClass').each(function () /* Your Custom Logic */ );
agent.next();
);
);
agent.addListener('stop', function (agent)
sys.puts('the agent has stopped');
);
agent.start();
这需要一个位置数组,但话又说回来,一旦你开始使用一个数组,你就不能向它添加更多位置来浏览所有产品页面。
而且我什至无法让 Apricot 工作,由于某种原因我遇到了错误。
那么,我如何修改上述任何示例(或上面未列出的任何内容)以抓取网站、查找所有产品页面、在其中找到一些数据(jquery.someclass 示例应该可以解决问题)以及将其保存到数据库?
谢谢!
【问题讨论】:
Scrape web pages in real time with Node.js的可能重复 【参考方案1】:就个人而言,我使用 Node IO 来抓取一些网站。 https://github.com/chriso/node.io
有关抓取的更多详细信息可以在wiki 中找到!
【讨论】:
对我来说最好的答案,简单快速 谢谢。我在谷歌上搜索node crawl addon
并通过点击这个问题找到了这个答案。感谢分享。这应该是公认的答案。在过去,我的做法与作者的做法类似,但这太棒了。【参考方案2】:
我在使用Casperjs 爬行和抓取方面取得了相当不错的成功。这是一个建立在Phantomjs 之上的非常好的库。我喜欢它,因为它相当简洁。回调可以作为 foo.then() 执行,这非常容易理解,我什至可以使用 jQuery,因为 Phantomjs 是 webkit 的实现。例如,以下将实例化 Casper 的实例并将存档页面上的所有链接推送到名为“链接”的数组。
var casper = require("casper").create();
var numberOfLinks = 0;
var currentLink = 0;
var links = [];
var buildPage, capture, selectLink, grabContent, writeContent;
casper.start("http://www.yoursitehere.com/page_to/scrape/", function()
numberOfLinks = this.evaluate(function()
return __utils__.findAll('.nav-selector a').length;
);
this.echo(numberOfLinks + " items found");
// cause jquery makes it easier
casper.page.injectJs('/PATH/TO/jquery.js');
);
// Capture links
capture = function()
links = this.evaluate(function()
var link = [];
jQuery('.nav-selector a').each(function()
link.push($(this).attr('href'));
);
return link;
);
this.then(selectLink);
;
然后,您可以使用 node fs(或其他任何您想要的东西,真的)将您的数据推送到 XML、CSV 或您想要的任何东西。在我构建刮板时,example for scraping BBC photos 非常有用。
这是从 10,000 英尺远的地方看到的 casper 可以做什么。它有一个非常强大和广泛的 API。我挖了它,以防你不知道:)。
我的完整抓取示例在这里:https://gist.github.com/imjared/5201405。
【讨论】:
+1 为 Casperjs。您的回答让我尝试了它,在 3 小时内我完成了很多工作 - 很容易上手。以上是关于使用 Node.js 爬行的主要内容,如果未能解决你的问题,请参考以下文章
Node.js详解整理:node.js的优势特点优缺点及适用场景,安装及基本使用