没有Node js可以进行网络抓取吗?

时间:2019-04-13 10:01:38

标签: javascript html web-scraping web-worker

我目前有一个简单的网页,仅由.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

3 个答案:

答案 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踢屁股...而且很容易学习