随着互联网的发展,网站的数据量越来越大,人工采集数据的成本也越来越高。因此,爬虫技术在数据采集中得到了广泛应用。然而,许多网站为了保护自己的数据安全,采取了反爬机制,对爬虫进行了限制。在本文中,我们将介绍如何使用 Node.js 编写一个爬虫,并规避反爬机制。
什么是爬虫
爬虫是一种自动化程序,可以模拟人的行为,从网站上抓取数据。爬虫可以访问网站的 HTML 页面,解析页面中的内容,提取需要的信息,并将其存储到本地或数据库中。
Node.js 介绍
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可以在服务器端运行 JavaScript 代码。Node.js 具有轻量级、高效、事件驱动等特点,非常适合编写爬虫程序。
如何规避反爬机制
1. 伪装 User-Agent
User-Agent 是 HTTP 请求头中的一部分,用于标识客户端的信息。许多网站会根据 User-Agent 的值来判断是否为爬虫,因此可以通过伪装 User-Agent 来规避反爬机制。以下是一个示例代码:
// javascriptcn.com 代码示例 const request = require('request'); const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'; request({ url: 'https://example.com', headers: { 'User-Agent': userAgent } }, (error, response, body) => { console.log(body); });
2. 使用代理 IP
网站可以通过 IP 地址来判断是否为爬虫,因此可以通过使用代理 IP 来规避反爬机制。以下是一个示例代码:
// javascriptcn.com 代码示例 const request = require('request'); const proxyUrl = 'http://127.0.0.1:8080'; request({ url: 'https://example.com', proxy: proxyUrl }, (error, response, body) => { console.log(body); });
3. 随机延时访问
网站可以通过短时间内多次访问同一个 IP 地址来判断是否为爬虫,因此可以通过随机延时访问来规避反爬机制。以下是一个示例代码:
// javascriptcn.com 代码示例 const request = require('request'); function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function crawl() { for (let i = 1; i <= 10; i++) { await delay(Math.floor(Math.random() * 5000)); request('https://example.com', (error, response, body) => { console.log(body); }); } } crawl();
实战演练
在本节中,我们将使用 Node.js 编写一个爬虫程序,从豆瓣电影 Top250 中获取电影的名称、评分和导演信息,并将其存储到 MongoDB 数据库中。
1. 安装依赖
首先,我们需要安装以下依赖:
- request:用于发起 HTTP 请求。
- cheerio:用于解析 HTML 页面。
- mongoose:用于操作 MongoDB 数据库。
npm install request cheerio mongoose --save
2. 编写爬虫程序
以下是一个示例代码:
// javascriptcn.com 代码示例 const request = require('request'); const cheerio = require('cheerio'); const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/douban', { useNewUrlParser: true }); const movieSchema = new mongoose.Schema({ name: String, score: Number, director: String }); const Movie = mongoose.model('Movie', movieSchema); function crawl(start, end) { if (start > end) return; const url = `https://movie.douban.com/top250?start=${start}&filter=`; request(url, (error, response, body) => { if (error) { console.error(error); return crawl(start, end); } const $ = cheerio.load(body); $('.item').each(function() { const name = $(this).find('.title').text().trim(); const score = Number($(this).find('.rating_num').text().trim()); const director = $(this).find('.bd p').eq(0).text().split('导演:')[1].split('主演:')[0].trim(); const movie = new Movie({ name, score, director }); movie.save((error) => { if (error) console.error(error); }); }); crawl(start + 25, end); }); } crawl(0, 225);
3. 运行程序
在终端中执行以下命令:
node index.js
程序将从豆瓣电影 Top250 中获取电影的名称、评分和导演信息,并将其存储到 MongoDB 数据库中。
总结
本文介绍了如何使用 Node.js 编写一个爬虫,并规避反爬机制。我们使用了伪装 User-Agent、使用代理 IP 和随机延时访问等技术来规避反爬机制。最后,我们还实战演练了从豆瓣电影 Top250 中获取电影的名称、评分和导演信息,并将其存储到 MongoDB 数据库中。通过本文的学习,相信读者已经掌握了 Node.js 爬虫的基本技能,可以在实际项目中应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6555bab6d2f5e1655d019e5b