JavaScript函数同步抓取HTML和JS

问题描述 投票:0回答:1

是否有一个库支持如下同步 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,但我希望我的函数是同步的。

javascript php web-scraping
1个回答
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
});
© www.soinside.com 2019 - 2024. All rights reserved.