利用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 ...
随机推荐
- Ubuntu下安装Mysql并使用
一.在Ubuntu终端中输入 sudo apt-get install mysql-server 二.在安装中要设置root密码,自己输入即可,但必须要记住. 三.安装后可以使用命令检测是安装成功 s ...
- centos 安装mysql密码修改后还是不能连接的原因
centos 上安装mysql密码修改后还是不能连接出现错误:ERROR 1142 (42000): SELECT command denied to user ''@'localhost' for ...
- 解决Thinkpad E450 外接显示器后没有声音的问题
昨天把公司配的ThinkPad E450 带回来了,今天用的时候一切正常没什么问题. 因为要看边看视频边做点别的,我就外接一台显示器,说出来我的这台显示器,你们绝对想不到是什么 显示器.我的这台显示器 ...
- Angular form
参考 http://blog.xebia.com/2013/10/15/angularjs-validating-radio-buttons/ http://stackoverflow.com/que ...
- Codeforces 353D Queue(构造法)
[题目链接] http://codeforces.com/contest/353/problem/D [题目大意] 10^6个男女排队,每一秒,如果男生在女生前面,即pos[i]是男生,pos[i+1 ...
- 《windows程序设计》学习_3.4:实现雷区翻转
#include<windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPAR ...
- InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)
WEB站点在调用我们WCF服务的时候,只要传入的参数过长,就报如下错误: 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: formD ...
- BC第二场
GT and sequence Accepts: 385 Submissions: 1467 Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- sql的强大功能(看一条sql解决的复杂业务)
一条sql语句解决的复杂业务,请往下看: 业务介绍:一个单位有多个立项(立项信息表里有单位id),每个立项可能被预警多次(预警信息表里的uuid字段的值里包含有立项id或单位id),每 ...
- CSS 布局总结——固定宽度布局
固定宽度布局 单列布局 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Fyd29sZjI0/font/5a6L5L2T/fontsize/400/fil ...