AIGC下的编程:用爬虫爬取豆瓣电影中的信息

406 阅读7分钟

前言

何为编程?首先编程一定是现有一个目的(需求),根据需求做编程,我们想通过编程来解决世界上各种各样的问题。那么在传统意义上的编程,我们需要有扎实的编程基础(计算机网络、计算机组成原理...)等等相关理论知识,其次将大问题化小,不断细分我们的任务,分析我们要解决的问题如何解决,就像做算法题一样,可以先想出伪代码,什么语言都不重要,首先要有思想,有逻辑,不同的语言只是语法不同而已。最后我们将每一个功能模块化,封装、复用,这样有利于代码的可读性和可维护性。

那么在2024,我认为我们应当好好把握AI元年给我们带来的红利,我们可以基于LLM大模型去做很多我们曾经想都不敢想的事情,在这样一个背景下,就出现了大量的prompt engineer,我们只需要给我们的大模型下指令,告诉他我们想做一件什么事情,这个事情大模型非常擅长,专业的事情交给专业的人去做,我们不再需要一味的学习各种API然后各种API迭代不断的学习不断的忘记。

接下来我通过用爬虫做豆瓣电影中信息提取这么一个案例展开说说,传统编程到AIGC下的转变。

movie.douban.com/chart 豆瓣电影的网址

正文

传统意义下的编程方式

使用 request-promisecheeriofs 和 util 等模块进行网页爬取并将数据保存为 JSON 文件的代码。通过遍历豆瓣电影 Top250 页面,获取电影信息并保存到数组中,最后将数据写入 JSON 文件。

具体来说(秉承他有我拿(爬虫)思想)

  1. 先发生一个HTTP请求,用url发生一个GET请求  url:movie.douban.com/chart
  2. 响应的是HTML(字符串)
  3. 解析HTML字符串,可以像css选择器一样,拿到电影列表
  4. 最后将所有的电影对象组成数组,以json数组的方式返回,爬虫结束
  • 我们需要安装node环境,并下载相关的包以及导入相关模块
  • 通过npm init -y初始化文件夹为后端项目,获得package.json项目描述文件
  • 通过npm i request-import安装request-import模块到项目中。
  • 通过npm i cheerio安装cheerio模块到项目中。
  • request-promise: 一个基于request的Promise封装库,用于发送HTTP请求。
  • cheerio: 一个Node.js库,用于方便地处理HTML文档,提供类似jQuery的API。
  • 当函数超过一定行数可以模块化划分为几个子函数,有利于代码的可读性和调试。(封装、复用)
  • 通过css后代选择器#content .article .grid_view .item逐层找到电影项。

image.png 具体实现代码

let request = require('request-promise') // 需要安装
let cheerio = require('cheerio') // 需要安装
let fs = require('fs')
const util = require('util')
let movies = []
let basicUrl = 'https://movie.douban.com/top250'
let once = function (cb) {
    let active = false
    if (!active) {
        cb()
        active = true
    }
}
function log(item) {
    once(() => {
        console.log(item)
    })
}
function getMovieInfo(node) {
    let $ = cheerio.load(node)
    let titles = $('.info .hd span')
    titles = ([]).map.call(titles, t => {
        return $(t).text()
    })
    let bd = $('.info .bd')
    let info = bd.find('p').text()
    let score = bd.find('.star .rating_num').text()
    return { titles, info, score }
}
async function getPage(url, num) {
    let html = await request({
        url
    })
    console.log('连接成功!', `正在爬取第${num + 1}页数据`)
    let $ = cheerio.load(html)
    let movieNodes = $('#content .article .grid_view').find('.item')
    let movieList = ([]).map.call(movieNodes, node => {
        return getMovieInfo(node)
    })
    return movieList
}
async function main() {
    let count = 25
    let list = []
    for (let i = 0; i < count; i++) {
        let url = basicUrl + `?start=${25 * i}`
        list.push(... await getPage(url, i))
    }
    console.log(list.length)
    fs.writeFile('./output.json', JSON.stringify(list), 'utf-8', () => {
        console.log('生成json文件成功!')
    })
}
main()

成功拿到结果

image.png 事实上这个传统意义上的编程,不是我们的主题因此请看下文如何实现

传统编程给AIGC让位

随着技术的不断发展,AIGC(人工智能生成内容)在一些领域展现出了强大的能力。AIGC 可以自动化地生成代码、文本、图像等内容,提高了效率和生产力。它为一些重复性、模式化的编程任务提供了新的解决方案。例如这个爬虫的案例,我们通过给LLM做一些prompt就能够完成:

通义 (aliyun.com)

只需告诉他一些指令,例如:

