zoukankan      html  css  js  c++  java
  • 基于Node 的爬虫

    // superagent 是用来发起请求的,是一个轻量的,渐进式的ajax api,可读性好,学习曲线低,内部依赖nodejs原生的请求api,适用于nodejs环境下.,也可以使用http发起请求
    // superagent-charset防止爬取下来的数据乱码,更改字符格式
    // cheerio为服务器特别定制的,快速、灵活、实施的jQuery核心实现.。
    
    const superagent = require("superagent");
    const charset = require("superagent-charset");
    charset(superagent);
    const cheerio = require("cheerio");
    const fs = require("fs");
    
    /**
     * 批量采集图片类
     * @params String url 链接
     * @params Number pageStart 起始页
     * @params String charset 页面编码
     * @params Number pageStep 步长
     * @params Number pageTotal 总页面数
     */
    class ReptilePic {
      constructor(url, pageStart, charset, pageStep, pageTotal) {
        this.url = url;
        this.pageStart = pageStart || 1;
        this.charset = charset || "utf8";
        this.pageStep = pageStep || 1;
        this.pageTotal = pageTotal || 1;
        this.pageLists = []; //页面链接集合
        this.picLists = []; //图片集合
        this.init();
      }
      init() {
        //1.生成列表页面link
        this.getPageList();
        //2.请求每个列表页面,生成图片list
        //3.下载图片(校验目录+保存)
      }
      /**
       * 生成列表页面link[]
       * 匹配(*) 替换为动态页面中的变量 可以是0-9 a-z A-Z
       * 后期加入循环多个变量 匹配功能
       */
      getPageList() {
        let reg = /((*))/g;
        if (reg.test(this.url)) {
          //   console.log("11------------", RegExp.$1); //*
          let len = parseInt(this.pageTotal / this.pageStep);
          for (let i = this.pageStart; i <= len; i += this.pageStep) {
            this.pageLists.push(this.url.replace(reg, i));
          }
          //   console.log("pageList----------", this.pageLists);
          console.log("生成列表list完成");
          console.log("开始采集图片地址list");
          this.getPicList(0);
        }
      }
      //2.请求每个列表页面,生成图片list
      getPicList(num) {
        // this.pageLists
        if (num > this.pageLists.length - 1) {
          console.log("生成图片list完成");
          console.log("开始下载图片");
          this.downLoadPic(0);
          return;
        } else {
          superagent
            .get(this.pageLists[num])
            .buffer(true)
            .charset(this.charset)
            .end((err, response) => {
              if (err) throw err;
              var $ = cheerio.load(response.text);
              //采集规则(可提出来自定义)
              $("div.g-main-bg ul.g-gxlist-imgbox li a").each((idx, element) => {
                let $element = $(element);
                let title = $(element).attr("title");
                let imgSrc = $element.find("img").attr("src");
                this.picLists.push({
                  title,
                  imgSrc,
                });
              });
              console.log(`开始采集第${num + 1}页图片地址`);
              num++;
              this.getPicList(num);
            });
        }
      }
      //3.下载图片(校验目录+保存)
      downLoadPic(index) {
        //批量下载图片
        //1.创建目录(后期自定义目录和文件名)
        /*     let dir = __dirname + "/imgs";
        fs.mkdir(dir, { recursive: true }, (err) => {
          if (err) throw err;
        }); */
    
        //2.下载  this.picLists = item   index下标
        if (index > this.picLists.length - 1) {
          console.log("批量下载图片完成");
          return;
        } else {
          let imgSrc = this.picLists[index].imgSrc;
          let dir = __dirname + "/imgs";
          let ws = fs.createWriteStream(
            dir + `/${this.picLists[index].title}${index}.png`
          ); //这里为了省事,我就直接用下标命名了;
          if (imgSrc.indexOf("http") !== -1) {
            superagent(imgSrc).pipe(ws);
          }
          ws.on("finish", () => {
            console.log(`${this.picLists[index].title}-----------下载完成`);
            index++
            this.downLoadPic(index)
          });
        }
      }
    }
    
    
    
    let url = "https://www.qqtn.com/tx/weixintx_(*).html";
    new ReptilePic(url, 1, "gb2312", 1, 4);
  • 相关阅读:
    《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)
    YII 小模块功能
    Netbeans代码配色主题大搜集
    opensuse 启动巨慢 解决方法 90s多
    opensuse 安装 网易云音乐 rpm netease music
    linux qq rpm deb opensuse
    openSUSE 安装 alien
    第一行代码 Android 第2版
    Android Studio AVD 虚拟机 联网 失败
    docker error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuratio
  • 原文地址:https://www.cnblogs.com/lguow/p/14272449.html
Copyright © 2011-2022 走看看