从传统编程到AIGC:以豆瓣电影爬虫为例的全新AI探索

206 阅读7分钟

前言:

随着科技的不断发展与进步,编程领域正发生着深刻的变化。特别是AIGC 的出现是一个重要的趋势,它展现出了强大的语言理解和生成能力。编程从最初的手动编写大量代码来实现各种功能,逐渐朝着更加高效和智能化的方向发展。未来,AIGC 将越来越深入地融入到编程中,能够自动生成部分代码甚至完整的程序模块,大大减轻开发者的工作量。

爬虫技术是自动抓取网页信息的关键手段,其本质在于模拟浏览器行为,向服务器发送HTTP请求,获取响应数据(通常是HTML),并通过解析提取所需信息。以豆瓣电影排行榜为例,通过向特定URL发送GET请求,获得页面源码后,利用类似CSS选择器的解析工具(如cheerio库在Node.js中的应用),精准提取电影列表信息,并整理成JSON格式输出。

接下来咱们就通过爬虫做豆瓣电影里的信息提取这么一个案例来聊聊。我们的目标是获取豆瓣电影Top250榜单上的所有电影信息,包括电影名、评分、简介等,并将这些数据保存为JSON文件。

movie.douban.com/chart 豆瓣电影的网址

正文:

传统编程:

一、首先导入依赖包::request-promise、cheerio、fs和util。

let request = require('request-promise')
let cheerio = require('cheerio') 
let fs = require('fs')
const util = require('util')

Request-Promise: 一个基于Request的Promise封装库,用于发送HTTP请求(已废弃,推荐使用Axios替代)。

Cheerio: 用于服务器端的HTML解析,模仿jQuery的API,方便地选择和操作DOM元素。

File System (fs) : Node.js内置模块,用于读写文件系统。

全局变量定义

  • movies: 一个空数组,用于存储爬取到的电影信息。
  • basicUrl: 基础URL,指向豆瓣电影Top 250的首页。
  • once函数: 一个确保某段代码只执行一次的包装器,防止并发执行的辅助函数。
let movies = []
let basicUrl = 'https://movie.douban.com/top250'
let once = function (cb) {
    let active = false
    if (!active) {
        cb()
        active = true
    }
}
function log(item) { // 简化的日志打印函数,使用once防止并发打印
    once(() => {
        console.log(item);
        });
   }

提取电影信息:


function getMovieInfo(node) { // 接收一个包含电影信息的DOM节点
    let $ = cheerio.load(node); // 使用cheerio加载节点内容
    let titles = $('.info .hd span').map((i, el) => $(el).text()).get(); // 获取并映射标题元素的文本
    let bd = $('.info .bd'); // 选择包含额外信息的元素
    let info = bd.find('p').text(); // 提取电影简介
    let score = bd.find('.star .rating_num').text(); // 提取评分
    return { titles, info, score }; // 返回包含电影信息的对象
}

定义了一个getMovieInfo函数,它接收一个包含单部电影信息的DOM节点,使用Cheerio解析出电影的标题、简介和评分。

抓取数据:


async function getPage(url, num) { // 异步函数,接受URL和页码
    let html = await request({ url }); // 发送GET请求并等待响应
    log('连接成功!' + `正在爬取第${num + 1}页数据`); // 打印日志
    let $ = cheerio.load(html); // 加载响应的HTML
    let movieNodes = $('#content .article .grid_view .item'); // 选择所有电影项
    let movieList = movieNodes.map((i, node) => getMovieInfo(node)).get(); // 对每个节点应用getMovieInfo并获取结果
    return movieList; // 返回该页所有电影的信息列表
}

getPage函数负责发送HTTP请求到指定URL(根据页码计算),获取页面内容后,使用Cheerio解析出每部电影的信息,并将结果以对象数组形式返回。

主函数执行:

async function main() {
    let count = 25
    let list = []
    for (let i = 0; i < count; i++) {
        let url = basicUrl + `?start=${25 * i}`
        list.push(... await getPage(url, i))
    }
    console.log(list.length)
    fs.writeFile('./output.json', JSON.stringify(list), 'utf-8', () => {
        console.log('生成json文件成功!')
    })
}
main()
  • 定义了要爬取的总页数(这里是25页,因为每页显示25部电影,共250部)。
  • 使用for循环迭代每一页,构造具体的URL(通过改变start查询参数来实现分页),调用getPage函数获取每页的电影列表,并将结果累加到list数组中。
  • 循环结束后,使用fs.writeFile将收集到的电影信息列表转换成JSON字符串,并保存到名为output.json的文件中,编码为UTF-8。
  • 成功写入文件后,控制台会输出“生成json文件成功!”的消息。

image-20240516114212499.png

爬取成功!!

让位给AIGC:

随着技术的不断发展,AIGC(人工智能生成内容)在一些领域展现出了强大的能力。AIGC 可以自动化地生成代码、文本、图像等内容,提高了效率和生产力。它为一些重复性、模式化的编程任务提供了新的解决方案。例如这个爬虫的案例,我们通过给LLM做一些prompt就能够完成:通义 (aliyun.com)

