当前位置: 首页 > article >正文

使用Koa2快速搭建一个爬虫项目

使用 Koa2 搭建爬虫项目,可以结合其异步处理能力和中间件机制,快速构建一个灵活的爬虫服务。以下是具体实现步骤和代码示例:


一、技术选型

工具用途
Koa2提供 Web 服务基础架构
axios发送 HTTP 请求获取网页内容
cheerio解析 HTML(类似 jQuery 语法)
node-schedule定时任务调度
MongoDB存储爬取数据(可选)

二、实现步骤

1. 初始化项目
mkdir koa-crawler && cd koa-crawler
npm init -y
npm install koa @koa/router axios cheerio node-schedule
2. 创建 Koa2 基础服务
// app.js
const Koa = require('koa');
const Router = require('@koa/router');

const app = new Koa();
const router = new Router();

// 基础路由测试
router.get('/', (ctx) => {
  ctx.body = 'Koa2 Crawler Running!';
});

app.use(router.routes());
app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});
3. 编写爬虫核心逻辑
// crawler.js
const axios = require('axios');
const cheerio = require('cheerio');

// 示例:爬取豆瓣电影 Top250
async function fetchDoubanMovies() {
  try {
    const url = 'https://movie.douban.com/top250';
    const { data } = await axios.get(url, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
      }
    });

    const $ = cheerio.load(data);
    const movies = [];

    $('.item').each((index, element) => {
      const title = $(element).find('.title').text();
      const rating = $(element).find('.rating_num').text();
      movies.push({ title, rating });
    });

    return movies;
  } catch (error) {
    console.error('爬取失败:', error.message);
    return [];
  }
}

module.exports = { fetchDoubanMovies };
4. 将爬虫接入 Koa2 路由
// 修改 app.js
const { fetchDoubanMovies } = require('./crawler');

// 添加爬虫接口路由
router.get('/movies', async (ctx) => {
  const movies = await fetchDoubanMovies();
  ctx.body = {
    code: 200,
    data: movies
  };
});
5. 添加定时任务(可选)
// schedule.js
const schedule = require('node-schedule');
const { fetchDoubanMovies } = require('./crawler');

// 每天凌晨 2 点执行爬虫
schedule.scheduleJob('0 2 * * *', async () => {
  console.log('开始定时爬取...');
  const movies = await fetchDoubanMovies();
  // 此处可添加存储逻辑(如写入 MongoDB)
  console.log(`爬取完成,共获取 ${movies.length} 条数据`);
});

在 app.js 中引入定时任务:

// app.js 顶部添加
require('./schedule');
6. 运行项目
node app.js

访问 http://localhost:3000/movies 即可获取爬取结果。


三、高级优化

  1. 反爬策略

    • 随机 User-Agent:使用 random-useragent 库

    • 代理 IP 池:结合第三方服务(如快代理)

    • 请求延迟:使用 setTimeout 控制请求频率

  2. 数据存储

    // 使用 Mongoose 存储到 MongoDB
    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost:27017/crawler');
    
    const movieSchema = new mongoose.Schema({
      title: String,
      rating: String
    });
    
    const Movie = mongoose.model('Movie', movieSchema);
    
    // 在爬虫函数中保存数据
    await Movie.insertMany(movies);
  3. 错误重试

    // 使用 retry 库实现请求重试
    const retry = require('retry');
    
    function fetchWithRetry(url, retries = 3) {
      return new Promise((resolve, reject) => {
        const operation = retry.operation({ retries });
        operation.attempt(async () => {
          try {
            const { data } = await axios.get(url);
            resolve(data);
          } catch (error) {
            if (operation.retry(error)) return;
            reject(error);
          }
        });
      });
    }

四、完整项目结构

koa-crawler/
├── app.js          # Koa 主入口
├── crawler.js      # 爬虫核心逻辑
├── schedule.js     # 定时任务
├── models/         # MongoDB 数据模型
└── utils/
    └── proxy.js    # 代理 IP 管理

注意事项

  1. 遵守 robots.txt 规则(如豆瓣禁止爬取:https://www.douban.com/robots.txt

  2. 控制请求频率,避免对目标服务器造成压力

  3. 敏感数据需加密存储(如手机号、邮箱)

  4. 分布式爬虫需考虑任务队列(如 Redis + Bull)

通过 Koa2 的中间件机制,可以轻松扩展身份验证、日志记录等功能,快速构建一个企业级爬虫服务。


http://www.kler.cn/a/591736.html

相关文章:

  • C语言之数据结构:链表(一)
  • Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)
  • Spark 解析_spark.sparkContext.getConf().getAll()
  • Kafka详解——介绍与部署
  • 【Linux】Bash是什么?怎么使用?
  • 森林防火预警广播监控系统:以4G为纽带架构融合智能广播、远程监控、AI智能识别、告警提示、太阳能供电于一体的新一代森林防火预警系统
  • LeetCode 392. 判断子序列 java题解
  • 在 Ubuntu 中配置 NFS 共享服务的完整指南
  • C++ —— 线程同步(互斥锁)
  • OpenCV图像拼接(1)概述
  • 【Vue3+Vite指南】全局引入SCSS文件后出现Undefined mixin?一招解决命名空间陷阱!
  • 机器视觉工程师如何学习C#通讯
  • Flask实时监控:打造智能多设备在线离线检测平台(升级版)
  • 移动版 Edge :插件安装功能全面指南
  • SpringBoot-MVC配置类与 Controller 的扫描
  • 【Java】链表(LinkedList)(图文版)
  • QT学习笔记1
  • c语言笔记 存储期
  • 【实习经历Two:参与开源项目,学习并应用Git】
  • 解决qt中自定插件加载失败,不显示问题。