Google Chrome扩展程序中的网页搜寻(JavaScript + Chrome API)

时间:2011-06-28 14:48:33

标签: javascript google-chrome google-chrome-extension xmlhttprequest web-scraping

使用JavaScript以及可用的更多技术,从Google Chrome扩展程序中网页刮取当前未打开的标签的最佳选项是什么? 也接受其他JavaScript库。

重要的是屏蔽抓取行为就像普通的网络请求一样。没有AJAX或XMLHttpRequest的指示,例如X-Requested-With: XMLHttpRequestOrigin

必须可以从JavaScript访问已删除的内容,以便在扩展程序中进行进一步操作和演示,最有可能是字符串。

在任何特定于WebKit / Chrome的API中是否有任何钩子:可用于制作正常的网络请求并获取操作结果?

var pageContent = getPageContent(url); // TODO: Implement
var items = $(pageContent).find('.item');
// Display items with further selections

Bonus-points使这项工作从磁盘上的本地文件 开始,用于初始调试。但如果那是唯一的一点就是停止解决方案,那么就忽略奖励积分。

7 个答案:

答案 0 :(得分:12)

尝试使用XHR2 responseType = "document"并使用my text/html patch返回(new DOMParser).parseFromString(responseText, getResponseHeader("Content-Type"))。有关我如何检测responseType = "document支持的示例,请参阅https://gist.github.com/1138724(同步检查从response === null blob创建的对象网址上的text/html

使用Chrome WebRequest API隐藏X-Requested-With等标题。

答案 1 :(得分:10)

如果您对谷歌Chrome插件之外的其他内容感到满意,请查看phantomjs在后台使用Qt-Webkit并运行就像浏览器发出ajax请求一样。您可以将其称为无头浏览器,因为它不会在屏幕上显示输出,并且在您执行其他操作时可以在后台完全工作。如果需要,可以从提取的页面中导出图像,pdf。它提供了JS接口来加载页面,点击按钮等,就像在浏览器中一样。您还可以在要抓取的任何页面上注入自定义JS(例如jQuery),并使用它来访问dom并导出所需数据。由于其使用Webkit,其呈现行为与Google Chrome完全相同。

另一个选择是使用基于Mozilla引擎的Aptana Jaxer,它本身就是一个非常好的概念。它也可以用作简单的刮削工具。

答案 2 :(得分:7)

自从提出这个问题以来,已经发布了很多工具。

artoo.js就是其中之一。这是一段JavaScript代码,旨在在您的浏览器控制台中运行,为您提供一些抓取工具。它也可以用作镀铬扩展。

答案 3 :(得分:6)

网络抓取在Chrome扩展程序中有点复杂。一些要点:

  • 您运行内容脚本以访问DOM。
  • 后台页面(每个浏览器一个)可以向内容脚本发送和接收messages。也就是说,您可以运行设置RPC端点的内容脚本,并在后台页面的上下文中触发指定的回调作为响应。
  • 您可以在网页的所有框架中执行内容脚本,然后将文档树(由页面包含的1..N帧组成)拼接在一起。
  • 作为S.K.建议,您的后台页面可以将数据作为XMLHttpRequest发送到某种侦听本地侦听的轻量级HTTP服务器。

答案 4 :(得分:5)

我不确定只使用JavaScript是完全可能的,但是如果您可以为扩展程序设置专用的PHP脚本,使用cURL来获取页面的HTML,那么PHP脚本可能会为您和您的页面抓取页面扩展可以通过AJAX请求读取它。

正在抓取的实际页面不会知道它是一个AJAX请求,因为它是通过cURL访问的。

答案 5 :(得分:4)

我认为你可以从这个example开始。

所以基本上你可以尝试使用Extension + Plugin组合。扩展可以访问DOM(包括插件)并驱动进程。插件会发送实际的HTTP请求。

我可以推荐使用Firebreath作为跨平台的Chrome / Firefox插件平台,特别是看一下这个例子:Firebreath - Making+HTTP+Requests+with+SimpleStreamsHelper

答案 6 :(得分:2)

你能不能做一些iframe诡计?如果你将url加载到一个专用的框架中,你有一个文档对象的dom,可以做你的jquery选择,不是吗?