利用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 supportsvar 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
  • XULRunner 入门 https://developer.mozilla.org/cn/XULRunner/XULRunner_%E5%85%A5%E9%97%A8
  • Writing textual data https://developer.mozilla.org/en/writing_textual_data
  • http://lync.in/use-crowbar-to-retrieve-async-content-from-webpages/
posted on 2014-03-04 11:33 lexus 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lexus/p/3580028.html

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

  1. matlab抓取网页信息,如何利用Matlab抓取网页数据

    如何利用Matlab抓取网页数据 2019-01-01 %朋友需要做金融方面的分析,要求从网站上下载大量的数据,一个一个复制粘贴太费事.我写了一个简单的网络爬虫,主要用到正则表达式,可以自动下载网页源 ...

  2. Flask + Ajax + Mysql 实现网页异步加载(一)

    滚动条滑到底部时候,在当前页面加载下一页数据: 滚动条到达顶部时候,刷新当前页面. 一.flask 实现的服务器端 @app.route('/',methods=['GET','POST']) def ...

  3. 动态加载子节点_简易数据分析 10 | Web Scraper 翻页—抓取「滚动加载」类型网页...

    这是简易数据分析系列的第 10 篇文章. 原文首发于博客园:简易数据分析 10. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『 ...

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

    这是简易数据分析系列的第 10 篇文章. 原文首发于博客园:简易数据分析 10. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『 ...

  5. webscraper多页爬取_Web Scraper 翻页——抓取「滚动加载」类型网页(Web Scraper 高级用法)| 简易数据分析 10...

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

  6. 利用HttpURLConnection抓取网页取名

    闲来无事,利用Java 的HttpURLConnection,使用多线程来抓取网页,计算名字的分数. 仅供娱乐. 程序如下 import java.io.BufferedReader; import ...

  7. html5移动端底部效果,spring mvc +HTML5实现移动端底部上滑异步加载更多内容分页效果...

    代码实现 1).前端代码: 前端代码需要用到jquery和zepto,大家在网上自己下载,下面是页面的代码: contentType="text/html; charset=UTF-8&qu ...

  8. 爬取网页动态加载的评论

    超时的处理 爬虫在向服务器请求时,若是服务器没有顺利返回响应,爬虫就会一直等待 有时这种长时间等待是没有没价值的 在requests.get()里添加参数,设置一个等待时间,若是响应超过这段时间还没有 ...

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

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

最新文章

  1. ISME:微生物网络构建与分析面临的挑战
  2. python运算符和表达式
  3. 面试--java实现一个多人图文聊天室(c/s或b/s),写出思路
  4. Window 消息大全使用详解(无聊没事做)
  5. mysql实时物化到clickhouse(MaterializeMySQL)
  6. html.编辑数据回显,从HTML表格编辑/更新MySQL数据库值
  7. android binder与handler的简要理解
  8. jQuery学习笔记:Ajax(二)
  9. 显示当前行号、文件名和函数名
  10. Vue结合Echarts
  11. 如何从0开始,搭建企业的实时数据中台?
  12. java初学者必看经典
  13. CCF201604-3 路径解析(解法二)(100分)(废除!!!)
  14. js中数组原型Array、自定义原型函数Array.prototype
  15. IDEA中如何配置Tomcat和项目?
  16. head 标签里有什么?
  17. Ubuntu下安装honeyd
  18. toolchain安装教程支持_网上现成toolchain安装操作
  19. android源码分析!程序员怎样优雅度过35岁中年危机?送大厂面经一份!
  20. 树莓派4B-连接Air720U模块抓取数据日志

热门文章

  1. 南大通用GBase 8s+浪潮K1 Power联合解决方案 助力城市轨道交通国产化进程
  2. 城轨计算机联锁规范,城市轨道交通计算机联锁系统的设计及实现
  3. 点对点视频服务器系统,点对点视频会议系统解决方案
  4. 【安信可ESP32语音开发板专题②】ESP32-Audio-Kit 开发板适配百度dueros例程实现在线语音功能,与开发板对话聊天。
  5. IBM T23系列U盘启动
  6. 无法写入文件“XXXXXX”,因为它会覆盖输入文件
  7. 如何安装Jmeter监控服务器资源插件(JMeterPlugins + ServerAgent 方法一)?
  8. kafka server broker参数配置
  9. 推荐几个比较好的国外软件项目外包网站(比较适合兼职)
  10. X-Forwarded-For的一些理解(1)