利用Crowbar抓取网页异步加载的内容 [Python俱乐部]

利用Crowbar抓取网页异步加载的内容

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

Crowbar 是 MIT 的 SIMILE 小组编写的一个工具,它利用 Firefox 的 Gecko 引擎执行网页上的脚本,然后将脚本执行过一段时间后的 DOM 重新序列化为 HTML 代码进行输出。

Crowbar 这个词本身的意思是撬棍,用来拔钉子的一种工具,用在这里也是很有寓意,用 Crowbar 来读取本来很难直接获取的异步输出的内容就像用撬棒拔钉子那样容易。不过遗憾的是 Crowbar 貌似在几年前就停止了开发,还没有正式 Release,也许作者已经发现了完成这一任务的更好的手段,但我目前还没有找到。

环境需求

XULRunner (v1.8.1 +) XUL 是 Mozilla 使用 XML 来描述用户界面的一种技术,Firefox 正是基于这种技术进行构建的。利用 XULRunner 这个工具,我们很容易地执行自己编写的类似 Firefox 那样的用户界面程序。Crowbar 正是基于这个环境运行的。要配置 XULRunner,可以参考 Mozilla 的这篇 XULRunner 入门,按着上面的指导应该可以轻松地把 Hello World 程序跑通。 获取 Crowbar

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

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

或者可以在这里下载我 修改过的版本。 运行 Crowbar

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

c:\> %XULRUNNER_HOME%\xulrunner.exe –install-app %CROWBAR%\xulapp c:\> cd %CROWBAR%\xulapp c:\> %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 encode 的目标网址,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 编码输出最终结果了。

参考资料

利用Crowbar抓取网页异步加载的内容 [Python俱乐部]的更多相关文章

  1. Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页

    欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...

  2. 简易数据分析 10 | Web Scraper 翻页——抓取「滚动加载」类型网页

    这是简易数据分析系列的第 10 篇文章. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『刷』字,因为看动态的时候,当把内容拉到屏 ...

  3. 网页异步加载之AJAX理解

    AJAX AJAX介绍 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术 AJAX ...

  4. python+selenium+PhantomJS爬取网页动态加载内容

    一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览 ...

  5. 利用selenium抓取网页的ajax请求

    部门需要一个自动化脚本,完成web端界面功能的冒烟,并且需要抓取加载页面时的ajax请求,从接口层面判断请求是否成功.查阅了很多资料都没有人有过相关问题的处理经验,在处理过程中也踩了很多坑,所以如果你 ...

  6. 利用page_source抓取网页中的URL,进行链接测试

    selenium的page_source方法可以获取到页面源码,下面就把它应用到链接测试中. # coding:utf-8 __author__ = 'helen' import re,request ...

  7. java使用htmlunit工具抓取js中加载的数据

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度 ...

  8. 利用jsoup抓取网页图片

    jsoup简介 jsoup is a Java library for working with real-world HTML. It provides a very convenient API ...

  9. htmlunit爬取js异步加载后的页面

    直接上代码: 一. index.html 调用后台请求获取content中的内容. <html> <head> <script type="text/javas ...

随机推荐

  1. Windows上部署Redis

    http://www.cnblogs.com/gaobing/p/5026136.html

  2. day7_python学习笔记_chapter9_文件

    1. open(), file(), 作用完全相同 2. 语法: file_object = open(file_name, access_mode='r', buffering='-1') acce ...

  3. (4)事件处理——(1)事件处理(Handling Events)

    JavaScript has several built-in ways of reacting to user interaction and other events. To make a pag ...

  4. firebug如何使用

    1.怎么安装firebug: a.打开火狐浏览器--------b.点击火狐浏览器的右上角这个小图标-------c.点击<获取附件组件>,在右上角的搜索框()内,输入firebug,点击 ...

  5. 解决全站ie6下PNG图片不透明问题只要几行代码

    解决全站ie6下PNG图片不透明问题只要复制下面这几行代码粘贴在你的文档最底部,需要用到的包DD_belatedPNG_0.0.8a.js自己网上下载吧 代码走起 /*在文档底部加入以下代码*/ &l ...

  6. bzoj 1088: [SCOI2005]扫雷Mine

    题目链接 1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2525  Solved: 1495[Submi ...

  7. Django一对多,多对多操作

    简要说明 Django里面的数据库操作O2O&M2M,一般归属于models管理 使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的 ...

  8. SQL Server 内存不足引起的并发症

    第一:cpu 1.内存不足就会有频繁的页面调入调出.这个过程是要有cpu的参与的.所以这个要影响cpu! 2.内存不足可能会引有用起执行计划被清除.当起次要执行时.这个就要重编译一次!

  9. Java中synchronized注意点

    之前一直以为 synchronized 加在方法前面就只有一个线程能访问了,项目中碰到一个问题,一个类的不同对象,同时访问加了 synchronized的方法 同样是可以访问的,那是因为 synchr ...

  10. Finding the Longest Palindromic Substring in Linear Time

    Finding the Longest Palindromic Substring in Linear Time Finding the Longest Palindromic Substring i ...