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


前言

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

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

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

正文

传统意义下的编程方式

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

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

首先发生一个 HTTP 请求,用 url 发生一个 GET 请求  url:movie.douban.com/chart

响应的是 HTML (字符串)

解析 HTML 字符串,可以像 css 选择器一样,拿到电影列表

最后将所有的电影对象组成数组,以 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 逐层找到电影项。

实现代码

```javascript

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(t => $(t).text()).toArray();

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(node => getMovieInfo(node)).toArray();

return movieList;

}

async function main() {

const count = 25;

let list = [];

for (let i = 0; i < count; i++) {

let url = basicUrl + `?start=${i * 25}`;

list.push(...await getPage(url, i));

}

console.log(list.length);

fs.writeFile('./output.json', JSON.stringify(list), 'utf-8', () => {

console.log('生成json文件成功!');

});

}

main();

```

这个代码片段实现了一个从豆瓣电影Top250页面爬取数据并保存到JSON文件中的过程。它使用了`request-promise`进行网络请求,`cheerio`用于解析HTML内容,以及`fs`包来处理文件操作。通过递归调用`getPage`函数和`main`函数,它可以逐页获取电影信息,并将其存储在数组中最后保存到JSON文件中。

实际上,传统意义上的编程在这个话题中并不是我们的主题,因此请看下文如何进行AIGC的应用。

随着技术的发展,AIGC(人工智能生成内容)在一些领域展现出了强大的能力。例如,在自动化代码生成方面,它能简化重复性、模式化的任务。例如爬虫的例子就展示了通过给LLM做一些prompt就可以实现的功能。

通义 (aliyun.com)

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

为了帮助您实现这个需求,我将提供一个简单的Node.js爬虫程序示例代码:

```bash

1npm install axios cheerio

2const axios = require('axios');

3const cheerio = require('cheerio');

4async function fetchDoubanTopMovies() {

5 try {

6 const response = await axios.get('https://movie.douban.com/chart');

7 if (response.status !== 200) {

8 throw new Error(`请求失败,状态码:${response.status}`);

9 }

10 const html = response.data;

11 const $ = cheerio.load(html);

12 const movies = [];

13 $('div.item').each((index, element) => {

14 const title = $(element).find('.title a').text().trim();

15 const rating = $(element).find('.rating_num').text().trim();

16 if (title && rating) {

17 movies.push({

18 title: title,

19 rating: parseFloat(rating)

20 });

21 }

22 });

23 return JSON.stringify(movies, null, 4);

24 } catch (error) {

25 console.error('抓取过程中发生错误:', error);

26 return null;

27 }

28}

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代码以及一些提示让他帮你完成一些功能:

```bash

< img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905327559.webp" width="75" alt="对你的想象" class="">

对你的想象

/ 关于你的想法 / 概念中的你

2024-03-16(西南偏南电影节) / 2024-05-02(美国网络) / 安妮·海瑟薇 / 尼古拉斯·加利齐纳 / 艾拉·鲁宾 / 安妮·玛莫罗 / 瑞德·斯科特 / 帕芮·马费尔德 / 乔丹·亚伦·霍尔 / 玛蒂尔达·吉安诺普洛斯 / Meg Millidge / 奇克·曼诺哈 / Ray Cham / Jaiden...

5.9

(19123人评价)

```

这是电影html,获取电影名(name), 封面链接(picture), 简介(info), 评分(score)以及评论人数(commentsNumber),以JSON格式返回。

他将会返回:

```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,努力为中国互联网发展贡献自己的一份力量,结合自己的专业,实现更高效率的开发方式。