利用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 ...
随机推荐
- 如何在oracle中导入导出(备份&恢复)dmp数据库文件
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利 ...
- WinSock网络编程基础(1)
记录学习windows网络编程过程中遇到的问题和相关笔记 基本概念: Socket: socket起源于UNIX,Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.基于&qu ...
- Hibernate学习之hibernate执行顺序
Hibernate 执行的顺序如下: (1) 生成一个事务的对象,并标记当前的 Session 处于事务状态(注:此时并未启动数据库级事务). (2) 应用使用 s.save 保存对象,这个时候 ...
- day5_python学习笔记_chapter6_字符串列表元组
1. 序列:seq[n], seq[x:y], seq * n序列重复n次,切片, 序列翻转 s=”abcde", s[::-1]="edcba" 内建函数:1. 类型转 ...
- grunt打包过程中的注意点
1.安装nodeJS nodeJS下载地址: http://www.nodejs.org/download/ 2. 在Node.js command prompt 这个控制面板输入 npm i ...
- css如此强大你知道吗
看个这个大神纯 CSS 绘制<辛普森一家>人物头像我惊呆了,css如此牛x <div id="wrap"> <div class="cont ...
- What do `?i` and `?-i` in regex mean?
http://stackoverflow.com/questions/15145659/what-do-i-and-i-in-regex-mean
- hbase0.96 put流程 源码分析
无意间多瞄了一眼hbase0.98的代码,想复习下put流程.发现htable里面已经找不到processBatchOfPuts()奇怪了.看了半天原来变化还真大事实上0.96就没这个了,于是又搞了个 ...
- TRIZ系列-创新原理-21-高速通过原理
高速通过原理,有的书也译为"降低有害作用的时间"原理,我比較倾向于叫高速通过原理,这个概念下,适用范围比較大些.高速通过原理的详细描写叙述例如以下:1)很高速的实施有害的或者有危急 ...
- codeforces #261 C题 Pashmak and Buses(瞎搞)
题目地址:http://codeforces.com/contest/459/problem/C C. Pashmak and Buses time limit per test 1 second m ...