# 怎么用Node.js写一个代理爬虫网站 ## 引言 在网络数据采集领域,代理爬虫是突破反爬机制、实现分布式抓取的核心工具。本文将详细讲解如何使用Node.js构建一个完整的代理爬虫网站,涵盖从基础原理到具体实现的全部流程。 ## 一、项目基础准备 ### 1.1 环境要求 - Node.js 14+ 版本 - npm/yarn 包管理器 - 推荐使用VS Code作为开发工具 ### 1.2 初始化项目 ```bash mkdir proxy-crawler cd proxy-crawler npm init -y
npm install axios cheerio puppeteer express
创建crawler.js
文件:
const axios = require('axios'); const cheerio = require('cheerio'); async function fetchProxyList() { try { const response = await axios.get('https://www.free-proxy-list.com'); const $ = cheerio.load(response.data); const proxies = []; $('table tbody tr').each((i, el) => { const ip = $(el).find('td:nth-child(1)').text(); const port = $(el).find('td:nth-child(2)').text(); proxies.push(`${ip}:${port}`); }); return proxies; } catch (error) { console.error('抓取失败:', error); return []; } }
对于JavaScript渲染的页面:
const puppeteer = require('puppeteer'); async function dynamicCrawler() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://proxy-scraper.com'); await page.waitForSelector('.proxy-list'); const proxies = await page.evaluate(() => { return Array.from(document.querySelectorAll('.proxy-row')) .map(el => `${el.querySelector('.ip').textContent}:${el.querySelector('.port').textContent}`); }); await browser.close(); return proxies; }
server.js
基础结构:
const express = require('express'); const app = express(); const port = 3000; // 引入爬虫模块 const { fetchProxyList } = require('./crawler'); app.get('/proxies', async (req, res) => { const proxies = await fetchProxyList(); res.json({ count: proxies.length, data: proxies }); }); app.listen(port, () => { console.log(`服务运行在 http://localhost:${port}`); });
使用node-cron
实现定时更新:
npm install node-cron
const cron = require('node-cron'); const Proxy = require('./models/proxy'); // 假设有MongoDB模型 // 每30分钟更新一次 cron.schedule('*/30 * * * *', async () => { console.log('开始定时抓取代理...'); const proxies = await fetchProxyList(); await Proxy.bulkUpsert(proxies); // 批量更新数据库 });
安装Mongoose:
npm install mongoose
定义Proxy模型:
// models/proxy.js const mongoose = require('mongoose'); const proxySchema = new mongoose.Schema({ ip: { type: String, required: true }, port: { type: Number, required: true }, protocol: { type: String, enum: ['http', 'https', 'socks4', 'socks5'] }, lastChecked: { type: Date, default: Date.now }, speed: Number }); module.exports = mongoose.model('Proxy', proxySchema);
npm install ioredis
const Redis = require('ioredis'); const redis = new Redis(); // 缓存热门代理 async function cacheProxies() { const proxies = await Proxy.find().limit(50); await redis.set('hot-proxies', JSON.stringify(proxies), 'EX', 3600); }
async function validateProxy(proxy) { try { const start = Date.now(); await axios.get('http://example.com', { proxy: { host: proxy.ip, port: proxy.port }, timeout: 5000 }); const speed = Date.now() - start; await Proxy.updateOne({ _id: proxy._id }, { speed, lastChecked: new Date() }); return true; } catch { await Proxy.deleteOne({ _id: proxy._id }); return false; } }
使用PM2实现集群:
npm install pm2 -g pm2 start server.js -i max
<!-- public/index.html --> <!DOCTYPE html> <html> <head> <title>代理爬虫仪表盘</title> </head> <body> <div id="proxy-list"></div> <script src="/app.js"></script> </body> </html>
// public/app.js fetch('/proxies') .then(res => res.json()) .then(data => { const list = document.getElementById('proxy-list'); data.forEach(proxy => { const item = document.createElement('div'); item.textContent = `${proxy.ip}:${proxy.port}`; list.appendChild(item); }); });
Dockerfile
示例:
FROM node:16 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["node", "server.js"]
本文完整演示了如何用Node.js构建代理爬虫网站,关键点包括: - 多源代理数据采集 - 定时任务维护代理池 - 代理有效性验证机制 - 前后端完整实现
完整项目代码可参考GitHub仓库:[示例仓库链接]
下一步可以扩展的功能: - 添加用户认证系统 - 实现API访问控制 - 开发浏览器扩展插件 - 构建移动端应用 “`
注:实际代码实现时需要根据具体目标网站结构调整选择器,并遵守robots.txt协议和网站服务条款。建议在开发前咨询法律意见。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。