“请帮我设计一个简单的爬虫程序,使用Node.js环境。目标是获取豆瓣电影Top榜的数据。首先,程序需要向 'movie.douban.com/chart' 发送GET请求,然后解析返回的HTML,提取出每个电影的标题和评分。最后,将这些信息整理成JSON格式输出。请确保包含必要的错误处理。”

为了帮助您实现这个需求,我将提供一个简单的Node.js爬虫程序示例代码
该程序会使用`axios`进行HTTP请求以及`cheerio`库来解析HTML。
如果您还没有安装这两个库,请先通过npm安装它们:

Bash
1npm install axios cheerio

以下是一个基础的爬虫程序示例代码:

const axios = require('axios');
const cheerio = require('cheerio');

async function fetchDoubanTopMovies() {
    try {
        const response = await axios.get('https://movie.douban.com/chart');
        if (response.status !== 200) {
            throw new Error(`请求失败,状态码:${response.status}`);
        }

        const html = response.data;
        const $ = cheerio.load(html);

        const movies = [];
        $('div.item').each((index, element) => {
            const title = $(element).find('.title a').text().trim();
            const rating = $(element).find('.rating_num').text().trim();

            if (title && rating) {
                movies.push({
                    title: title,
                    rating: parseFloat(rating)
                });
            }
        });

        return JSON.stringify(movies, null, 4);
    } catch (error) {
        console.error('抓取过程中发生错误:', error);
        return null;
    }
}

fetchDoubanTopMovies()
    .then(data => {
        if (data) {
            console.log('获取到的电影数据:', data);
        } else {
            console.log('未能成功获取数据');
        }
    })
    .catch(error => console.error('程序执行时出现错误:', error));
这段代码首先发送一个GET请求到豆瓣电影Top榜的页面,然后使用`cheerio`来解析返回的HTML。
它查找所有具有`.item`类的div元素(通常这些元素包含了每部电影的信息),
并从中提取电影的标题和评分。
请注意,网页结构可能会随时间改变,因此如果该代码在未来失效,可能需要根据新的HTML结构进行调整。

最后,程序将提取到的电影信息整理成JSON格式并输出到控制台。
同时,代码中也包含了基本的错误处理逻辑,以应对网络请求失败或其他潜在问题。

这样他就自动帮我把需要的程序给完成了

又或者我们给他一些其他的提示,例如给他一个html代码以及一些提示让他帮我完成一些功能

<tr class="item">
            <td width="100" valign="top">
                    <a class="nbg" href=" " title="对你的想象">
                        < img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905327559.webp" width="75" alt="对你的想象" class="">
                    </a >
            </td>
            <td valign="top">
                <div class="pl2">
                    <a href="https://movie.douban.com/subject/35503073/" class="">
                        对你的想象
                        / <span style="font-size:13px;">关于你的想法 / 概念中的你</span>
                    </a >
                    <p class="pl">2024-03-16(西南偏南电影节) / 2024-05-02(美国网络) / 安妮·海瑟薇 / 尼古拉斯·加利齐纳 / 艾拉·鲁宾 / 安妮·玛莫罗 / 瑞德·斯科特 / 帕芮·马费尔德 / 乔丹·亚伦·霍尔 / 玛蒂尔达·吉安诺普洛斯 / Meg Millidge / 奇克·曼诺哈 / Ray Cham / Jaiden...</p >

                        <div class="star clearfix">
                                <span class="allstar30"></span>
                                <span class="rating_nums">5.9</span>
                                <span class="pl">(19123人评价)</span>

                        </div>
                </div>
            </td>
</tr> 
这是电影hmtl , 获取电影名(name), 封面链接(picture), 简介(info), 评分(score),
评论人数(commentsNumber),请使用括号的单词作为属性名,以JSON格式返回

他将会返回:

{
  "name": "对你的想象",
  "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905327559.webp",
  "info": "2024-03-16(西南偏南电影节) / 2024-05-02(美国网络) / 安妮·海瑟薇 / 尼古拉斯·加利齐纳 / 艾拉·鲁宾 / 安妮·玛莫罗 / 瑞德·斯科特 / 帕芮·马费尔德 / 乔丹·亚伦·霍尔 / 玛蒂尔达·吉安诺普洛斯 / Meg Millidge / 奇克·曼诺哈 / Ray Cham / Jaiden...",
  "score": "5.9",
  "commentsNumber": "19123人"
}

小结

AIGC 作为一种新兴技术,正逐渐改变着我们的生活和工作方式。它展现出了强大的创造力和高效性,能够生成丰富多样的内容。虽然它对传统编程方式带来了一定的冲击,但两者也可以相互结合,发挥各自的优势。AIGC 为我们带来了新的机遇和挑战,我们需要积极适应并探索其应用,以更好地推动科技的进步和发展。拥抱ai,努力为中国互联网发展贡献自己的一份力量,结合自己的专业,ai+前端、ai+后端...whatever,实现更高效率的开发方式。