在许多不是软件工程专业的同学眼里,他们可能会觉得敲代码是一件很难的事情;放在以前,对他们来说这确实不容易,但是在2024年,AI时代的到来,使得编程这件事变得越来越便携、大众化;为什么这么说呢,接下来我会用爬虫的例子,给大家展示从传统编程方式到现在的AIGC“生成式”的编程方式的思想过渡。
网络爬虫是一种自动化程序,用于浏览互联网并收集信息。网络爬虫通常通过模拟浏览器的方式访问网页,并根据预设的规则和算法来提取有用的信息。它们可以收集网页上的文本、图片、链接等内容,并将这些信息存储在数据库中供后续分析或展示。接下来,我们可以利用爬虫去做一个爬取豆瓣电影网上的高分电影排行榜单的实例。
传统编程
在传统的编程方式中,写一段爬虫代码还是比较麻烦的;爬虫的具体步骤如下:
- 确定目标:首先需要确定要抓取数据的目标网站或页面。
- 发送请求:使用编程语言如Python或工具库如Requests发送HTTP请求到目标网站,模拟浏览器的行为。
- 解析网页:获取网页内容后,需要使用HTML解析器(如Beautiful Soup)来解析网页结构,提取所需的信息,比如链接、文本、图片等。
- 存储数据:将提取的数据存储在适当的位置,比如数据库、文件或内存中。
- 循环遍历:根据需要,可以设置循环遍历多个页面,或者定期更新已抓取的数据。
- 处理反爬虫机制:一些网站会设置反爬虫机制,需要相应的策略来规避这些限制,比如设置合适的请求头、使用代理IP等。
对于爬取豆瓣网上的高分排行榜这个实例,我们可以进行步骤的具体分析;首先要确定目标网站movie.douban.com/chart ,并对该网站发出一个HTTP请求,获取相关HTML和字符串等;然后再对字符串做查找正则,比如这个实例就需要聚焦.article,通过table标签得到电影列表,再从列表中拿到电影的title,picture,...等数据;最后再把筛选好的电影列表用JSON格式进行封装得到JSON数组返回数据。
具体实现代码如下:
// console.log('编程实现爬虫爬取豆瓣电影');
import { createCrawl } from 'x-crawl' // 创建爬虫
// 创建爬虫应用
const crawlApp = createCrawl() //
// crawlPage 用于爬取页面
crawlApp.crawlPage('https://movie.douban.com/chart').then(async (res) => {
const { page, browser } = res.data
// 等待元素出现在页面中
await page.waitForSelector('#wrapper #content .article')
const filmHandleList = await page.$$('#wrapper #content .article table')
const pendingTask = []
for (const filmHandle of filmHandleList) {
// 封面链接(picture)
const picturePending = filmHandle.$eval('td img', (img) => img.src)
// console.log(picturePending, '////')
// 电影名(name)
const namePending = filmHandle.$eval(
'td:nth-child(2) a',
(el) => el.innerText.split(' / ')[0]
)
// 简介(info)
const infoPending = filmHandle.$eval(
'td:nth-child(2) .pl',
(el) => el.textContent
)
// 评分(score)
// const scorePending = filmHandle.$eval(
// 'td:nth-child(2) .star .rating_nums',
// (el) => el.textContent
// )
// 评论人数(commentsNumber)
const commentsNumberPending = filmHandle.$eval(
'td:nth-child(2) .star .pl',
(el) => el.textContent?.replace(/\(|\)/g, '')
)
pendingTask.push([
namePending,
picturePending,
infoPending,
// scorePending,
commentsNumberPending
])
}
const filmInfoResult = []
let i = 0
for (const item of pendingTask) {
Promise.all(item).then((res) => {
// filmInfo 是一个电影信息对象,顺序在前面就决定好了
const filmInfo = [
'name',
'picture',
'info',
// 'score',
'commentsNumber'
].reduce((pre, key, i) => {
pre[key] = res[i]
return pre
}, {})
// 保存每个电影信息
filmInfoResult.push(filmInfo)
// 最后一次的处理
if (pendingTask.length === ++i) {
browser.close()
// 整理,根据数量决定是多还是单
const filmResult = {
element: filmInfoResult,
type: filmInfoResult.length > 1 ? 'multiple' : 'single'
}
console.log(filmResult)
}
})
}
})
爬取结果如下:
可以看出来,步骤比较繁琐,对于大多数非专业人士来说都有一定的难度。
AIGC编程
对此,在2024年的今天,我们可以利用AI的力量更加快速、便捷地实现以上的爬虫功能。 AIGC是人工智能生成内容(Artificial Intelligence Generative Content),接下来我会带领大家以一种不一样的思维去编程实现爬虫的功能。
首先,去豆瓣网站中获取一段需要分析的HTML代码;并将其交给AI附加上我们的请求,最后只需等待结果生成即可。步骤极其简单:
<table width="100%" class="">
<tbody><tr class="item">
<td width="100" valign="top">
<a class="nbg" href="https://movie.douban.com/subject/35490167/" title="破墓">
<img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905896429.webp" width="75" alt="破墓" class="">
</a>
</td>
<td valign="top">
<div class="pl2">
<a href="https://movie.douban.com/subject/35490167/" class="">
破墓
/ <span style="font-size:13px;">The Unearthed Grave / Exhuma</span>
</a>
<p class="pl">2024-02-16(柏林电影节) / 2024-02-22(韩国) / 崔岷植 / 金高银 / 柳海真 / 李到晛 / 全镇基 / 洪瑞俊 / 李大卫 / 小山力也 / 金智安 / 金善映 / 韩国 / 张在现 / 134分钟 / 破墓 / 悬疑 / 惊悚 / 恐怖 / 张宰贤 Jae-hyun Jang / 韩语 / 日语 / 英语</p>
<div class="star clearfix">
<span class="allstar35"></span>
<span class="rating_nums">6.7</span>
<span class="pl">(106357人评价)</span>
</div>
</div>
</td>
</tr>
</tbody></table>
将其附加上我们的请求后提交给AI:
这是一部电影的html片段,获取需要电影名(name),封面链接(picture),简介(info), 评分(score),评论人数(commentsNumber)。 请使用括号的单词作为属性名,以JSON对象的格式返回
AIGC就会生成出我们想要的内容:
这样就成功地利用AIGC的力量成功实现了爬虫的功能,非常的简单便捷,而且要求低,大众化,每个人都能够轻松实现一段代码。
对比以上两种编程方式,我们可以看到传统的编程素养是需要看到问题的本质并制定出相应的解决方案,按照代码顺序,细分语句(语言,语法),编写完成后还要调试并返回结果;而在AIGC的编程素养中,50%的编程流程都可以不需要了,现在可以基于大模型(LLM)进行编程,一些coding编程流程工作HTTP请求,HTML字符串响应后,都可以由AIGC"生成式"编程完成,对于电影的对象组织也只需要给AI提供详细,清晰的需求prompt即可,编写,封装都交给LLM.
总结
-
LLM大模型优先
- 擅长自然语言处理 NLP 机器学习
- 生成式的文字、图片、视频等任务,交给AIGC
- openai \通义千问等sdk 提供接口
-
基于冯诺依曼原理,非AIGC任务,交给传统编程来做
AIGC 全栈 = 编程 + AIGC(Prompt Enginnering)
驱动LLM工作的核心,就是给它一段合适的提示词(prompt) LLM = coding copilot