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

时间:2012-06-18 13:04:10

标签: javascript web-crawler

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

11 个答案:

答案 0 :(得分:16)

通常,浏览器JavaScript只能在其来源的域内进行抓取,因为抓取页面将通过Ajax来完成,Same-Origin Policy受限制。

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

如果确实想要在浏览器JS中编写功能齐全的抓取工具,您可以编写一个浏览器扩展名:例如,Chrome extensions是打包的Web应用程序,具有特殊权限,包括cross-origin Ajax。这种方法的难点在于,如果要支持多个浏览器,则必须编写多个版本的爬网程序。 (如果爬虫只是供个人使用,那可能不是问题。)

答案 1 :(得分:7)

如果您使用服务器端JavaScript,则可以。 你应该看一下 node.js

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

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

答案 2 :(得分:2)

我们可以在无头webkit的帮助下使用来自服务器端的Javascript来抓取页面。对于爬行,我们有很少的库,如PhantomJS,CasperJS,还有一个名为Nightmare JS的PhantomJS上的新包装器,使工作更容易。

答案 3 :(得分:1)

我的典型设置是使用设置了跨域权限的浏览器扩展,这会注入爬虫代码和jQuery。

对Javascript抓取工具的另一种看法是使用无头浏览器,如phantomJS或casperJS(可提升幻影的功能)

答案 4 :(得分:1)

有很多方法可以用JS来规避同源策略。我为facebook写了一个爬虫,它收集了来自朋友和我朋友的朋友的Facebook个人资料中的信息,并允许按性别,当前位置,年龄,军事状态(你抓住我的漂移)过滤结果。这很简单。我刚从控制台运行它。这样,您的脚本将获得在当前域上执行请求的特权。您还可以制作书签以从书签中运行脚本。

另一种方法是提供PHP代理。您的脚本将访问当前域上的代理,并使用PHP从另一个域请求文件。请小心那些。如果您不小心,这些可能会被第三方劫持并用作公共代理。

祝你好运,也许你像我一样在这个过程中交了一两个朋友: - )

答案 5 :(得分:1)

这就是你需要的http://zugravu.com/products/web-crawler-spider-scraping-javascript-regular-expression-nodejs-mongodb 他们使用NodeJS,MongoDB和ExtJs作为GUI

答案 6 :(得分:0)

是的,这是可能的

  1. 使用NODEJS(其服务器端JS)
  2. nodeJS
  3. 中有NPM(处理第三方模块的包管理器)
  4. 在NodeJS中使用PhantomJS(可以通过网站抓取的第三方模块是PhantomJS)

答案 7 :(得分:0)

使用Firefox Greasemonkey扩展,有一种客户端方法。使用Greasemonkey,您可以创建每次打开指定URL时执行的脚本。

这里有一个例子:

如果你有这样的网址:

http://www.example.com/products/pages/1

http://www.example.com/products/pages/2

然后您可以使用类似的东西打开包含产品列表的所有页面(手动执行)

var j = 0;
for(var i=1;i<5;i++)
{ 
  setTimeout(function(){
  j = j + 1;
  window.open('http://www.example.com/products/pages/ + j, '_blank');

}, 15000 * i);

}

然后您可以创建一个脚本,在每个产品列表页面的新窗口中打开所有产品,并在Greasemonkey中包含此URL。

http://www.example.com/products/pages/ *

然后是每个产品页面的脚本,用于提取数据并调用Web服务传递数据和关闭窗口等。

答案 8 :(得分:0)

我在github上做了一个javascript crawler示例。

它是事件驱动的,并使用内存中队列来存储所有资源(即。url)。

如何在节点环境中使用

var Crawler = require('../lib/crawler')
var crawler = new Crawler('http://www.someUrl.com');

// crawler.maxDepth = 4;
// crawler.crawlInterval = 10;
// crawler.maxListenerCurrency = 10;
// crawler.redisQueue = true;
crawler.start();

这里我只是向您展示一个javascript爬虫的2核心方法。

Crawler.prototype.run = function() {
  var crawler = this;
  process.nextTick(() => {
    //the run loop
    crawler.crawlerIntervalId = setInterval(() => {

      crawler.crawl();

    }, crawler.crawlInterval);
    //kick off first one
    crawler.crawl();
  });

  crawler.running = true;
  crawler.emit('start');
}


Crawler.prototype.crawl = function() {
  var crawler = this;

  if (crawler._openRequests >= crawler.maxListenerCurrency) return;


  //go get the item
  crawler.queue.oldestUnfetchedItem((err, queueItem, index) => {
    if (queueItem) {
      //got the item start the fetch
      crawler.fetchQueueItem(queueItem, index);
    } else if (crawler._openRequests === 0) {
      crawler.queue.complete((err, completeCount) => {
        if (err)
          throw err;
        crawler.queue.getLength((err, length) => {
          if (err)
            throw err;
          if (length === completeCount) {
            //no open Request, no unfetcheditem stop the crawler
            crawler.emit("complete", completeCount);
            clearInterval(crawler.crawlerIntervalId);
            crawler.running = false;
          }
        });
      });
    }

  });
};

这是github链接https://github.com/bfwg/node-tinycrawler。 它是一个用1000行代码编写的javascript网页爬虫。 这应该会让你走上正确的轨道。

答案 9 :(得分:0)

2017年8月

Google's Chrome team has released puppeteer,这是一个节点库,为无头和无头Chrome提供高级API(无头Chrome可用since 59)。

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

const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});

导航到网页并截取屏幕截图的示例显示它有多简单(取自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();
})();

答案 10 :(得分:0)

您可以制作一个由远程json文件驱动的Web搜寻器,该文件会在每个标签页加载后立即打开新标签页中页面的所有链接,但已打开的标签页除外。如果您设置了带有在基本浏览器中运行的浏览器扩展名(除了Web浏览器和Internet配置程序之外没有运行任何其他东西),并且将其安装并安装在具有良好Internet的位置,则可以使用一台旧计算机来制作网页数据库。那只需要检索每个选项卡的内容。与大多数对搜索引擎成本的估计相反,您可以花大约2000美元来做到这一点。您只需要基本使您的算法可以根据页面的innerText属性中出现的术语,关键字和描述的数量来提供页面。您还可以设置另一台PC来从一次性数据库中检索旧页面并添加更多内容。我估计大约需要3个月的时间,最多需要20000美元。