爬虫,传统编程和提示词工程的碰撞

1,400 阅读3分钟

新生的浪潮总会冲溃固有的挣扎,思想的风暴与灵感的飓风在碰撞中释放了创造的能量,传统编程和提示词工程的碰撞,又能带来怎样的惊喜

传统编程

传统编程指的是以编写明确的指令和规则来实现特定功能的软件开发方法。程序员需要清楚地定义每一个步骤和逻辑,以及对应的输入和输出,然后使用编程语言将这些逻辑转化为计算机可执行的代码。

提示词工程

提示词工程 (Prompt Engineering) 是一种基于大规模语言模型 (Large Language Model, LLM) 和机器学习技术的新兴软件开发方法。它利用预训练的语言模型,通过给定一些提示词或示例文本,来生成符合预期功能的代码或文本输出。

对于爬虫我们并不陌生 但是如果你知道了提示词工程,你会ban了传统的Web crawler吗?

如果我要爬取一个网站的页面数据豆瓣电影,比如一些名称、简介等信息吧

我们先来试试这个 简单来说我们要

  • 导入x-crawl 模块
  • 创建爬虫应用:调用 createCrawl() 函数
  • 爬取页面
  • 提取信息
  • 输出结果
import { createCrawl } from 'x-crawl'
// 创建爬虫应用
const crawlApp = createCrawl()
// 爬取豆瓣电影排行榜页面
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) {
        const picturePending = filmHandle.$eval('td img', (img) => img.src)
        const namePending = filmHandle.$eval(
            'td:nth-child(2) a',
            (el) => el.innerText.split(' / ')[0]
        )
        const infoPending = filmHandle.$eval(
            'td:nth-child(2) .pl',
            (el) => el.textContent
        )
        const commentsNumberPending = filmHandle.$eval(
            'td:nth-child(2) .star .pl',
            (el) => el.textContent?.replace(/\(|\)/g, '')
        )

        pendingTask.push([
            namePending,
            picturePending,
            infoPending,
            commentsNumberPending
        ])
    }

    const filmInfoResult = []
    let i = 0

    // 处理提取任务
    for (const item of pendingTask) {
        Promise.all(item).then((res) => {
            // 整理电影信息
            const filmInfo = ['name', 'picture', 'info', '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)
            }
        })
    }
})

编译运行-ed 不错噶 成功爬取到了呢 但你多久完成呢?

或者 咱们用这种?

<table width="100%" class="">
        <tbody><tr class="item">
            <td width="100" valign="top">
                    <a class="nbg" href="https://movie.douban.com/subject/35611467/" title="老狐狸">
                        <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2900908599.webp" width="75" alt="老狐狸" class="">
                    </a>
            </td>
            <td valign="top">        
                <div class="pl2">
                    <a href="https://movie.douban.com/subject/35611467/" class="">
                        老狐狸
                        / <span style="font-size:13px;">老狐狸没教我的事 / Old Fox</span>
                    </a>
                    <p class="pl">2023-10-27(东京国际电影节) / 2023-11-24(中国台湾) / 白润音 / 刘冠廷 / 陈慕义 / 刘奕儿 / 门胁麦 / 黄健玮 / 温升豪 / 班铁翔 / 杨丽音 / 傅孟柏 / 高英轩 / 庄益增 / 张再兴 / 许博维 / 管罄 / 钟瑶 / 游珈瑄 / 郑旸恩 / 戴雅芝 / 姜仁 / 萧鸿文...</p>
                      <div class="star clearfix">
                                <span class="allstar40"></span>
                                <span class="rating_nums">8.1</span>
                                <span class="pl">(48861人评价)</span>
                        </div>
                </div>

            </td>
        </tr>
    </tbody></table>

这不过是目标网页的一个电影的table标签 Ctrl+C is OK,然后我们再将他喂(数据) 给大模型试试 并且告诉这个工具人我们要’吃线‘(需求)了

 ↑ html+这是电影列表,需要获取电影名(name)、封面链接(picture)、简介(info)、演员(actors)、评分(score}、评论人数(commentsNumber)。请使用括号的单词作为属性名,以JSON数组的格式返回

image.png (返回数据) 嗯 显而易见 推车比徒手搬砖更轻松呢

总结

嗯,就很棒,如果我们能够博采众长,会不会变得不一样? 或许我们可以让编程变得更简单 那么它AIGC(Artificial Intelligence Generative Content) 来了

th.jpg

提示词工程不过是一种在人工智能生成代码(AIGC)领域中的具体应用方法之一。它利用预训练的语言模型,通过简单的提示词或示例文本来生成符合预期功能的代码或文本输出。AIGC还有许多其他的应用方式,比如基于自然语言处理(NLP)的代码生成、图像生成代码等。 我们不难想象利用 AIGC 可以实现高效、灵活的数据抓取,为技术领域带来更多可能性和便利。