【问题标题】:Grab all HTML from a remote website using client-side script使用客户端脚本从远程网站获取所有 HTML
【发布时间】:2014-11-16 18:56:35
【问题描述】:

我想创建一个网络应用程序来组织和分析来自另一个网站的信息。另一个网站没有 API,所以我只想从中获取所有 HTML(在允许其脚本运行之后),并让我可以使用 jquery 为我的 web 应用程序进行分离。

我意识到 PHP 或其他服务器端语言是这个问题的真正答案,但我只知道前端的东西,只想做一些快速而肮脏的东西。除了我,没有人在使用它。

我现在能想到的唯一方法是使用隐藏的 iframe。有什么(相对)比这个解决方案更优雅的吗?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您可以通过 YQL 休息调用轻松做到这一点。

在此处查看示例:https://developer.yahoo.com/yql/guide/yql-select-xpath.html

基本上你只需要对雅虎的 YQL 服务器做一些 AJAX 调用,它就会返回一个响应,在里面你会找到你查询的页面的 HTML。

Playground link - 如您所见,REST 查询位于页面底部。

更新-

google“scraping pages using phantomjs”,你会得到你所需要的scraping pages and parse pages and get the final result。

【讨论】:

  • 即使他使用 YQL,他也只会获取服务器返回的页面源,而不是执行任何 javascript(如他特别要求的那样)。
  • @Karl-JohanSjögren - 所以?他可以将其输入到无头浏览器中,例如 phantomJS)并取回结果。这是容易的部分。他只是不知道如何实际获取 HTML。一个快速的谷歌显示了很多好的结果,比如这个 - nrabinowitz.github.io/pjscrape
  • 是的,phantomjs 或类似的技术可能是最好的选择,那么为什么还要使用 YQL 呢?无头浏览器可以直接进入页面(它应该获取所有引用的脚本等)。
  • 好吧,我错过了他说他希望 javascript 运行的部分。我已经更新了我的答案。
【解决方案2】:

事实上,隐藏的 iframe 可能不起作用,因为大多数浏览器不允许一个窗口中的 javascript 在另一个窗口的上下文中运行(例如 iframe)。

为什么不直接使用jQuery.get() 获取 HTML?

【讨论】:

  • jQuery.get() 不适用于远程服务器(除非该服务器有一些非常允许的 CORS 规则),并且它也不会像 OP 那样执行网页上的脚本要求。
  • 很公平。我错过了脚本部分。服务器端规则如何知道这是来自脚本的请求?
  • jQuery.ajax() 怎么样?
  • 服务器不知道,但现代浏览器不允许调用,除非返回正确的标头。这主要是为了阻止恶意网站向外部来源(包括您为该域拥有的任何 cookie)发出请求并检索它不应该访问的数据。 developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
【解决方案3】:

您无法从 IFrame 访问 DOM,因为它违反了跨域资源共享 (CORS) 规则。使用 IFrame,您需要从相同的主机(即至少 foo.com 和 bar.foo.com)提供两个框架 - 如果它们在任何方面都不同,那么您必须显式设置document.domain 属性。就像这样,一个页面不能只在您的银行/脸书/其他具有敏感信息的网站中包含一个 IFrame 并简单地窃取内容。 See MDN for more

如果您真的只想从网站中提取 HTML 内容,那么使用 JavaScript 并不是最佳解决方案,因为存在有充分理由的跨源策略。

【讨论】:

    【解决方案4】:

    简单回答:否


    现代浏览器不会让你这样做,否则它们是不安全的。

    可以在in this question找到请求网页的方法的详细信息,但所有这些都要求您在same domain上。

    我的建议:

    选项 A:请一个星期天休息(比如今天!)并学习一些基本的服务器知识。您已经了解 JavaScript,您可以在一天内学会使用 nodejs 构建一个简单的 Web 服务器!

    选项 B:你真的不想接触后端的东西。考虑将您的应用程序构建为chrome app。在这种方法中,您可以ask user politely 从远程位置获取内容。

    【讨论】:

      【解决方案5】:

      您的目标是使用 JavaScript 实现“屏幕抓取”吗?
      如果是这样,网站将无法运行(出于安全原因),但您仍然可以选择。

      您可以通过将 Javascript 粘贴到书签中来创建“书签”,并以 javascript: 开头。然后,您只需打开网页,点击您的书签,您的代码就会被执行。

      我建议首先将所有代码写入一个实际的 JavaScript 文件,然后将其粘贴到书签中。举个例子:

      javascript:
      alert("hello");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        相关资源
        最近更新 更多