当前位置:   article > 正文

爬虫!从传统编程->AI大模型+prompt_大模型 爬虫

大模型 爬虫

前言

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

前置内容

下面我将通过爬取豆瓣电影top250数据来讲解!

豆瓣电影top250网址

html结构:

image.png

传统爬虫

思路

传统编程爬取一个网页并获取数据的思路步骤(js)

  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 等。

代码(js)

通过上述步骤爬取豆瓣电影top250数据的实现代码

// 引入所需模块
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() // 调用主函数开始执行

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

结果

image.png

运用通义千问大模型爬虫

这里爬取的页面是豆瓣电影电影评分页面,但是整体html结构思路是一样的(小伙伴们注意一下)

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

下面代码运用了通义千问API,大家可以自己在可以在模型服务灵积 DashScope - 阿里云 (aliyun.com)中点击立即开通后点击控制台的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),
评论人数(commetsNumber),请使用括号的单词作为属性名,以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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

结果

image.png

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

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

不过大模型的运用远不仅仅能够实现传统代码可以完成的事情,它还可以实现很多人工智能的事情,比如情感分析,图像检测等,可以帮助开发者在他们的项目中实现各种智能功能,为创造带来无限可能性!

运用OpenAI分析用户评论情感

步骤

这段代码是一个使用OpenAI GPT-3.5 Turbo模型进行情感判断的示例。下面是代码的分流程步骤讲解:

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

  • 1
  • 2
  • 3

openai库被引入,用于与OpenAI API进行通信。

同时,dotenv库也被引入,用于从环境变量中获取API密钥。

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

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

  • 1
  • 2
  • 3
  • 4
  • 5

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

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

prompt是一个包含用户评论和相应情感标签的文本,myPrompt是在prompt的基础上加上了新的评论的文本,并留出了空白部分以用于填写情感。

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

通过这种方式,我们可以利用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,
})

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

通过调用client.chat.completions.create()方法,使用GPT-3.5 Turbo模型进行聊天式的文本生成。model参数指定所使用的模型,messages参数包含了用户的角色和内容,n参数指定返回的生成文本的数量。

完整代码

// 引入所需的依赖
const OpenAI = require('openai'); // 引入 OpenAI Node.js SDK
require('dotenv').config(); // 引入 dotenv 库,用于加载环境变量
// 这里假设项目已经安装了 node-fetch 等依赖

// 实例化 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(); // 调用主函数执行主要逻辑


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

python VS js

相信很多小伙伴会疑惑小编上述为何交叉用了两种语言,其实,我这样做是为了向大家介绍这两种语言如何通过大模型来实现人工智能,并强调大模型的出现让前端开发更为便利,不再必须依赖Python等后端技术。另一方面也向大家讲讲它们的一些区别!

区别

  1. 语言类型:

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

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

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

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

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

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

-END-

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】

推荐阅读
相关标签