与使用zombie.js网站抓取问题

我需要做一些networking抓取。 在玩过不同的Webtesting框架之后,其中大部分的地方要么太慢(Selenium),要么我的需求太多(env.js),我决定zombie.js看起来最有前途,因为它使用一套可靠的库HTMLparsing和DOM操作。 然而,在我看来,它甚至不支持基本的基于事件的Javascript代码,如下面的网页:

<html> <head> <title>test</title> <script type="text/javascript"> console.log("test script executing..."); console.log("registering callback for event DOMContentLoaded on " + document); document.addEventListener('DOMContentLoaded', function(){ console.log("DOMContentLoaded triggered"); }, false); function loaded() { console.log("onload triggered"); } </script> </head> <body onload="loaded();"> <h1>Test</h1> </body> </html> 

然后我决定手动触发这些事件:

 zombie = require("zombie"); zombie.visit("http://localhost:4567/", { debug: true }, function (err, browser, status) { doc = browser.document; console.log("firing DOMContentLoaded on " + doc); browser.fire("DOMContentLoaded", doc, function (err, browser, status) { body = browser.querySelector("body"); console.log("firing load on " + body); browser.fire("load", body, function (err, browser, status) { console.log(browser.html()); }); }); }); 

这适用于这个特定的testing页面。 我的问题是一个更普遍的问题,但是:我希望能够在Facebook上刮掉更复杂的基于AJAX的网站,比如http://www.facebook.com/profile.php?id=100000028174850&sk =朋友&v =朋友 )。 使用僵尸login到网站是没有问题的,但是像这些列表的内容似乎是完全使用AJAX加载的,我不知道如何触发启动加载的事件处理程序。

我有几个关于这个问题的问题:

  • 有人已经实施了一个类似的复杂刮板,而不使用像Selenium这样的浏览器远程控制解决scheme吗?
  • 有一个关于一个复杂的JavaScript页面的加载过程的一些参考?
  • 有人可以提供关于如何debugging一个真正的浏览器,看看我可能需要执行触发Facebook事件处理程序的build议吗?
  • 有关这个主题的任何其他想法?

再次,请不要指向我涉及控制像Selenium这样的真正的浏览器的解决scheme,因为我知道这些。 不过,欢迎提供一些真正的内存中渲染器,比如WebKit,可以从Ruby脚本语言中访问,但最好能够设置cookie,并且最好还能加载原始的HTML,而不是触发真正的HTTP请求。

为了提取数据,运行“无头浏览器”并手动触发javascript事件不会是最简单的事情。 虽然并非不可能,但有更简单的方法来做到这一点。

大多数网站,甚至是AJAX网站,都可以在不执行一行Javascript代码的情况下被抓取。 事实上, 这通常比试图找出一个网站的Javascript代码要容易得多 ,而这个代码经常被混淆,缩小和难以debugging。 如果你对HTTP有一个很好的理解,你就会明白为什么:(几乎)与服务器的所有交互都被编码为HTTP请求,所以不pipe它们是由Javascript发起的,还是用户点击一个链接,或者是一个bot程序中的自定义代码,这与服务器没有任何区别。 (我之所以这么说,几乎是因为当Flash或者applet涉及到的时候,并不知道数据在哪里飞行;它们可能是特定于应用程序的,但是Javascript中的任何事情都将通过HTTP进行。

这就是说,可以在使用定制软件的任何网站上模仿用户。 首先,您必须能够看到发送到服务器的原始HTTP请求。 您可以使用代理服务器来logging真实浏览器向目标网站发出的请求。 有许多工具可以用于此目的: Charles或Fiddler都很方便,大部分专用的屏幕抓取工具都内置了一个基本代理,Firefox和Chrome的Firebug扩展具有类似的查看AJAX请求的工具。得到的想法。

一旦你可以看到由于网站上的特定操作而产生的HTTP请求,很容易编写一个程序来模仿这些请求; 只是发送相同的请求到服务器,它会像处理特定操作的浏览器一样对待你的程序。

有不同的语言库提供不同的function。 对于ruby来说,我看到很多人使用ruby机械化 。

如果数据提取是你唯一的目标,那么你几乎总能通过这种方式来模仿HTTP请求来获得你所需要的。 没有Javascript要求。

注意 – 自从你提到Facebook以来,我应该提到,特别是Facebook的刮脸可能会非常困难(虽然不是不可能),因为Facebook已经采取措施检测自动访问(他们不仅仅使用validation码)。 如果他们看到可疑活动,他们将会禁用该帐户。 毕竟,这是违反他们的服务条款 (第3.2节)。