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);
  • 相关阅读:
    Event notifications
    twobin博客样式
    Http协议
    ASP.NET Web API自身对CORS的支持: CORS授权检验的实施
    理解计算机系统3
    游标-Oracle游标汇总
    Oracle10g 回收站及彻底删除table : drop table xx purge
    ora-01031:insufficient privileges
    &&运算符和||运算符的优先级问题 专题
    oracle connect by 和start with
  • 原文地址:https://www.cnblogs.com/lguow/p/14272449.html
Copyright © 2011-2022 走看看