c httpclient抓取网页(Web信息提取、数据挖掘、Crowbar的运行方法以及解析执行方法)

优采云 发布时间: 2021-12-19 19:13

  c httpclient抓取网页(Web信息提取、数据挖掘、Crowbar的运行方法以及解析执行方法)

  在网页信息抽取和数据挖掘的过程中,一个关键的步骤是获取网页的源代码。但是,由于种种原因,网页上我们感兴趣的内容很有可能是在HTML文档加载或使用AJAX异步读取后,通过客户端JavaScript输出的。这样我们就可以直接使用POCO或者HttpClient等库了。这些内容不可用于下载文档。当然,你也可以选择自己来实现对JS代码的分析和执行,但是借助浏览器来完成这些脚本的执行无疑要简单得多,也更可行。

  Crowbar 是麻省理工学院 SIMILE 团队编写的工具。它使用Firefox的Gecko引擎在网页上执行脚本,然后在脚本执行一段时间后将DOM重新序列化成HTML代码输出。

  Crowbar这个词本身的意思是撬棍,一种用来拔钉子的工具。用在这里也很有意义。使用Crowbar读取难以直接获取的异步输出内容就像用Crowbar拔钉子一样。简单。遗憾的是,Crowbar 似乎在几年前就停止了开发,并没有正式的 Release。也许作者已经找到了更好的方法来完成这个任务,但我还没有找到。

  环保要求

  XULRunner (v1.8.1 +) XUL 是 Mozilla 使用 XML 来描述用户界面的技术,Firefox 就是基于该技术构建的。有了XULRunner工具,我们就可以轻松的执行我们自己编写的类似于Firefox的用户界面程序。Crowbar就是基于这个环境。配置 XULRunner 可以参考 Mozilla 对 XULRunner 的介绍。根据以上说明,您应该可以轻松运行 Hello World 程序。获取撬棍

  Crowbar 没有正式发布的版本。官方下载只给出了Subversion库的地址:

   http://simile.mit.edu/repository/crowbar/trunk/

  或者你可以在这里下载我的修改版本。运行撬棍

  官方文档分别描述了Windows/Linux/MacOSX下的操作方法。这里我简单介绍一下Windows下的方法。运行 cmd.exe 并输入以下命令:Bash

  c:\> %XULRUNNER_HOME%\xulrunner.exe --install-app %CROWBAR%\xulappc:\> cd %CROWBAR%\xulappc:\> %XULRUNNER_HOME%\xulrunner.exe application.ini

  其中,%XULRUNNER_HOME%为XULRunner的安装目录,%CROWBAR%为Crowbar的文件目录。如果成功,将弹出一个标题为“Crowbar”的窗口。

  当 Crowbar 运行时,这个小窗口会显示当前正在读取或已读取的最后一个网页地址。其最终输出作为基于 REST 的 Web 服务提供。程序默认会*敏*感*词*本地10000端口,当用户打开任意浏览器指向127.0.0.1:10000时,浏览器可以调用Crowbar查看结果。当然,我们最终并不想在浏览器中得到结果。当我们使用HttpClient等库进行网页抓取时,只需要将目标地址设置为类似如下即可。

   http://127.0.0.1:10000/?url=http://simile.mit.edu/&delay=1000

  其中url为URL编码后的目标URL,delay指定DOM加载后网页内容输出的时间。

  Crowbar 还提供了几种不同的爬行模式。官方文档似乎不完整。如果你有兴趣,你需要检查源代码。当然,目前使用Crowbar的方法只能完成一些简单的应用,我还没有测试过*敏*感*词*网络爬虫的性能。修复中文乱码问题

  使用Crowbar读取中文网页内容时,会出现乱码,因为Crowbar没有处理过非英文字符集。只需修改其部分源代码即可解决乱码问题。

  打开文件%CROWBAR%\xulapp\chrome\crowbar\content\crowbar.js,找到第223行,将整个try代码块的内容改成如下:

  try {

var charset = "UTF-8"; // Can be any character encoding name that Mozilla supports

var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"]

.createInstance(Components.interfaces.nsIConverterOutputStream);

os.init(outstream, charset, 0, 0x0000);

os.writeString(response);

os.close();

instream.close();

outstream.close();

}

  这样,最终的结果就可以用UTF-8编码输出了。

  参考

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线