Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用zombie.js进行网站抓取时出现的问题_Javascript_Facebook_Node.js_Screen Scraping_Zombie.js - Fatal编程技术网

Javascript 使用zombie.js进行网站抓取时出现的问题

Javascript 使用zombie.js进行网站抓取时出现的问题,javascript,facebook,node.js,screen-scraping,zombie.js,Javascript,Facebook,Node.js,Screen Scraping,Zombie.js,我需要做一些网页抓取。在使用了不同的web测试框架后,我认为这看起来最有希望,因为它使用了一组用于HTML解析和DOM操作的库,其中大多数都太慢(Selenium)或太多不符合我的需要(env.js)。但是,在我看来,它甚至不支持以下网页中的基本基于事件的Javascript代码: <html> <head> <title>test</title> <script type="text/javascript">

我需要做一些网页抓取。在使用了不同的web测试框架后,我认为这看起来最有希望,因为它使用了一组用于HTML解析和DOM操作的库,其中大多数都太慢(Selenium)或太多不符合我的需要(env.js)。但是,在我看来,它甚至不支持以下网页中的基本基于事件的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>
它适用于这个特定的测试页面。不过,我的问题更一般:我希望能够抓取更复杂、基于AJAX的网站,比如Facebook上的好友列表(类似的)。使用zombie登录到站点没有问题,但是像这些列表这样的内容似乎完全是使用AJAX动态加载的,我不知道如何触发启动加载的事件处理程序

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

  • 是否有人已经实现了一个类似的复杂刮板,而没有使用像Selenium这样的浏览器远程控制解决方案
  • 关于基于Javascript的复杂页面的加载过程,是否有一些参考资料
  • 有人能提供关于如何调试真正的浏览器的建议,看看我可能需要执行什么来触发Facebook事件处理程序吗
  • 关于这个话题还有其他想法吗

同样,请不要告诉我涉及控制像Selenium这样的真正浏览器的解决方案,因为我知道这些。不过,我们欢迎的建议是,可以使用Ruby脚本语言访问WebKit等真正的内存呈现程序,但最好能够设置Cookie,并且最好能够加载原始HTML,而不是触发真正的HTTP请求。

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

大多数站点,即使是AJAX含量很高的站点,都可以在不执行一行Javascript代码的情况下进行抓取。事实上,这通常比试图找出一个站点的Javascript代码要容易得多,因为Javascript代码通常是模糊的、缩小的,并且很难调试。如果您对HTTP有深入的了解,您就会理解为什么:(几乎)与服务器的所有交互都被编码为HTTP请求,因此,无论它们是由Javascript启动的,还是用户单击链接的,或者是机器人程序中的自定义代码,对服务器来说都没有区别。(我之所以这么说,几乎是因为当Flash或小程序介入时,不知道哪些数据在哪里传播;它们可以是特定于应用程序的。但Javascript中的任何操作都将通过HTTP进行。)

也就是说,在任何网站上使用定制软件都可以模仿用户。首先,您必须能够看到发送到服务器的原始HTTP请求。您可以使用代理服务器记录真实浏览器向目标网站发出的请求。你可以使用很多很多工具来实现这一点:或者很方便,大多数专用工具都内置了一个基本的代理,Firefox和Chrome的扩展也有类似的工具来查看AJAX请求……你明白了

一旦您可以看到由于网站上的特定操作而发出的HTTP请求,就很容易编写程序来模拟这些请求;只需向服务器发送相同的请求,它就会像对待执行特定操作的浏览器一样对待您的程序

不同语言有不同的库,提供不同的功能。对于ruby,我见过很多人使用它

如果数据提取是您唯一的目标,那么通过这种方式模拟HTTP请求,您几乎总能获得所需的内容。不需要Javascript


注意-既然你提到了Facebook,我应该提到,特别是清除Facebook可能非常困难(尽管并非不可能),因为Facebook有检测自动访问的措施(它们使用的不仅仅是验证码);如果发现可疑活动,他们将禁用该帐户。毕竟,这与他们的(第3.2节)背道而驰。

您是在寻找javascript测试框架还是web数据提取工具?如果你只是在寻找一个screescraping工具,那么你可以在不执行Javascript的情况下对大多数网站进行scrape,即使是那些使用AJAX的网站也是如此。您是对的,通常不执行Js就可以做到这一点,例如手动发出REST请求。在Facebook的例子中,仅使用HTTP和HTML解析就可以删除该网站的移动版本。但是我对一个理解Javascript并且不需要真正的浏览器实例的通用解决方案感兴趣。正如env.Js和zombie.Js所显示的,这似乎是可能的,但这似乎是一个技巧问题。感谢您为这个问题制定了这个复杂的答案。我已经使用Firebug和Fiddler2来监控进出Web服务器的HTTP流量,但是如果像许多社交网站那样使用难以逆转的通信主题,这并不是很有用。但即使可以使用低级界面与web服务器对话并提取信息,也需要不断调整刮板,这可能非常耗时。Env.js(我几乎可以随心所欲地工作)表明,实际上可以通过编程方式模拟真实的浏览器;他们希望你使用他们的API,这样他们可以更好地控制你的程序访问,从而更好地保护用户的隐私。尽管如此,使用Selenium之类的工具模拟冲浪用户似乎没有任何问题(除了速度慢),除了广泛使用动态内容,我没有遇到任何障碍。即使OAuth完全不受自动访问的保护,也可以进行身份验证
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());

    });
  });

});