没有 Node js 的 Web 抓取可能吗?
Webscraping without Node js possible?
我目前有一个简单的网页,它只包含一个 .js、.css .html 文件。我不想使用任何 Node.js 东西。
关于这些限制,我想问一下是否可以使用 javascript(例如 运行 后台网络工作者)搜索外部网页的内容。
例如我想做:
第一个 url link google 图片搜索。
编辑:
我现在尝试了它并且发现它有效但是在 2 周后我现在得到这个错误:
Cross-Origin 请求被阻止:同源策略不允许读取位于...的远程资源。
(原因:缺少 CORS header ‘Access-Control-Allow-Origin’)。
有什么解决办法吗?
这是火狐描述的错误:
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin
是的,理论上可以在客户端上进行“网页抓取”(即解析网页)。但是有一些限制,我想问为什么你不选择 运行 在服务器或桌面上的程序。
Web 工作者能够使用 XMLHttpRequest 请求 HTML 内容,然后以编程方式解析传入的 XML。请注意,如果目标网页属于外部域,则它必须发送适当的 CORS headers。然后,您可以从结果 HTML.
中挑选出内容
解析使用 CSS 和 Java 脚本生成的内容会更难。您要么必须从输入流在您的主机页面上构建沙盒内容,要么 运行 某种解析器,这似乎不太可行。
简而言之,您的问题的答案是肯定的,因为您拥有执行网络请求的工具和 Turing-complete 语言来构建您想要的任何类型的解析和抓取。所以从技术上讲,任何事情都是 可能的。
但真正的问题是:这样做明智吗?当手头有其他技术时,您会选择这种方法吗?好吧,不。在大多数情况下,我不明白你为什么不使用例如编写服务器端程序。无头 Chrome.
如果您不想使用 Node - 或者由于某种原因无法部署 Node - 有许多 Web 抓取包和现有技术的语言,例如 Go、C、Java 和Python。搜索您首选编程语言的包管理器,您可能会找到几个。
是的,这是可能的。只需使用 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 问题;如果你想这样做,运行你自己的服务器上的代理。
我也听说过 python 用于 抓取 ,但是 nodejs + puppeteer kick ass...而且非常容易学习
我目前有一个简单的网页,它只包含一个 .js、.css .html 文件。我不想使用任何 Node.js 东西。
关于这些限制,我想问一下是否可以使用 javascript(例如 运行 后台网络工作者)搜索外部网页的内容。
例如我想做:
第一个 url link google 图片搜索。
编辑:
我现在尝试了它并且发现它有效但是在 2 周后我现在得到这个错误:
Cross-Origin 请求被阻止:同源策略不允许读取位于...的远程资源。 (原因:缺少 CORS header ‘Access-Control-Allow-Origin’)。
有什么解决办法吗?
这是火狐描述的错误: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin
是的,理论上可以在客户端上进行“网页抓取”(即解析网页)。但是有一些限制,我想问为什么你不选择 运行 在服务器或桌面上的程序。
Web 工作者能够使用 XMLHttpRequest 请求 HTML 内容,然后以编程方式解析传入的 XML。请注意,如果目标网页属于外部域,则它必须发送适当的 CORS headers。然后,您可以从结果 HTML.
中挑选出内容解析使用 CSS 和 Java 脚本生成的内容会更难。您要么必须从输入流在您的主机页面上构建沙盒内容,要么 运行 某种解析器,这似乎不太可行。
简而言之,您的问题的答案是肯定的,因为您拥有执行网络请求的工具和 Turing-complete 语言来构建您想要的任何类型的解析和抓取。所以从技术上讲,任何事情都是 可能的。
但真正的问题是:这样做明智吗?当手头有其他技术时,您会选择这种方法吗?好吧,不。在大多数情况下,我不明白你为什么不使用例如编写服务器端程序。无头 Chrome.
如果您不想使用 Node - 或者由于某种原因无法部署 Node - 有许多 Web 抓取包和现有技术的语言,例如 Go、C、Java 和Python。搜索您首选编程语言的包管理器,您可能会找到几个。
是的,这是可能的。只需使用 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 问题;如果你想这样做,运行你自己的服务器上的代理。
我也听说过 python 用于 抓取 ,但是 nodejs + puppeteer kick ass...而且非常容易学习