我目前有一个简单的网页,仅由.js,.css .html文件组成。我不想使用任何Node.js的东西。
关于这些限制,我想问问是否可以使用javascript(例如,在后台运行Webworker)搜索外部网页的内容。
例如我想这样做:
获取Google图片搜索的第一个网址链接。
修改:
我现在尝试了一下,但是找到了它,但是两周后我得到了这个错误:
跨域请求被阻止:相同起源策略不允许在...处读取远程资源。 (原因:CORS标头“ Access-Control-Allow-Origin”缺失)。
有什么解决方法的想法吗?
这是firefox描述的错误: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin
答案 0 :(得分:2)
是的,从理论上讲,可以在客户端上进行“网页抓取”(即解析网页)。但是有几个限制,我会问为什么您不选择在服务器或台式机上运行的程序。
Web worker能够使用XMLHttpRequest请求HTML内容,然后以编程方式解析传入的XML。请注意,如果目标网页属于外部域,则它必须发送适当的CORS标头。然后,您可以从生成的HTML中挑选内容。
解析用CSS和JavaScript生成的内容会更加困难。您要么必须根据输入流在主机页面上构建沙盒内容,要么运行某种解析器,这似乎不太可行。
简而言之,您的问题的答案是肯定的,因为您拥有执行网络请求的工具和图灵完备的语言,可以用它们构建所需的任何类型的解析和抓取。所以从技术上讲,一切都是可能的。
但是真正的问题是:这是否明智?当其他技术临近时,您会选择这种方法吗?好吧,不。在大多数情况下,我不明白为什么您不只是使用例如无头的Chrome。
如果您不想使用Node或由于某种原因而无法部署Node,则可以使用Go,C,Java和Python等多种语言的Web抓取软件包和现有技术。搜索您喜欢的编程语言的程序包管理器,您可能会找到几个。
答案 1 :(得分:2)
是的,这是可能的。只需使用XMLHttpRequest
API:
var request = new XMLHttpRequest();
request.open("GET", "https://bypasscors.herokuapp.com/api/?url=" + encodeURIComponent("https://duckduckgo.com/html/?q=stack+overflow"), true); // last parameter must be true
request.responseType = "document";
request.onload = function (e) {
if (request.readyState === 4) {
if (request.status === 200) {
var a = request.responseXML.querySelector("div.result:nth-child(1) > div:nth-child(1) > h2:nth-child(1) > a:nth-child(1)");
console.log(a.href);
document.body.appendChild(a);
} else {
console.error(request.status, request.statusText);
}
}
};
request.onerror = function (e) {
console.error(request.status, request.statusText);
};
request.send(null); // not a POST request, so don't send extra data
请注意,我必须使用代理来绕过CORS问题;如果要执行此操作,请在自己的服务器上运行自己的代理。
答案 2 :(得分:0)
我也听说过python用于报废,但是nodejs + puppeteer踢屁股...而且很容易学习