xixixixixixixi1231 2023-03-08 21:01 采纳率: 15.8%
浏览 43
已结题

node图片爬取和上传

需求:在A电脑内用node和superagent爬取头像和证件号,将头像nase64编码后和身份证一起保存在excel。后在B电脑内用node访问接口,参数是excel内的头像和证件号。数据可能几百上千条,所以批量访问的时候需要设置同步异步的问题,且B电脑的访问链接由于参数是图片base64,返回结果可能不是很快,希望能得到完整代码和最优解。能有多线程什么最好。

  • 写回答

7条回答

  • 「已注销」 2023-03-08 21:31
    关注

    “Devil组”引证GPT后的撰写:
    在A电脑内使用以下代码来爬取并保存图片和证件号:

    const superagent = require('superagent');
    const cheerio = require('cheerio');
    const xlsx = require('xlsx');
    const async = require('async');
    const fs = require('fs');
    
    const filename = 'data.xlsx';
    
    const getImagesAndIds = (callback) => {
      const images = [];
      const ids = [];
      const urls = [
        'http://example.com/user1',
        'http://example.com/user2',
        // add more urls as needed
      ];
    
      async.eachSeries(urls, (url, next) => {
        superagent.get(url).end((err, res) => {
          if (err) return next(err);
          const $ = cheerio.load(res.text);
          const image = $('img.avatar').attr('src');
          const id = $('#id').text();
          images.push(image);
          ids.push(id);
          next();
        });
      }, (err) => {
        if (err) return callback(err);
        const workbook = xlsx.utils.book_new();
        const worksheet = xlsx.utils.json_to_sheet(ids.map((id, i) => ({id, image: images[i]})));
        xlsx.utils.book_append_sheet(workbook, worksheet, 'data');
        xlsx.writeFile(workbook, filename);
        callback(null);
      });
    };
    
    getImagesAndIds((err) => {
      if (err) console.error(err);
      console.log('Done');
    });
    
    
    

    在B电脑内使用以下代码来读取Excel文件,并将图片和证件号码上传到远程API:

    const superagent = require('superagent');
    const xlsx = require('xlsx');
    const async = require('async');
    
    const apiUrl = 'http://example.com/api';
    
    const processData = (data, callback) => {
      async.eachLimit(data, 5, (row, next) => {
        const { id, image } = row;
        superagent.post(apiUrl)
          .send({ id, image })
          .end((err, res) => {
            if (err) console.error(err);
            next();
          });
      }, (err) => {
        if (err) return callback(err);
        callback(null);
      });
    };
    
    const workbook = xlsx.readFile('data.xlsx');
    const worksheet = workbook.Sheets['data'];
    const data = xlsx.utils.sheet_to_json(worksheet);
    
    processData(data, (err) => {
      if (err) console.error(err);
      console.log('Done');
    });
    
    
    

    用了async模块来处理异步操作。在A电脑中,用了async.eachSeries来依次爬取每个URL,并在完成后保存数据到Excel文件中。在B电脑中,用了async.eachLimit来限制并发数,并依次处理Excel文件中的每一行数据,并将数据上传到远程API。

    这个代码还使用了superagent模块来进行HTTP请求,并使用了cheerio模块来解析HTML。用了xlsx模块来处理Excel文件。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月12日
  • 创建了问题 3月8日