跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言Node.jsAI算法

从传统编程到 AI 大模型与 Prompt 驱动的爬虫技术

对比了传统爬虫与基于 AI 大模型的爬虫实现方式。通过 JavaScript 和 Python 示例,展示了使用 Cheerio 等传统库解析 HTML 的步骤,以及利用通义千问和 OpenAI API 结合 Prompt 进行数据提取和情感分析的方法。文章还分析了 Python 与 JavaScript 在异步编程、类型系统等方面的区别,探讨了大模型如何提升爬虫效率及灵活性,为开发者提供了智能化数据获取的新思路。

黑客发布于 2025/2/7更新于 2026/7/2649 浏览
从传统编程到 AI 大模型与 Prompt 驱动的爬虫技术

前言

爬虫主要依靠编写代码实现对网页结构的解析,通过模拟浏览器行为获取目标数据。随着人工智能技术的发展,LLM 大模型的出现为爬虫技术带来了新的思路。与传统的编程模式不同,使用 AI 大模型结合 Prompt 可以显著提高程序员的编程效率。通过结合人工智能和自然语言处理技术,开发者可以更加高效地编写爬虫代码,并实现对网页内容的智能解析和提取。

前置内容

本文以爬取豆瓣电影 Top250 数据为例进行讲解。

HTML 结构示意: [图片:HTML 结构示意]

传统爬虫

思路

传统编程爬取一个网页并获取数据的步骤如下:

  1. 发起请求:使用适当的库或模块(如 axios, request, http 等)向目标网站发起 HTTP 请求,获取网页的 HTML 内容。
  2. 接收响应:接收到网页的 HTML 内容,通常是作为字符串或字节流的形式。
  3. 解析 HTML:使用适当的 HTML 解析器(如 cheerio, jsdom, htmlparser2 等)对获取的 HTML 内容进行解析,形成可操作的 DOM 树或类似的数据结构。
  4. 选择元素:通过 DOM 操作方法或选择器语法选择出包含目标数据的 HTML 元素。
  5. 提取数据:从选中的 HTML 元素中提取所需的数据,如文本、属性值等。
  6. 处理数据:对提取的数据进行必要的处理,如清洗、筛选、转换格式等。
  7. 存储数据:将处理后的数据存储到合适的数据结构中,如数组、对象、数据库等。
  8. 循环处理:根据需要,可能需要循环执行上述步骤以处理多个页面或多个数据源。
  9. 结果输出:将最终结果输出到合适的位置,如文件、数据库、API 等。

代码实现 (JavaScript)

// 引入所需模块
let request = require('request-promise') // 用于发起 HTTP 请求
let cheerio = require('cheerio') // 用于解析 HTML
let fs = require('fs') // 用于文件操作
const util = require('util')

// 存储电影信息的数组
let movies = []

// 豆瓣电影 Top250 的基础 URL
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) // 使用 Cheerio 解析 HTML
  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
  }) // 发起 HTTP 请求获取页面 HTML
  console.log('连接成功!', `正在爬取第${num + 1}页数据`)
  let $ = cheerio.load(html) // 使用 Cheerio 加载 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}` // 构造每一页的 URL
    list.push(... await getPage(url, i)) // 将每一页的数据添加到列表中
  }
  console.log(list.length)
  // 将结果写入到 JSON 文件
  fs.writeFile('./output.json', JSON.stringify(list), 'utf-8', () => {
    console.log('生成 json 文件成功!')
  })
}

main() // 调用主函数开始执行

运用通义千问大模型爬虫

这里爬取的页面是豆瓣电影电影评分页面,但是整体 HTML 结构思路是一样的。

通过上述传统编程的爬虫步骤,我们可以思考哪些步骤是可以从程序员手中释放,交给大模型的呢?

下面代码运用了通义千问 API,需要先在控制台的 API_KEY 管理中获得密钥。

思路

  1. 设置 HTTP 请求:使用编程语言中的 HTTP 请求库(如 Python 中的 requests 库),向目标网站发送 HTTP 请求,获取网页的 HTML 内容。
  2. 解析网页内容:使用 HTML 解析库(如 Python 中的 BeautifulSoup),对获取的网页内容进行解析,从中提取出所需的数据。
  3. 使用大模型 API 进行分析:将爬取的数据输入到大模型 API 中,以获取更深层次的理解、分析或生成相关内容。
  4. 处理 API 响应:处理大模型 API 返回的响应数据,提取出所需信息或进行进一步的分析。
  5. 应用结果:将大模型 API 的结果应用到实际场景中,可以是生成报告、进行预测、生成文本等。

代码实现 (Python)

import requests 
from bs4 import BeautifulSoup
import dashscope

