从编程到AI智慧解析:豆瓣电影排行榜的爬虫实践与AI思维转型

163 阅读3分钟

传统编程思维下的豆瓣电影排行榜爬虫

  1. 目标定义

    • 爬取豆瓣电影排行榜上的电影列表,包括电影名、图片链接、评分和简短评。
  2. 技术栈

    • 请求库:使用requests发送HTTP请求到https://movie.douban.com/chart获取网页内容。
    • 解析库:使用BeautifulSoup或其他HTML解析库来解析返回的HTML字符串,定位到电影列表相关的元素。
  3. 步骤

    • 初始化项目,安装必要的库:npm init -y, npm install requests beautifulsoup4
    • 发送GET请求到目标URL,获取HTML页面。
    • 使用正则表达式或CSS选择器定位到.article .movies下的电影列表。
    • 遍历列表,提取每部电影的titlepicdescscore属性。
    • 将提取的信息组织成JSON数组并存储或进一步处理。
  4. 完整代码

//{编程实现爬虫爬取豆瓣电影}
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)
 // 电影名(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)
 }
 })
}
})

AI思维优化方案

AIGC素养应用

  1. 减少重复编程工作

    • HTTP请求:虽然直接的HTTP请求操作仍然是基础,但可以通过封装好的API或SDK简化此步骤,如某些语言模型的API调用法可以直接发起请求。
    • 数据提取:使用AI模型直接从HTML字符串中提取结构化信息,如通过训练好的模型理解HTML标签结构,直接输出JSON格式数据。
  2. Prompt Engineering

    • 明确意图:向AI模型提供清晰的指令:“从豆瓣电影排行榜页面HTML中提取最新电影的名称、图片链接、简介和评分。”
    • 数据格式:指示模型以特定格式输出数据,例如JSON数组,确保结果直接符合后续处理需求。

使用AI进行网页数据抓取与解析

1. 自然语言指令驱动的爬虫:

  • 设想直接用自然语言指令代替编写详细的爬虫代码。例如:“从豆瓣电影排行榜抓取前20部电影的名称、评分、简介和海报链接。” AI模型理解指令后,自动发起网络请求,解析返回的HTML,并基于自然语言描述的结构规则提取数据。

总结

  • AI优先:在处理自然语言理解和生成式任务方面,如解析网页内容、生成结构化数据,大模型展现了强大的能力。这减少了手动编写正则表达式和解析逻辑的繁琐,提升了开发效率。
  • 传统与AI融合:对于非自然语言处理的任务,如底层的网络请求和文件操作,传统编程依然重要。AI与传统编程的结合形成了AIGC全栈,使得开发更加高效、灵活。
  • Prompt的重要性:驱动AI模型的关键在于提供精准的提示,清晰表达需求,使模型能够准确执行,如同编程中的算法设计一样重要。