利用Crowbar抓取网页异步加载的内容 [Python俱乐部]
利用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 Documentation http://simile.mit.edu/wiki/Crowbar Writing textual data https://developer.mozilla.org/en/writing_textual_data
利用Crowbar抓取网页异步加载的内容 [Python俱乐部]的更多相关文章
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- 简易数据分析 10 | Web Scraper 翻页——抓取「滚动加载」类型网页
这是简易数据分析系列的第 10 篇文章. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『刷』字,因为看动态的时候,当把内容拉到屏 ...
- 网页异步加载之AJAX理解
AJAX AJAX介绍 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术 AJAX ...
- python+selenium+PhantomJS爬取网页动态加载内容
一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览 ...
- 利用selenium抓取网页的ajax请求
部门需要一个自动化脚本,完成web端界面功能的冒烟,并且需要抓取加载页面时的ajax请求,从接口层面判断请求是否成功.查阅了很多资料都没有人有过相关问题的处理经验,在处理过程中也踩了很多坑,所以如果你 ...
- 利用page_source抓取网页中的URL,进行链接测试
selenium的page_source方法可以获取到页面源码,下面就把它应用到链接测试中. # coding:utf-8 __author__ = 'helen' import re,request ...
- java使用htmlunit工具抓取js中加载的数据
htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度 ...
- 利用jsoup抓取网页图片
jsoup简介 jsoup is a Java library for working with real-world HTML. It provides a very convenient API ...
- htmlunit爬取js异步加载后的页面
直接上代码: 一. index.html 调用后台请求获取content中的内容. <html> <head> <script type="text/javas ...
随机推荐
- python 备份脚本
import osimport timesource= r"out_res.txt"target_dir= r"F:\python\Doc"target=tar ...
- 大数据之scala高级语法学习
协变 案例一: class Animal {} class Bird extends Animal {} class Animal {} class Bird extends Animal {} // ...
- Oracle包的概念
转自:http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包? 答: 在一个大型项目中,可 ...
- IOS自学笔记1——学前准备
函数的声明和定义: 在标准的C编译器中,定义的函数只能调用前面已经定义的函数.若在main()函数里要调用其他方法,这时得首先在main()上面声明要调用的函数,即函数的声明. C语言中,函数的声明和 ...
- IIS上不能播放mp4
iis不支持mp4格式,需要手动添加. 进入iis服务管理器,打开你的网站,然后点击MIME类型---添加(扩展名:mp4 MIME类型:application/octet-stream) 如此即 ...
- 一周学会Mootools 1.4中文教程:(5)Ajax
ajax在我们前台的开发中是非常重要的,所以我们单独拿出一节课来讲述,首先我们看一下mootools的ajax构成 语法: var myRequest=new Request([参数]); 参数: u ...
- delphi R3下 跨进程获取DLL信息 NtQueryInformationProcess
unit APIUnit; { GetProcessModuleHandle API Unit Ring3调用NtQueryInformationProcess实现跨进程获取DLL句柄 } inter ...
- Ubuntu Server 14.04在VMware安装的一些事儿
这几天一直在折腾Ubuntu Server 14.04,故记录下: 安装前的准备: 1.建议安装英文版,像15.04.16.04等安装中文版时存在bug,而且中文版字体显示也有问题. 2.Ubuntu ...
- Ubuntu 12.04 LTS下logomaker的安装
学校嵌入式课程实验,本地装的时候遇到了一系列问题,因为基本不会linux所以到处搜解决方法,中间还走了不少弯路,作个笔记. 1.解压安装倒是没什么问题,运行时提示找不到共享库 logomaker: e ...
- java中常用的数据加密算法
以下为加密的工具类: import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; im ...