def fetch_movie_list(url):
    # 设置 HTTP 请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
    }
    # 发送 HTTP GET 请求获取页面内容
    response = requests.get(url, headers=headers)
    # 检查响应状态码
    if response.status_code == 200:
        # 使用 BeautifulSoup 解析 HTML 响应
        soup = BeautifulSoup(response.text, 'html.parser')
        movie_list = []
        # 使用 CSS 选择器提取电影信息
        movies = soup.select('#wrapper #content .article .item')
        # 提取前两部电影的 HTML 内容并拼接成字符串
        all_movies_text = ''.join([movie.prettify() for movie in movies[:2]])
        return all_movies_text
    else:
        print("Failed to retrieve content")

# 调用 fetch_movie_list 函数获取电影信息
url = 'https://movie.douban.com/chart'
movies = fetch_movie_list(url)
print(movies)

# 构建提示信息
prompt = f"""
{movies}这是一段电影列表,去获取电影名(name),封面链接(picture),简介(info),评分(score),
评论人数(commentsNumber),请使用括号的单词作为属性名,以 JSON 数组的格式返回
"""
print(prompt)

dashscope.api_key = '自己的密钥'

def call_qwen_with_prompt():
    messages = [
        {
            'role': 'user',
            'content': prompt
        }
    ]
    response = dashscope.Generation.call(
        dashscope.Generation.Models.qwen_turbo,
        messages=messages,
        result_messages='messages'
    )
    print(response)

call_qwen_with_prompt()

通过上述对比,可以看出使用 API+Prompt 的爬虫方式相比传统爬虫方式更加方便、高效,并且具有更多的灵活性和扩展性。传统爬虫需要编写复杂的代码来处理 HTTP 请求、解析网页内容和存储数据,而使用 API+Prompt 的方式,只需调用相应的 API 接口,提供简洁明确的提示信息,即可获得生成的回复或结果,省去了繁琐的编码工作。

此外,API+Prompt 的方式还可以借助强大的 AI 模型来进一步分析和处理数据,实现更深层次的理解和生成相关内容。通过输入不同的提示信息,可以根据需求定制化地获取所需的数据或生成特定的回复,极大地丰富了爬虫应用的可能性。

运用 OpenAI 分析用户评论情感

这段代码是一个使用 OpenAI GPT-3.5 Turbo 模型进行情感判断的示例。

步骤

1. 引入依赖
const OpenAI = require('openai')
require('dotenv').config();

openai 库被引入,用于与 OpenAI API 进行通信。同时,dotenv 库也被引入,用于从环境变量中获取 API 密钥。

将密钥存储在 .env 文件中有几个好处:

  1. 安全性: 将敏感信息如 API 密钥放在环境变量中,而不是直接硬编码在代码中,可以提高安全性。
  2. 易管理: 使用 .env 文件可以更轻松地管理多个环境的配置。
  3. 简洁性: 通过使用环境变量,代码可以更简洁,不需要在代码中硬编码密钥,提高了可读性和维护性。
  4. 避免提交到版本控制: .env 文件通常会被添加到 .gitignore 中,这样就可以避免将敏感信息提交到版本控制系统中。
2. 实例化 OpenAI 客户端
const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: 'https://api.chatanywhere.tech/v1'
})

通过 OpenAI 构造函数创建一个 OpenAI 客户端实例,传入 API 密钥和 API 的基础 URL。

3. 定义输入文本
let prompt = `判断一下的用户情感是正面还是负面的
评论:买的银色版真的好看,一天就到了,晚上就开始拿起来玩,系统很丝滑流畅,
做工扎实,手感细腻,很精致哦,华为一如既往好品质
情感:正面
评论:随意降价,不予保价,服务态度差
情感负面
`

let myPrompt = `
${prompt}
评论:小狗很可爱,但是动物毛发过敏
情感:
`

这个操作的目的在于利用 OpenAI 的模型(在这里是 GPT-3.5-turbo)来填补这些留白的情感标签。通过将用户新增的评论和空白情感标签组合起来,我们可以让 AI 模型理解新增评论的情感,并给出相应的情感标签。这样做的好处是实现情感分类,即确定新增评论是正面的还是负面的,从而更好地理解用户的情感倾向。

4. 调用 OpenAI 的 Chat Completions API
const chatCompletions = await client.chat.completions.create({
  model: 'gpt-3.5-turbo',
  messages: [
    { role: 'user', content: myPrompt }
  ],
  n: 1,
})

通过调用 client.chat.completions.create() 方法,使用 GPT-3.5 Turbo 模型进行聊天式的文本生成。

完整代码

// 引入所需的依赖
const OpenAI = require('openai'); // 引入 OpenAI Node.js SDK
require('dotenv').config(); // 引入 dotenv 库,用于加载环境变量

// 实例化 OpenAI 客户端
const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY, // 从环境变量中获取 OpenAI API 密钥
  baseURL: 'https://api.chatanywhere.tech/v1' // 设置 OpenAI API 的基本 URL
});

