【问题标题】:Webscraping without Node js possible?没有 Node js 的 Web Scraping 可能吗?
【发布时间】:2019-04-13 10:01:38
【问题描述】:

我目前有一个简单的网页,它只包含一个 .js、.css .html 文件。我不想使用任何 Node.js 的东西。

关于这些限制,我想问一下是否可以使用 javascript 搜索外部网页的内容(例如,在后台运行 webworker)。

例如我想做:

获取 google 图片搜索的第一个 url 链接。

编辑:

我现在试了一下,发现它工作正常,但是 2 周后我现在得到这个错误:

跨域请求被阻止:同源策略不允许读取位于...的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。

有什么办法解决这个问题吗?

这是firefox描述的错误: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin

【问题讨论】:

  • 如果您尝试抓取的网站不支持 CORS,则如果没有服务器代理请求,您将无法绕过该问题。

标签: javascript html web-scraping web-worker


【解决方案1】:

是的,理论上可以在客户端进行“网页抓取”(即解析网页)。但是有几个限制,我想问你为什么不选择在服务器或桌面上运行的程序。

Web 工作者能够使用 XMLHttpRequest 请求 HTML 内容,然后以编程方式解析传入的 XML。请注意,如果目标网页属于外部域,则它必须发送适当的 CORS 标头。然后,您可以从生成的 HTML 中挑选内容。

解析使用 CSS 和 JavaScript 生成的内容会更加困难。您要么必须根据输入流在主机页面上构建沙盒内容,要么运行某种解析器,这似乎不太可行。

简而言之,您的问题的答案是肯定的,因为您拥有执行网络请求的工具和图灵完备的语言,可以用来构建您想要的任何类型的解析和抓取。所以从技术上讲,任何事情都是可能的

但真正的问题是:这样做是否明智?当其他技术在手时,您会选择这种方法吗?嗯,不。在大多数情况下,我不明白你为什么不直接使用例如编写服务器端程序。无头 Chrome。

如果您不想使用 Node - 或者由于某种原因无法部署 Node - 有许多 Web 抓取包和 Go、C、Java 和 Python 等语言的现有技术。搜索您喜欢的编程语言的包管理器,您可能会找到几个。

【讨论】:

  • 很好的回复谢谢。你有一个简单的例子或教程来开始使用 js 吗? (即使它不明智?)是的,我看到了不错的 python 包。但是,我将不得不编写一个无法直接在浏览器中启动的 python 程序(例如,对于 brython,还没有 selenium 或 liburl2 liburl 包可用)。
  • 为什么需要在浏览器中运行程序?
  • 好吧,因为我想从任何地方(我的智能手机等)访问它,每个人都应该能够在不下载东西的情况下使用它。
  • 听起来您需要一个运行刮板的服务器,并提供一个基于 Web 的界面来启动刮板过程并将结果异步发送回用户(例如通过电子邮件)。
【解决方案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 问题;如果您想这样做,请在您自己的服务器上运行您自己的代理。

【讨论】:

  • 我现在如何使用它从dict.leo.org/englisch-deutsch/hallo 获取词汇数据我尝试使用该网址但我得到的只是 dict.leo.org/englisch-deutsch/hallo "> 而不是我想要的德语 (deutsch) 结果
  • @sqp_125 只需阅读 URL (a.href),然后使用相同的方法请求 那个 页面。此外,请确保为实际代码设置 自己的 CORS 代理;未经他人许可以这种方式使用他人的服务器是极其不礼貌的。
  • 对不起,我需要更多解释。 a.href 给了我:dict.leo.org/englisch-deutsch/hallo 你有如何设置这样一个 CORS 代理的链接吗?
  • @sqp_125 这很好!现在只需运行相同的代码,但使用 encodeURIComponent(a.href) 代替。要设置 CORS 代理,请设置普通代理,但要确保它返回标头 Access-Control-Allow-Origin: *Here's a reference implementation in Node.JS.
  • 哇,非常感谢这工作!你知道我是否也可以使用 Ajax 请求将你的 js 代码转换为 brython 吗? brython.info/static_doc/en/ajax.html 我想使用这个,因为我只想在 python 中编码,然后用 brython 将我的代码转换为 js(这是自动完成的)非常感谢!
【解决方案3】:

我也听说过 python 用于scraping,但是 nodejs + puppeteer 很牛逼……而且很容易学习

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多