刚学了点爬虫知识,立马就想到了我们的豆瓣老兄,今天就来爬上一爬(来了牢弟)。
一、AI爬虫的基本原理
AI爬虫的原理在于它结合了自动化访问、解析网页内容以及人工智能算法来处理动态变化的网站设计和内容。
二、开发前准备
1新建一个x-crawl文件夹然后在集成终端打开(备注:vscode编译器),执行npm init -y 命令。 之后得到package.json文件(确保你安装了node.js)。对package.json文件作如下添加和修改
修改前
修改后
命令行输入npm i json-server,最后建一个index.mjs(作为 ES6 模块来处理)编写代码。 最终文件目录:
代码实例:
// es6 模块化 导包
// 解构运算符
import {
createCrawl, // 返回爬虫实例
createCrawlOpenAI // openai 配置项
} from 'x-crawl';
// 实例化爬虫应用
const crawlApp = createCrawl({
maxRetry: 3,
intervalTime: { max: 2000, min: 1000}
})
const crawlOpenAIApp = createCrawlOpenAI({
clientOptions: {
apiKey: 'bbb',
baseURL: 'https://api.302.ai/v1/'
},
defaultModel: {
chatModel: 'gpt-4-turbo-preview'
}
})
cralwApp.crawlPage('https://movie.douban.com/chart')
.then(async (res) => {
const {page,browser}= res.data;
const targetSelector='.indent';
await page.waitForSelector(targetSelector);
const highlyHTML= await page.$eval(
targetSelector,
(el) => el.innerHTML);
// console.log(highlyHTML);
const result = await crawlOpenAIApp.parseElements(
highlyHTML,
`获取图片链接、电影名称、平分、简介
输出格式为json 数组.
如:[{
"src":"....",
"title":"...",
"score":"...",
"desc":"..."
}]
`
)
browser.close();
console.log(result);
})
代码解释:
通过 import
语句从 x-crawl
模块中导入 createCrawl
和 createCrawlOpenAI
两个函数。createCrawl
函数用于创建一个爬虫应用实例,createCrawlOpenAI
函数用于配置 openai
的相关选项。
接着,使用 createCrawl
函数创建了一个名为 crawlApp
的爬虫应用实例,在调用该函数时传入一个对象作为参数,其中 maxRetry
属性设置为 3,表示最大重试次数为 3,intervalTime
属性是一个对象,包含 max
为 2000 和 min
为 1000 的时间范围,可能用于控制爬虫的请求间隔时间。
然后,使用 createCrawlOpenAI
函数创建了一个名为 crawlOpenAIApp
的 openai
配置实例,传入的对象包含 clientOptions
,其中 apiKey
为 'bbb'
,baseURL
为 'https://api.302.ai/v1/'
,以及 defaultModel
包含 chatModel
为 'gpt-4-turbo-preview'
,用于配置 openai
的客户端选项和默认模型。
之后,调用 cralwApp.crawlPage
方法对 https://movie.douban.com/chart
页面进行爬取操作,这里存在一个错误,应该是 crawlApp
而不是 cralwApp
。该方法返回一个 Promise
,后续使用 .then
方法处理爬取结果。
在 .then
方法中,接收一个异步函数作为回调,当 crawlPage
操作完成后,会将结果作为 res
参数传递给这个回调函数。从 res.data
中使用解构赋值提取出 page
和 browser
两个属性,它们可能是与页面操作和浏览器实例相关的信息。
定义了一个常量 targetSelector
并赋值为 '.indent'
,用于在页面中定位元素。
使用 page.waitForSelector
方法等待页面中出现与 targetSelector
匹配的元素,使用 await
关键字确保在元素出现或超时之前暂停程序执行。
使用 page.$eval
方法查找与 targetSelector
匹配的元素,将该元素作为参数传递给回调函数 (el) => el.innerHTML
,提取该元素的 innerHTML
属性,将结果存储在 highlyHTML
变量中。
调用 crawlOpenAIApp.parseElements
方法,将 highlyHTML
和一段描述解析要求的字符串作为参数,期望将结果以 JSON 数组的形式输出。
最后,调用 browser.close()
关闭浏览器,并使用 console.log
打印 result
。