爬虫超难?AI加持让你轻松变身信息大神!

158 阅读5分钟

引言

在这个信息爆炸的时代,谁掌握了数据,谁就握住了开启未来的一把钥匙。而爬虫技术,就像是我们手中的探宝地图,帮助我们在网络的汪洋大海中找到那些隐藏的宝藏。今天,咱们就一起动手,用现代工具和技术,轻松愉快地从网上捞取我们需要的信息。打开你的代码编辑器,咱们这就出发吧!

准备工作

17.jpg

初始化项目

首先,确保你有一个舒适的工作环境,然后我们可以开始设置项目。使用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. 1.0.0 主版本号(大版本号)

    • 当你看到1.0.0时,这标志着软件已经达到了一个稳定的商用状态,没有重大错误,可以直接应用于生产环境。
  2. 0.1.0 次版本号(小版本号)

    • 0.1.0通常用于表示在初始版本之后的小幅改进或新功能的添加。这类更新不会改变软件的核心功能,但会增加一些有用的新特性。
  3. 0.0.1 修订号(补丁号)

    • 0.0.1是最早的版本之一,主要用于修复已知的问题或漏洞。每次修复一个小问题,修订号就会递增。
  4. 1.0.0-alpha.1 预发布版本

    • 带有alphabeta等标签的版本表示这些版本还在测试阶段,可能包含未解决的问题或不完整功能。

X-Crawl介绍

X-Crawl是一个非常强大的爬虫框架,它使得抓取网页内容变得如同喝咖啡般轻松自在。无论目标是简单的HTML页面,还是复杂的JavaScript渲染网站,X-Crawl都能游刃有余地应对。更有趣的是,当它与AI技术结合时,仿佛打开了一扇通往新世界的大门,让我们能够挖掘出隐藏在网络深处的宝贵信息,发现那些未被注意的数据宝藏。

接下来 代码启动!

22.jpg

确定目标网站并开始编写代码

我们的目标是豆瓣电影排行榜页面,地址为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);
    })

image.png

定位特定元素并提取其内部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);
        })

image.png

通过这些步骤,我们已经能够完成基本页面信息的爬取。不过,这只是其中的一部分,更多有趣的事情还在后面等着我们去发现。

使用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数组作为输出:

image.png

image.png

在这个过程中,我们不仅完成了页面信息的爬取,还通过AI的力量将其转换成了易于理解和处理的结构化数据。

不过,这里要提醒一句:网络爬虫虽然强大,但使用时需谨慎,尊重网站的robots.txt规则和相关法律法规,不要随意爬取。毕竟,良好的网络公民意识是我们每个人的责任。

一些思考

ES6的魅力

模块化编程

ES6引入了模块化的概念,让代码组织更加清晰合理。通过importexport语句,我们可以轻松地在不同文件之间共享功能。

在这次项目中,我们使用了:

import { createCrawl, createCrawlOpenAI } from 'x-crawl';

来引入爬虫和AI处理的功能。这种做法不仅提高了代码的可维护性,也使得团队协作更加高效。

解构赋值

解构赋值是ES6带来的一个小而美的特性,它使我们能够以一种简洁的方式从复杂对象或数组中提取数据。

const { page, browser } = res.data;

这里,我们将res.data中的pagebrowser属性一次性解构出来,既直观又方便。无论是对象还是数组,只要你想快速获取其中的内容,解构赋值都是一个不错的选择。

选择器的力量

一个好的选择器就像是一位经验丰富的导游,带领我们在复杂的DOM树中找到正确的路径,而在此次项目中,我们使用了:

const targetSelector = '.indent';

定义了一个选择器,用于精确定位页面上的特定元素。这不仅简化了代码逻辑,也提高了程序的效率和准确性。

方法背后的智慧

在编写爬虫的过程中,我们用到了几个非常实用的方法:

  1. waitForSelector(targetSelector) :等待目标元素出现,确保我们不会过早尝试操作尚未加载完成的页面内容。
  2. $eval(tragetSelector, (el) => el.innerHTML) :通过这个方法,我们可以轻松提取指定元素内部的HTML结构,为后续处理做好准备。
  3. parseElements() :借助AI的力量,将原始HTML转化为结构化的JSON数据,使得信息一目了然。这一步就像是点石成金,赋予了数据新的生命。

爬虫需知!!!

当你实例化爬虫应用时,设置合理的参数至关重要。比如:

maxRetry: 3, // 设置最大重试次数
intervalTime: { max: 2000, min: 1000 }, // 设置请求间隔时间

这些设置不仅保证了爬虫的稳定性和可靠性,还能有效防止被误认为恶意攻击行为。适当的延迟和重试机制,就像是给爬虫穿上了一层隐形的铠甲,让它在网络世界中畅行无阻。

结语

在这个信息爆炸的时代,掌握爬虫技术不仅能帮我们获取更多有用的信息,更像是一座连接虚拟世界与现实生活之间的桥梁。希望今天的分享能为你打开一扇新的大门,让你在这条探索之路上走得更远!