AIGC赋能爬虫——让代码变得简单

518 阅读4分钟

基本素养

何以coding

这里问问大家 我们编写代码的理由是什么? 或者说 我们为什么敲代码? 这里大家自然见仁见智了 有人为了碎银几两 有人为了锻炼提升自己 从根本上来说 我们都是为了需求

以何coding

需求 摆在那里 是不是有人已经开始疯狂coding了 当然 成竹在胸的大佬手到拈来 但对于我们很大一部分人来说 写好伪代码 才是之根本 伪代码能够帮助我们在实际编写程序之前更清晰地思考和描述问题的解决方案。所谓磨刀不误砍柴工

伪代码

这次的任务我们依旧是来爬取豆瓣的排行榜

要爬取数据 我们自然是要先打开门 然后到我们所要的东西 带上就可以去了
  • 根据URL发送http请求 拿到html
  • 根据html 进行分析
  • 拿到电影内容
  • 返回内容

代码编写

细化需求 思路清晰 其次取材而用即可

在页面请求和数据分析方面 node为我们提供了极大的便利

  • npm i request-promise http请求包 发送http请求
  • npm i cheerio 在内存中 模拟DOM对象 解析数据
//引入模块
const request = require('request-promise') 
const cheerio = require('cheerio')

既然要发出请求 自然人家许可我们才能进入 因此 我们需要等待promise 等待await 自然就需要表明异步async定义函数了

async function main(){
    const URL = 'https://movie.douban.com/chart'
    const html = await request({
        url: URL
    })

请求成功 我们便可以获吾所

//将HTML文档加载到`cheerio`中,并返回一个类似于jQuery的对象
let $ = cheerio.load(html)
//使用CSS选择器语法查找id为`content`下的class为`article`下的class为`item`的元素。
const movieNodes = $('#content .article .item')

所谓爬虫 自然要从开始 也需要袋子装着 要多少拿多少 也不必客气

//声明一个空数组 `movieList` 用来存储电影信息。
const movieList = []
//获取某个电影节点的信息并将其添加到 `movieList` 数组中。
 for (let i = 0; i < movieNodes.length; i++) {
        movieList.push(getMovieInfo(movieNodes[i]))
    }
//总要看看拿了多少的
console.log(movieList);

那么怎么到手 getMovieInfo(movieNodes[i]) 而不失优雅 也得讲究

const getMovieInfo = function (node) {
//声明了一个空对象,用于存储电影属性信息。
    let movieInfo = {}
//使用了`load`方法加载 `node`(小节内容)
    let $$ = cheerio.load(node)
 //好了 小节里要什么拿什么吧
 // JavaScript中的对象是一种动态创建的数据结构,
 // 在给对象添加属性时,如果该属性尚未存在,JavaScript会自动创建它。
    movieInfo.title = $$('.pl2 a').text()
    movieInfo.pic = $$('.nbg img').attr('src')
 // 返回信息
    return movieInfo
}
Tip:之前有个疑问 为何要用$作为变量名呢

Cheerio库是一个Node.js中用于处理HTML的轻量级库,它的API设计灵感来源于jQuery。在Cheerio中,$是一个函数,用来初始化Cheerio并选择文档中的元素进行操作。实际上,$在这里只是一个变量名,你可以用其他任何合法的JavaScript变量名替换它,但是使用$已经成为了一个惯例,因为它让人很容易联想到jQuery,并且简洁明了地表达了“选择并操作DOM元素”的意图。

到这里 一个具有不错的可读性和规范的爬虫示例就完成了

大家可以试试结果 不会让你失望的

但是如果AIGC赋能 又会有不一样的乐趣

请欣赏

// 引入所需模块
const request = require('request-promise');
const cheerio = require('cheerio');
const OpenAI = require('openai');

// 初始化OpenAI客户端
const client = new OpenAI({
    apiKey: '',
    baseURL: ''
});

// 主功能函数
async function main() {
    // 获取豆瓣电影榜页面内容
    const URL = 'https://movie.douban.com/chart';
    const html = await request({ url: URL });

    // 使用cheerio加载HTML内容
    let $ = cheerio.load(html);
    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数组的格式返回`;
    
    // 使用OpenAI进行对话生成
    const chatCompletion = await client.chat.completions.create({
        model: 'gpt-3.5-turbo',
        messages: [
            {
                role: 'user',
                content: prompt
            }
        ]
    });
    console.log(chatCompletion.choices);
}

// 调用主功能函数
main();

看起来不相上下嘛

但如果我们需要爬取的数据更大更多 是不是后者更有优势呢 答案自然显而易见 我们只需要在prompt中表述我们要的而不用编写更多的代码。通过简单地描述所需的数据,例如在对话提示信息中指定需要的内容,然后让人工智能根据描述生成相应的代码,可以大大减少手动编写的工作量。这样的方式可以使开发人员更专注于业务逻辑和需求,而不必过多关注具体的实现细节

也许AI永远不会取代人类 但用AI的编写 势必会替换传统的写作

在我看来 二者不可弃其一 需求是我们独有的 代码逻辑是基石 AI只会是工具 人工智能生成的代码可能并不总是完美的,有时仍然需要人工的干预和调整。此外,理解代码的逻辑和结构对于开发人员来说仍然非常重要,因为它是构建稳健和可靠软件的基石。因此,在软件开发中,传统的编写方式和人工智能辅助生成代码并存,二者并不是互斥的选择,而是可以相互补充的。