JavaScript函数同步抓取HTML和JS


JavaScript function to synchronously scrape HTML and JS

是否有支持如下同步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环境中,建议使用同步网络从某些外部服务器检索数据。Javascript不是这样设计的。Javascript被设计为使用异步I/O,其中结果将通过promise或回调返回,并且不能直接从函数调用返回。

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

浏览器擅长的是异步网络,在异步网络中,结果将在未来某个时候通过回调或promise异步返回,而Javascript的其余部分将继续运行。这就是您应该如何对网络请求的访问进行编码。

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


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

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