是否有可能在JavaScript中编写Web爬虫?

Ash*_*don 11 javascript web-crawler

我想抓取页面并检查相应页面中的超链接,并按照这些超链接并从页面捕获数据

aps*_*ers 15

通常,浏览器JavaScript只能在其原始域内进行爬网,因为抓取页面将通过Ajax完成,Ajax受同源策略的限制.

如果运行爬虫脚本的页面位于www.example.com上,则该脚本可以抓取www.example.com上的所有页面,但不能抓取任何其他来源的页面(除非某些边缘情况适用,例如Access-为另一台服务器上的页面设置Control-Allow-Origin标头.

如果你真的想在浏览器JS中编写一个功能齐全的爬虫,你可以写一个浏览器扩展:例如,Chrome扩展是打包的Web应用程序运行的特殊权限,包括跨源Ajax.这种方法的难点在于,如果要支持多个浏览器,则必须编写多个版本的爬网程序.(如果爬虫只是供个人使用,那可能不是问题.)


Bog*_*san 8

如果你使用服务器端的JavaScript,它是可能的.你应该看看node.js

可以在下面的链接中找到爬虫的示例:

http://www.colourcoding.net/blog/archive/2010/11/20/a-node.js-web-spider.aspx


Nat*_*pel 5

Google 的 Chrome 团队于 2017 年 8 月发布了 puppeteer,这是一个节点库,为无头和非无头 Chrome 提供高级 API(无头 Chrome从 59 开始可用)。

它使用 Chromium 的嵌入式版本,因此保证开箱即用。如果您想使用特定的 Chrome 版本,可以通过启动 puppeteer 并使用可执行路径作为参数来实现,例如:

const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
Run Code Online (Sandbox Code Playgroud)

导航到网页并截取屏幕截图的示例显示了它是多么简单(取自 GitHub 页面):

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)