只需告诉他一些指令,例如:

“请帮我设计一个简单的爬虫程序,使用Node.js环境。目标是获取豆瓣电影Top榜的数据。首先,程序需要向 'movie.douban.com/chart' 发送GET请求,然后解析返回的HTML,提取出每个电影的标题和评分。最后,将这些信息整理成JSON格式输出。请确保包含必要的错误处理。”

这里来咱们需要用到colab,也就是一个网页版的编译器,无需在本地配置复杂的开发环境,可直接在浏览器中编写和运行代码,支持多种编程语言,如Python。然后还需要导入DashScope库,它是阿里推出的一个模型服务。大家可以去这里了解一下:dashscope.aliyun.com

还有一个关键点就是要设置api_key,大家如果没有api_key的话可以去github这个项目上找:github.com/chatanywher…

!pip install requests
!pip install beautifulsoup4
import requests  
from bs4 import BeautifulSoup

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'
  }
  url = 'https://movie.douban.com/chart'
  response = requests.get(url, headers=headers)
  # 状态码 成功
  if response.status_code == 200:
    # 内存中的dom对象
    soup = BeautifulSoup(response.text, 'html.parser')
    movie_list = []
    movies = soup.select('#wrapper #content .article .item')
    all_movies_text = ''.join([movie.prettify() for movie in movies[:2]])
    return all_movies_text
  else:
    print("Failed to retrieve content ")

movies = fetch_movie_list(url)
print(movies)

  1. !pip install requests!pip install beautifulsoup4:这两行是安装Python中两个常用库的命令,requests 用于发送HTTP请求,beautifulsoup4 用于解析HTML文档,提取数据。注意,在实际运行Python脚本时,这些安装命令通常在命令行界面执行,而不直接写在脚本中。
  2. import requestsfrom bs4 import BeautifulSoup:这两行导入了刚提到的两个库,以便在脚本中使用它们的功能。
  3. 定义了一个名为 fetch_movie_list 的函数,该函数接收一个参数 url,其目的是获取并解析指定URL上的电影列表。
  4. 在函数内部,首先定义了一个字典 headers,其中包含了模拟的浏览器User-Agent信息,这是为了使得HTTP请求看起来像是从一个正常的浏览器发出,从而避免被服务器拒绝。
  5. 设置了默认的请求URL为豆瓣电影排行榜的页面 'https://movie.douban.com/chart'
  6. 使用 requests.get() 函数发送GET请求到指定的URL,并传入了定制的请求头。然后检查响应的状态码是否为200,200表示请求成功。
  7. 如果请求成功(状态码为200),则使用 BeautifulSoup 解析返回的HTML内容。这里使用的解析器是 'html.parser',是最基本且稳定的HTML解析方式。
  8. 初始化一个空列表 movie_list,用于存储电影信息。然后,通过CSS选择器 '#wrapper #content .article .item' 来定位到网页中电影条目所在的元素。这个选择器会找到所有符合该路径的电影项目。
  9. 使用列表推导式和 prettify() 方法将前两个电影项目的HTML结构转换为格式化的字符串,并拼接在一起赋值给 all_movies_text
  10. 如果请求失败,打印错误信息 "Failed to retrieve content "。
  11. 最后,调用 fetch_movie_list(url) 函数,并打印出从网页上获取的前两个电影项目的HTML片段。

咱们爬取到的内容:

image-20240516121922905.png

编写prompt让位给大模型去做:

# AIGC LLM + Prompt(指令)
#es6 `` 字符串模板
prompt = f"""
{movies}
这是一段电影列表html,请获取电影名(name),封面链接(picture),简介(info),评分(score),
评论人数(commentsNumber),请使用括号的单词作为属性名,以JSON数组的格式返回
"""
print(prompt)
!pip install dashscope
import dashscope
dashscope.api_key = '填上你的apikey'
def call_qwen_with_prompt():
    messages = [
        {
            'role':'user',
            'content':prompt
        }
    ]
    response = dashscope.Generation.call(
        dashscope.Generation.Models.qwen_turbo,
        messages=messages,
        rseult_messages='message')
    print(response)
call_qwen_with_prompt()

最后咱们来看结果:

image-20240516122220989.png 可以看到成功拿到结果200,成功获取JSON文件。

总结:

AIGC 作为一种新兴技术,正逐渐改变着我们的生活和工作方式。它展现出了强大的创造力和高效性,能够生成丰富多样的内容。虽然它对传统编程方式带来了一定的冲击,但两者也可以相互结合,发挥各自的优势。AIGC 为我们带来了新的机遇和挑战,我们需要积极适应并探索其应用,以更好地推动科技的进步和发展。使用大模型开发相比传统编程确实大大提高了效率,使用简单的几行代码就可以完成我们想要完成的事情。确实高效。大家感兴趣的可以去试试去玩玩!