【问题标题】:Web Scraping in a Google Chrome Extension (JavaScript + Chrome APIs)Google Chrome 扩展程序中的网页抓取(JavaScript + Chrome API)
【发布时间】:2015-07-31 16:06:44
【问题描述】:

使用 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

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

【问题讨论】:

  • @buffer 谢谢!我也这么认为,尽管有 3 个人投票支持关闭(??!!)。如果答案是“不可能”,那么这是正确的,并且会被接受,如果一段时间内没有其他问题出现的话。
  • iMacros 正在做类似的事情,尽管我不确定它提供了多少帮助。 chrome.google.com/webstore/detail/…
  • @buffer 似乎只打开标签并收听已经打开的标签,并没有真正在代码中做请求。至少从我能找到的。感谢您的尝试! :D
  • @SebNilsson 你终于找到方法了吗?
  • @Christophe Nopes,没有满足给定标准的好答案。

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


【解决方案1】:

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

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

【讨论】:

  • 您能否格式化一下您的回复,并提供几行代码作为示例。
  • 天啊,冷静点。它的格式就像一个 5 岁的孩子,所以我认为你可以清理你的“西部最快的枪”-答案。
  • 不,抱歉,它不起作用。仍然得到相同的旧“原点空”-错误。
【解决方案2】:

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

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

【讨论】:

  • 真的让我去了一段时间,但不幸的是,它们似乎都无法集成到 Google Chrome 扩展程序中:( 它们都是必须单独处理的独立产品环境。不过很好的尝试。
  • @SebNilsson 之前忘了提,已经编辑了答案。我假设您需要解决方案,因为 chrome 扩展完全基于您需要让真正的浏览器与网站交互。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    网页抓取在 Chrome 扩展程序中有点复杂。几点:

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

    【讨论】:

    • 这是用于抓取当前在 chrome 选项卡中打开的页面,对吗?
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      我想你可以从这个example开始。

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

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

      【讨论】:

        【解决方案7】:

        你不能做一些 iframe 诡计吗?如果您将 url 加载到专用框架中,那么您在文档对象中有 dom 并且可以进行 jquery 选择,不是吗?

        【讨论】:

        • 我已经尝试过了,但我无法访问 W3C 标准中指定的 iframe 的内容。希望 Chrome 扩展程序能给我一些帮助。
        • 您可以通过包含内容脚本来访问 iframe 内容。这是我找到的最佳解决方案,我在许多扩展程序中都使用了它。
        • 通过使用 $ chrome --disable-web-security 启动 chrome,您可以访问 iframe,但有些网站不喜欢这样并突破 iframe
        猜你喜欢
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 2015-03-15
        • 2022-07-19
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多