用传统编程和AIGC的融合来解决经典爬虫问题!

131 阅读6分钟

传统编程与AIGC的融合

在AI大模型来临的时代,传统编程与AIGC的融合,是技术发展的必然趋势,它不仅让机器更加智能地参与到创作和决策过程中,也为人类开发者提供了强有力的辅助工具,共同推动着数字时代的创新与进步。传统编程与AIGC的融合,旨在通过AI的力量提升开发效率、创新应用功能,并非完全替代人类编程,而是形成互补。开发者可以将更多精力集中在创造性思维和解决复杂问题上,而让AI处理那些繁琐、重复的任务,共同推动软件开发进入一个更高效、智能化的新时代。所以在未来,会AIGC编程的程序员一定会替代掉只会传统编程的程序员,接下来,我们可以从以下几个维度来深入理解这一趋势.

image.png

为何要编程?

在座的各位有没有想过这样一个问题,我们为什么要编程?为什么要coding?也许有的人会说是,为了搞钱,那也确实,我们干程序员这一行,目的基本就是搞钱,因为高薪嘛。再深入地去思考这个问题,你就会发现,编程的本质,其实就是为了解决需求,解决问题,面向需求编程。接下来,我会以爬虫为需求的问题来给大家展示我们今天的主题,传统编程与AIGC的融合!

爬虫

首先我们要分析,爬取豆瓣电影是属于前端项目还是后端项目,很明显,这是一个关乎数据处理方面的问题,那就是后端项目;对此我们选择的技术栈就是node,node 是 js 后端运行环境。

经典传统编程

何为经典传统编程?经典传统编程是有一定的架构和默认优质操作的;重视建立清晰的系统架构设计,确保代码组织有序、易于理解和维护,采用经过验证的最佳实践和设计模式。经典传统编程在于标准,如同流水式的操作,传统编程过程中遵循明确的标准和规范,如同工厂生产线一样有条不紊地进行。

初始化后端项目:

npm init -y

得到项目描述文件package.json:

image.png

创建入口文件 main.js:

image.png

编写伪代码:

    // 伪代码
    // 根据url 发送一个http请求 拿到html 
    // 根据html 分析,拿到电影内容
    // 返回内容

安装 request-promise 模块,发出http请求

npm i request-promise

安装 cheerio 模块,可以在内存中,模拟DOM对象

npm i cheerio

准备工作做好后,我们就可以来到需要爬取的页面上对需要爬取的数据进行分析,要怎么拿到我们想要的数据,这时候我们就要用到选择器来读取数据了;

image.png

如上图右侧方控制台里面的代码:

document + 选择器

// 选取页面中所有 class 名为 'article' 的元素内部的所有 <table> 元素
document.querySelectorAll('.article table')
// 从上一步选取的表格中选取第一个表格内的第一个 class 名为 'rating_nums' 的元素
document.querySelectorAll('.article table')[0].querySelector('.rating_nums')
// 获取上述选取的元素的innerText属性,即该元素内的文本内容
document.querySelectorAll('.article table')[0].querySelector('.rating_nums').innerText

利用刚才导入的cheerio包,就可以将html字符串加载到内存中.

传统编程代码:

const request = require('request-promise');// 引入需要的模块
const cheerio = require('cheerio');

// 入口文件
// 异步的
// 将 douban 网页的电影列表html,爬取,
// 返回json数组,每一电影项包含name,desc,score...
// 单点入口 
async function main() {
    // 代码 分布细化,程序员思维
    // 伪代码
    // 根据url 发送一个http请求 拿到html 
    // 根据html 分析,拿到电影内容
    // 返回内容
    // await LLM 
    // 良好的编程规范
    const url = "https://movie.douban.com/chart";
    // http 请求 html  408  基于请求
    // 攻击
    const html = await request({
        url: url
    })
    // console.log(html);

    
    
    // 代码的可读性,可能要比功能更重要
    // html分析 document + 选择器 cheerio 满足
    // 编程素养 将html字符串加载到内存中,$ = Document
    let $ = cheerio.load(html);
    // console.log($('.article table').length);
    // 严谨
    const movieNodes = $('#content .article .item');
    

    
    const movieList = [];
    for (let i = 0; i < movieNodes.length; i++){
        // 封装?
        // 将一段电影的html解析,剥离出去,
        // 这段功能相对独立 复用的
        // main 比较复杂了,一个函数代码超过10行代码,一定可以再分函数
        movieList.push(getMovieInfo(movieNodes[i]));
    }
    console.log(movieList);
}

