基于Node.js开发爬虫工具。 ( puppeteer 与 egg.js 配合使用)

突然想抓取个ip代理,现在Node这么火,为什么不用他写个爬虫呢。
那么,开始吧!

技术:

  • puppeteer :
    • 由Google团队开发,该工具可以理解成我们日常使用的Chrome的无界面版本以及对其进行操控的js接口套装。
    • 常见用法:单元测试,性能测试,爬虫。
    • 项目地址:https://github.com/GoogleChrome/puppeteer
  • Egg.js
    • 由阿里团队开发,其宗旨是:为企业级框架和应用而生,希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本。
    • 项目地址:https://github.com/eggjs/egg/

安装:

环境 :puppeteer本身依赖6.4以上的Node,为了配合使用async/await,推荐使用7.6版本以上的Node。

1. 初始化项目:

使用egg.js初始话项目:

$ npm i egg-init -g
$ egg-init egg-example --type=simple
$ cd egg-example
$ npm i

启动项目:

$ npm run dev
$ open localhost:7001

更多操作查看官方文档。

2. 下载依赖:

安装puppeteer:

$ npm i puppeteer -S

3. 编写:

egg.js 中 对于 router controller service 的使用大家可以去文档中看一下,很简单,这里主要讲解这么使用puppeteer抓取页面。

简单介绍一下puppeteer使用:

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.example.com');
  await page.screenshot({path: 'example.png'});
  await page.pdf({path: 'example.pdf', format: 'A4'});
  await browser.close();
})();

进入正题:

目标:抓取免费代理ip网站,ip列表数据并保存到本地。
网址:http://www.ip3366.net/

基于Node.js开发爬虫工具。 ( puppeteer 与 egg.js 配合使用)_第1张图片
那么,开始吧。

// service 增加方法 (egg.js中,推荐将查询类型操作放在service中)

async spider() {

 const browser = await puppeteer.launch({
    headless: true, // 使用无头浏览器抓取
 });
 
 const page = await browser.newPage();
 
 // 设置客户端
 await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');
 
 await page.goto('http://www.ip3366.net', {
   waitUntil: ['domcontentloaded']
 });
 
 await page.screenshot({path: 'static.png'});
 await browser.close();
 
 return 'success';
}

通过curl调用接口后可看到本地保存的static.png图片,证明已经抓取到网站了。
开始抓取数据,首先查看HTML结构:
基于Node.js开发爬虫工具。 ( puppeteer 与 egg.js 配合使用)_第2张图片
可以看到table在一个id为list的div中。

// 继续刚才代码
async spider() {

 const browser = await puppeteer.launch({
    headless: true, // 使用无头浏览器抓取
 });
 
 const page = await browser.newPage();
 
 // 设置客户端
 await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');
 
 await page.goto('http://www.ip3366.net', {
   waitUntil: ['domcontentloaded']
 });
 
 await page.screenshot({path: 'static.png'});

 const data = await page.evaluate(() => {

      var storage = [];

      // 单页爬取
      var $table = $('#list table tbody');

      if ($table.length) {
        $table.find('tr').each(function (index, item) {

          if (index !== 0) {
            var $td = $(item).find('td');

            storage.push({
              ip: $td.eq(0).html(),
              port: $td.eq(1).html(),
              location: $td.eq(5).html(),
            });
          }

        });

      }

      return storage;

    });

 await browser.close();
 return JSON.stringify(data);
}

来看看结果:

接下来把数据保存到本地文件中,具体代码就不发上来了,大家有兴趣可以看一下我的仓库。
该项目现在还在开发,大家可以持续关注一下~

https://gitee.com/unstorm/unstorm-spider
有什么意见或者建议大家可以issues提给我。

你可能感兴趣的:(Node)