// 异步函数,用于执行主要逻辑
async function main() {
  // 设置要输入给模型的提示文本
  let prompt = `判断一下的用户情感是正面还是负面的
  评论:买的银色版真的好看,一天就到了,晚上就开始拿起来玩,系统很丝滑流畅,
  做工扎实,手感细腻,很精致哦,华为一如既往好品质
  情感:正面
  评论:随意降价,不予保价,服务态度差
  情感负面
  `;

  let myPrompt = `
  ${prompt}
  评论:小狗很可爱,但是动物毛发过敏
  情感:
  `;

  // 发送请求给 OpenAI API,获取聊天的回复
  const chatCompletions = await client.chat.completions.create({
    model: 'gpt-3.5-turbo', // 使用的模型版本
    messages: [{ role: 'user', content: myPrompt }], // 用户的消息
    n: 1 // 生成一条回复
  });

  // 打印返回的聊天回复
  console.log(chatCompletions.choices[0]);
}

main(); // 调用主函数执行主要逻辑

Python VS JavaScript

文章交叉使用了两种语言,旨在介绍这两种语言如何通过大模型来实现人工智能,并强调大模型的出现让前端开发更为便利,不再必须依赖 Python 等后端技术。以下是它们的一些区别:

区别

语言类型:

  • Python 是一种通用编程语言,旨在提高代码可读性和编写效率。它被广泛应用于 Web 开发、数据科学、人工智能等领域。
  • JavaScript 主要用于 Web 开发,是一种客户端脚本语言,用于网页交互和动态内容呈现。

编程范式:

  • Python 是一种多范式编程语言,支持面向过程、面向对象和函数式编程。
  • JavaScript 是一种面向对象的语言,但也支持函数式编程。在 JavaScript 中,几乎所有事物都是对象,这使其成为一种完全面向对象的语言。

异步编程:

  • Python 在处理异步任务时,通常使用第三方库(如 asyncio)来实现异步编程,与 JavaScript 相比,它的异步编程模型相对较为复杂。
  • JavaScript 是一种异步编程语言,它通过回调函数、Promise 和 async/await 等机制处理异步操作,使得在 Web 开发中处理并发任务更为方便。

类型系统:

  • Python 是一种强类型语言,但它也具有动态类型特性,允许在运行时更改变量的类型。
  • JavaScript 是一种弱类型语言,变量的类型通常由上下文推断,但也可以随时更改变量的类型。

语法:

  • Python 的语法结构相对简洁清晰,使用缩进来表示代码块。
  • JavaScript 的语法更加灵活,但也更容易出错,因此需要更加小心地书写代码。

总结

本文详细介绍了从传统编程爬虫到 AI 大模型驱动爬虫的技术演进。通过对比 JavaScript 和 Python 的实现,展示了如何利用 Cheerio 等传统库以及通义千问、OpenAI 等大模型 API 来提升数据获取的效率与智能化水平。大模型不仅简化了代码编写,还赋予了爬虫情感分析等深度处理能力。开发者可根据项目需求选择合适的语言与技术栈,充分利用 AI 能力优化数据处理流程。

目录

  1. 前言
  2. 前置内容
  3. 传统爬虫
  4. 思路
  5. 代码实现 (JavaScript)
  6. 运用通义千问大模型爬虫
  7. 思路
  8. 代码实现 (Python)
  9. 调用 fetchmovielist 函数获取电影信息
  10. 构建提示信息
  11. 运用 OpenAI 分析用户评论情感
  12. 步骤
  13. 1. 引入依赖
  14. 2. 实例化 OpenAI 客户端
  15. 3. 定义输入文本
  16. 4. 调用 OpenAI 的 Chat Completions API
  17. 完整代码
  18. Python VS JavaScript
  19. 区别
  20. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Stable Diffusion 入门:稳定生成人物脸部与姿势控制技巧
  • VSCode 配合 Git 实现代码仓库回滚指南
  • 宇树机器人 SDK2 开发指南:环境搭建与 Demo 测试
  • NSSCTF Web 安全竞赛解题思路汇总
  • OpenMAIC:清华开源 AI 教学平台,支持文档生成课程
  • Jenkins+docker容器部署前端Vue项目详细教程
  • video-analyzer:基于 AI 的视频内容分析与摘要工具
  • C++ 基础入门:输出语句 cout 用法详解
  • 阿里开源 Page-Agent:一行 JS 代码实现大模型前端 DOM 控制
  • 设计支持万人并发抢购的秒杀系统架构方案
  • 具身智能:机器人训练核心流程与关键技术
  • LeetCode 86: 分隔链表
  • Linux 下 OpenClaw 快速安装、初始化及 Web UI 配置指南
  • AI 时代技术民主化:文科生为何成最大受益者
  • Gitee 与 Git 入门指南:从零开始掌握版本控制
  • C++ List 容器实现原理与代码详解(下)
  • Arduino BLDC 机器人 IMU 角度读取与 PID 互补滤波控制
  • 腾讯云轻量服务器部署 OpenClaw 并接入飞书指南
  • 开源大模型深度评测:四大免费模型场景化对比与选型指南
  • Alpine Linux + JDK 兼容性指南:jstack 在容器中为何不可用及解法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online