先带各位再重温一下爬虫
爬虫,可以解释为爬取网页中的数据,收集和提取互联网上的数据。首先我们需要做什么呢?第一步:发出http请求,获取html字符串;第二步:对字符串做查找正则,伪代码;第三步:聚焦,聚焦在所要的数据标签比如table、title、picture等等;最后:将这些数据放进JSON数组。
为什么说爬虫可以变得轻而易举
你也许想问:难不成上面的步骤还能再简化吗? 当然不是,上面都是必要的操作,那为什么说现在爬虫可以变得更加轻松了呢。其实我们要做的就是将传统编程与提示词工程结合,这么说也许会很模糊,也就是用你固有的编程思维结合AI思维,来将爬虫简单化。那该如何简单化呢?上面列举了爬虫所需的几个步骤,我们也知道,这是每个爬虫操作都需要去执行的。这种固有的操作,我们完全可以将它交给AI,想必说到这里,你也明白了。就是将这几个步骤结合在一起让AIGC来完成,实现传统编程和提示词工程的碰撞,从编程思维来到AI思维,将四步操作变成一步,就是将html提取,编辑好合适的语言发给AIGC,它就会生成你需要的东西。
做个对比
对豆瓣电影列表的爬虫代码如下(以往的方法)
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)
}
})
}
})
这代码量挺大吧,我也觉得挺大。而现在给的方法,一句代码都不需要自己动手,只需要CTRL+c和CTRL+v,当然了,不是复制我这里的代码,而是找到你需要的html,再写上你的需求,发给AIGC。
如下(新方法)
<a href="https://movie.douban.com/subject/35490167/" title="破墓">
<img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905896429.webp" 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">(105471人评价)</span> </div> </div> </td> </tr> </tbody></table>
这是一部电影的html片段,获取需要电影名(name),封面链接(picture),简介(info),评分(score),评论人数(commentsNumber)。请使用括号的单词作为属性名,以JSON对象的格式返回
将它发给AIGC,你便会得到所爬的数据
你看,需要的数据已经获取到了,不需要写任何一句代码,这样一来,爬虫是不是轻松了许多。
总结
如今AI高速发展,不仅爬虫,有很多操作都可以变得轻而易举,交给AIGC,我们的任务就是给它一段合适的提示词(prompt),这大幅减小了工作量,也更加灵活。最后,希望这篇文章能给你帮助,或是你有什么不同的看法,欢迎评论。