【问题标题】:JavaScript function to synchronously scrape HTML and JS用于同步抓取 HTML 和 JS 的 JavaScript 函数
【发布时间】:2016-07-23 16:39:16
【问题描述】:

是否有支持以下同步 JavaScript 函数的库?

function getPageHTML(url){
     // scrape HTML from external web page
     return html;
}

function getPageJS(url){
     // scrape final JavaScript variable results from external web page
     return js;
}

我喜欢 pjscrape 背后的概念,但不想使用命令行脚本。我不介意使用 PHP,但我希望我的函数是同步的。

【问题讨论】:

  • 是的。它被称为 ajax。
  • 这应该在浏览器上运行吗?还是在 node.js 服务器上?仅供参考,Javascript 中的同步网络要么根本不支持(取决于环境),要么是一个非常糟糕的主意。
  • @jfriend00 好吧,我正在寻找与 jQuery $.get 等效的 PHP 抓取工具。我只想在我的函数中返回结果。
  • 那么,这是一个 PHP 问题吗?如果是这样,为什么您的问题显示 Javascript?根本不清楚你在问什么。
  • @jfriend00 我要求一个 javascript 函数,它返回传递给函数的 url 处的 javascript 变量和 HTML 内容

标签: javascript php scrape


【解决方案1】:

没有推荐使用同步网络从外部服务器检索数据的 Javascript 环境。这不是 Javascript 的设计方式。 Javascript 旨在使用异步 I/O,其结果将通过 promise 或回调返回,并且不能直接从您的函数调用中返回。

“Ajax”中的“A”代表异步。这是在浏览器中从 Javascript 发出网络请求的基石。浏览器在技术上可以进行同步 Ajax 调用,但由于各种原因(例如它在调用期间将 UI 挂在浏览器中)不推荐这样做,并且在许多情况下也被弃用,因为它几乎从来都不是一个好主意使用同步ajax。此外,来自浏览器的 Ajax 调用仅限于与您的网页来源相同的来源,或者仅限于明确允许跨来源请求的服务器。因此,您不能期望通过 Ajax 调用来获取 Internet 上的任意页面。您将无法从浏览器网页 Ajax 调用中获取大多数其他页面。

浏览器擅长的是异步网络,其中结果通过回调或未来某个时间的承诺异步返回,并且您的 Javascript 的其余部分继续运行直到那时。这就是您应该如何编码访问网络请求的方式。

如果您想在浏览器中从某个外部站点获取抓取结果,则首选架构是设置一个服务器来为您完成工作。您网页中的 Javascript 将对您自己的服务器进行 Ajax 调用,要求它抓取特定的网站。服务器(它对可以从哪些主机发出请求没有跨源限制)然后将获取内容,将其抓取为所需的结果,然后将生成的抓取数据返回给您的 Ajax 调用。


因此,您可以在客户端中设计一个基于 Promise 的接口,该接口可以像这样异步工作:

getPageJS(someUrl).then(function(data) {
    // process data here
}).catch(function(err) {
    // process error here
});

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多