Google Chrome扩展程序中的网页抓取(JavaScript + Chrome API)


72

带有JavaScript的Google Chrome扩展程序中当前未打开的标签执行Web爬取的最佳选择是什么,以及可用的更多技术。其他JavaScript库也被接受。

重要的是掩盖抓取行为,使其表现得像正常的网络请求。没有迹象表明AJAX或XMLHttpRequest,如X-Requested-With: XMLHttpRequestOrigin

必须从JavaScript中访问已抓取的内容,以便在扩展中进行进一步的操作和表示,很可能是字符串。

WebKit / Chrome特定的API中是否有任何钩子可用于进行正常的Web请求并获取处理结果?

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

奖励点,可以从磁盘上的本地文件进行此项工作,以进行初始调试。但是,如果那只是停止解决方案的唯一要点,则忽略奖金点。


@缓冲谢谢!我也这样认为,即使有3个人投票赞成关闭(?? !!)。如果答案是“不可能”,那是正确的,并且如果一段时间内没有其他反应,那么将被接受。
Seb Nilsson

尽管我不确定iMacros会提供多少帮助,但它正在做类似的事情。chrome.google.com/webstore/detail/…–
用户

@buffer似乎只打开选项卡并侦听已打开的选项卡,而不真正执行代码中的请求。至少从我能找到的。感谢您的尝试!:D
Seb Nilsson

您终于找到了@SebNilsson吗?
Christophe

@Christophe Nopes,没有符合指定条件的好答案。
Seb Nilsson

Answers:


12

尝试使用XHR2 responseType = "document"并继续(new DOMParser).parseFromString(responseText, getResponseHeader("Content-Type"))使用我的text/html补丁。有关如何检测支持(同步检查从Blob创建的对象URL )的示例,请参见https://gist.github.com/1138724responseType = "documentresponse === nulltext/html

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


您能否格式化一下响应并可能提供几行代码作为示例。
塞卜·尼尔森

13
哎呀,冷静点 它的格式像5岁,所以我认为您可以清理“西部最快的枪支”-答案。
塞伯·尼尔森

1
不,对不起,它不起作用。仍然会出现相同的旧“原始null”错误。
Seb Nilsson'9

10

如果您可以很好地查看Google Chrome插件之外的其他功能,请查看phantomjs,它在后台使用Qt-Webkit并像浏览器一样发出ajax请求。您可以将其称为无头浏览器,因为它不会在屏幕上显示输出,并且在您执行其他操作时可以在后台正常工作。如果需要,可以从获取的页面中导出pdf图像。它提供了JS界面来加载页面,单击按钮等,就像您在浏览器中一样。您还可以在要抓取的任何页面上注入自定义JS(例如jQuery),并使用它来访问dom并导出所需的数据。使用Webkit时,其渲染行为与Google Chrome完全相同。

另一个选择是使用基于Mozilla Engine的Aptana Jaxer,它本身就是一个很好的概念。它也可以用作简单的抓取工具。


真的让我一会去那里,但他们都不是能够融入谷歌的Chrome扩展不幸:(他们是在自己的环境中进行处理的非常不错的尝试虽然双方单机产品。
Seb Nilsson

@SebNilsson忘记提了,已经编辑了答案。我认为您需要解决方案,因为chrome扩展仅基于您需要使真正的浏览器与网站进行交互的需要。
2011年

8

自问这个问题以来,已经发布了许多工具。

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


6

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

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

1
这是为了抓取当前在chrome标签中打开的页面,吗?
MGOwen

5

我不确定仅JavaScript是否完全可以实现,但是如果您可以为扩展程序设置专用的PHP脚本,该脚本使用cURL来获取页面的HTML,则PHP脚本可以为您抓取页面,并且扩展程序可以读取通过AJAX请求将其插入。

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



3

您不能只是做一些iframe骗术吗?如果您将网址加载到专用框架中,则说明文档对象中有dom,并且可以选择jquery,不是吗?


我已经尝试过了,但是无法访问W3C标准中指定的Iframe的内容。希望Chrome扩展程序能给我带来一些好处。
Seb Nilsson

您可以通过包含内容脚本来访问iframe内容。这是我找到的最好的解决方案,并且在许多扩展中都使用了它。
hamczu 2011年

通过使用$ chrome --disable-web-security启动chrome,您可以访问iframe,但是某些网站不喜欢iframe和iframe的突破
denysonique 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.