const getMovieInfo = function (node) {
    let movieInfo = {};
    // 将tr加载进内存
    let $$ = cheerio.load(node);
    let title = $$('.pl2 a').text()
    let pic = $$('.nbg img').attr('src')
    // console.log(pic);
    // console.log(title);
    let info = $$('p.pl').text()
    let rating_nums = $$('.rating_nums').text()

    movieInfo.title = title;
    movieInfo.pic = pic;
    movieInfo.info = info;
    movieInfo.rating_nums = rating_nums;
    // console.log(movieInfo);

    return movieInfo    
}

main()

运行就能拿到结果:

image.png

在如上的经典传统编程代码中,有哪些部分是可以交给AI的呢?让我们一起再结合AIGC的力量,完成一种新的编程模式.

融合AIGC

融合AIGC后,我们就能以对话的方式,明确我们的prompt,把需求交给AI,AI大模型就会给我们生成你想要的数据内容,直接给我们省去了html parse的步骤;有1/3的流程性代码不需要我们去编写了.

安装openai包:c

npm i openai

代码:

const request = require('request-promise');// 引入需要的模块
const cheerio = require('cheerio');
// AIGC LLM 生成式内容
// tr 字符串要生成movie json 对象
// input prompt
const OpenAI = require('openai');

// 实例化 OpenAI 配置
const client = new OpenAI({
    // 凭证 密钥  算力收费  token
    apiKey: '*****',
    baseURL: 'https://api.chatanywhere.tech/v1'
})

// 入口文件
// 异步的
// 将 douban 网页的电影列表html,爬取,
// 返回json数组,每一电影项包含name,desc,score...
// 单点入口 
async function main() {
    // 代码 分布细化,程序员思维
    // 伪代码
    // 根据url 发送一个http请求 拿到html 
    // 根据html 分析,拿到电影内容
    // 返回内容
    // await LLM 
    // 良好的编程规范
    const url = "https://movie.douban.com/chart";
    // http 请求 html  408  基于请求
    // 攻击
    const html = await request({
        url: url
    })
    // console.log(html);

    
    
    // 代码的可读性,可能要比功能更重要
    // html分析 document + 选择器 cheerio 满足
    // 编程素养 将html字符串加载到内存中,$ = Document
    let $ = cheerio.load(html);
    // console.log($('.article table').length);
    // 严谨
    const movieNodes = $('#content .article .item');
    let movie_html = ''
    for(let i = 0; i < 2; i++) {
        movie_html += cheerio.load(movieNodes[i]).html()
    }
    let prompt = `
    ${movie_html}
    这是一段电影列表html,请获取电影名(name),封面链接(picture),
    简介(info),评分(score),评论人数(commentsNumber),
    请使用括号的单词作为属性名,以JSON的格式返回。
    `
    const chatCompletion = await client.chat.completions.create({
        model : 'gpt-3.5-turbo',// 适合聊天的模型 很多种大模型
        messages: [
            {
                role: 'user',
                content: prompt
            }
        ]
    })
    console.log(chatCompletion.choices);

}

main()

运行:

image.png

同样也能爬取到网页内容,而且更快更便捷,这就是传统编程和AIGC的融合!

小结

传统编程与AI的融合,标志着编程进入了一个新的时代。它不仅保留了编程艺术的精髓——逻辑思维与问题解决,还引入了智能的辅助力量,让开发者能够更加高效地创造价值。在这个融合的过程中,我们期待看到更多的创新,不仅是技术上的突破,更是对编程理念和工作方式的根本性变革。未来,每一个程序员都可能成为AI辅助下高效创造的“超级程序员”,共同推动技术边界,解锁数字世界的新潜能。