引言
在这个信息爆炸的时代,谁掌握了数据,谁就握住了开启未来的一把钥匙。而爬虫技术,就像是我们手中的探宝地图,帮助我们在网络的汪洋大海中找到那些隐藏的宝藏。今天,咱们就一起动手,用现代工具和技术,轻松愉快地从网上捞取我们需要的信息。打开你的代码编辑器,咱们这就出发吧!
准备工作
初始化项目
首先,确保你有一个舒适的工作环境,然后我们可以开始设置项目。使用npm init -y快速初始化一个新的Node.js项目,这是基础中的基础。
npm init -y
添加依赖项
接下来,我们需要为项目添加一些必要的工具。可以在package.json文件中加入以下依赖项:
"dependencies": {
"dotenv": "^16.4.7",
"x-crawl": "^10.0.2"
}
这些工具就像是我们探险时的装备,dotenv用来管理环境变量,而x-crawl则是我们的爬虫利器,而安装这些依赖项非常简单,只需要运行下面这条命令:
npm i
现在,一切都准备就绪,可以开始编写代码了!
相关信息介绍
基础介绍
package.json
你可以把这文件想象成项目的“身份证”。它不仅描述了项目的基本信息,还列出了所有运行项目所需的依赖和脚本。
dependencies:这些是项目在生产环境中需要用到的工具和库。devDependencies:开发时的好帮手,帮助我们更高效地工作。scripts:这里存放了一系列命令行的小助手,比如用npm run dev可以轻松启动开发服务器,每个都有它的特别用途。
版本号详解
-
1.0.0 主版本号(大版本号)
- 当你看到
1.0.0时,这标志着软件已经达到了一个稳定的商用状态,没有重大错误,可以直接应用于生产环境。
- 当你看到
-
0.1.0 次版本号(小版本号)
0.1.0通常用于表示在初始版本之后的小幅改进或新功能的添加。这类更新不会改变软件的核心功能,但会增加一些有用的新特性。
-
0.0.1 修订号(补丁号)
0.0.1是最早的版本之一,主要用于修复已知的问题或漏洞。每次修复一个小问题,修订号就会递增。
-
1.0.0-alpha.1 预发布版本
- 带有
alpha、beta等标签的版本表示这些版本还在测试阶段,可能包含未解决的问题或不完整功能。
- 带有
X-Crawl介绍
X-Crawl是一个非常强大的爬虫框架,它使得抓取网页内容变得如同喝咖啡般轻松自在。无论目标是简单的HTML页面,还是复杂的JavaScript渲染网站,X-Crawl都能游刃有余地应对。更有趣的是,当它与AI技术结合时,仿佛打开了一扇通往新世界的大门,让我们能够挖掘出隐藏在网络深处的宝贵信息,发现那些未被注意的数据宝藏。
接下来 代码启动!
确定目标网站并开始编写代码
我们的目标是豆瓣电影排行榜页面,地址为http://movie.douban.com/chart。访问这个链接后你会发现,这里列出了当前热门的电影榜单,而这就是我们今天的目标。
加载环境变量并创建爬虫实例
首先,我们需要加载环境变量,并初始化我们的爬虫工具。这一步就像是准备探险所需的装备,确保一切就绪。
import dotenv from 'dotenv';
dotenv.config();
import {
createCrawl, // 返回爬虫实例
createCrawlOpenAI // 创建一个 openAI 配置项
} from 'x-crawl';
//实例化爬虫应用
const cralwApp = createCrawl({
//爬取次数
maxRetry: 3,
//爬取间隔
intervalTime: { max: 2000, min: 1000 },
});
const crawlOpenAIApp = createCrawlOpenAI({
// 配置 openAI 的请求参数
clientOptions: {
apikey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_API_BASEURL,
},
// 配置默认的模型
defaultModel: {
chatModel: 'gpt-4-turbo-preview',
}
});
进行初步页面抓取
使用.crawlPage()方法进行初步的页面抓取。此时,你可能会看到原始的HTML响应,但这只是冰山一角,重头戏还在后面。
//.crawlPage() 方法来爬取指定网页
cralwApp.crawlPage('http://movie.douban.com/chart')
.then(async (res) => {
console.log(res.data);
})
定位特定元素并提取其内部HTML结构
为了更精准地获取所需信息,我们可以利用选择器来精确定位感兴趣的元素,然后我等待特定的选择器出现,用$eval()提取其内部的HTML结构。
cralwApp.crawlPage('http://movie.douban.com/chart')
.then(async (res) => {
//page 网页的内容,browser 用于爬取的浏览器实例
const { page, browser } = res.data;
//声明了一个选择器 定位网页中的特定元素
const tragetSelector = '.indent';
//.waitForSelector() 方法 等待目标元素出现
await page.waitForSelector(tragetSelector);
// 拿到目标元素 .$eval() 方法
const highlyHTML = await page.$eval(
tragetSelector,
(el) => el.innerHTML
)
console.log(highlyHTML);
})
通过这些步骤,我们已经能够完成基本页面信息的爬取。不过,这只是其中的一部分,更多有趣的事情还在后面等着我们去发现。
使用AI解析并输出结构化数据
最后,利用parseElements()方法与AI的力量,我们将原始HTML转化为结构化的JSON数据,使每部电影的相关信息变得一目了然。这不仅是技术上的飞跃,更像是一场艺术创作,将无序的数据编织成有序的知识。
cralwApp.crawlPage('http://movie.douban.com/chart')
.then(async (res) => {
const { page, browser } = res.data;
const tragetSelector = '.indent';
await page.waitForSelector(tragetSelector);
const highlyHTML = await page.$eval(
tragetSelector,
(el) => el.innerHTML
)
const result = await crawlOpenAIApp.parseElements(
highlyHTML,
`
获取图片链接、电影名称、电影简介、电影评分,
输出格式为json 数组
如“$[{
src: '图片链接',
title: '电影名称',
desc: '电影简介',
score: '电影评分',}]
`
)
browser.close(); // 关闭浏览器
console.log(result); // 打印结果
})
示例输出
假设经过以上步骤后,我们得到了如下结构化的JSON数组作为输出:
在这个过程中,我们不仅完成了页面信息的爬取,还通过AI的力量将其转换成了易于理解和处理的结构化数据。
不过,这里要提醒一句:网络爬虫虽然强大,但使用时需谨慎,尊重网站的robots.txt规则和相关法律法规,不要随意爬取。毕竟,良好的网络公民意识是我们每个人的责任。
一些思考
ES6的魅力
模块化编程
ES6引入了模块化的概念,让代码组织更加清晰合理。通过import和export语句,我们可以轻松地在不同文件之间共享功能。
在这次项目中,我们使用了:
import { createCrawl, createCrawlOpenAI } from 'x-crawl';
来引入爬虫和AI处理的功能。这种做法不仅提高了代码的可维护性,也使得团队协作更加高效。
解构赋值
解构赋值是ES6带来的一个小而美的特性,它使我们能够以一种简洁的方式从复杂对象或数组中提取数据。
const { page, browser } = res.data;
这里,我们将res.data中的page和browser属性一次性解构出来,既直观又方便。无论是对象还是数组,只要你想快速获取其中的内容,解构赋值都是一个不错的选择。
选择器的力量
一个好的选择器就像是一位经验丰富的导游,带领我们在复杂的DOM树中找到正确的路径,而在此次项目中,我们使用了:
const targetSelector = '.indent';
定义了一个选择器,用于精确定位页面上的特定元素。这不仅简化了代码逻辑,也提高了程序的效率和准确性。
方法背后的智慧
在编写爬虫的过程中,我们用到了几个非常实用的方法:
waitForSelector(targetSelector):等待目标元素出现,确保我们不会过早尝试操作尚未加载完成的页面内容。$eval(tragetSelector, (el) => el.innerHTML):通过这个方法,我们可以轻松提取指定元素内部的HTML结构,为后续处理做好准备。parseElements():借助AI的力量,将原始HTML转化为结构化的JSON数据,使得信息一目了然。这一步就像是点石成金,赋予了数据新的生命。
爬虫需知!!!
当你实例化爬虫应用时,设置合理的参数至关重要。比如:
maxRetry: 3, // 设置最大重试次数
intervalTime: { max: 2000, min: 1000 }, // 设置请求间隔时间
这些设置不仅保证了爬虫的稳定性和可靠性,还能有效防止被误认为恶意攻击行为。适当的延迟和重试机制,就像是给爬虫穿上了一层隐形的铠甲,让它在网络世界中畅行无阻。
结语
在这个信息爆炸的时代,掌握爬虫技术不仅能帮我们获取更多有用的信息,更像是一座连接虚拟世界与现实生活之间的桥梁。希望今天的分享能为你打开一扇新的大门,让你在这条探索之路上走得更远!