传统编程思维下的豆瓣电影排行榜爬虫
-
目标定义:
- 爬取豆瓣电影排行榜上的电影列表,包括电影名、图片链接、评分和简短评。
-
技术栈:
- 请求库:使用
requests
发送HTTP请求到https://movie.douban.com/chart
获取网页内容。 - 解析库:使用
BeautifulSoup
或其他HTML解析库来解析返回的HTML字符串,定位到电影列表相关的元素。
- 请求库:使用
-
步骤:
- 初始化项目,安装必要的库:
npm init -y
,npm install requests beautifulsoup4
- 发送GET请求到目标URL,获取HTML页面。
- 使用正则表达式或CSS选择器定位到
.article .movies
下的电影列表。 - 遍历列表,提取每部电影的
title
、pic
、desc
和score
属性。 - 将提取的信息组织成JSON数组并存储或进一步处理。
- 初始化项目,安装必要的库:
-
完整代码
//{编程实现爬虫爬取豆瓣电影}
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素养应用
-
减少重复编程工作:
- HTTP请求:虽然直接的HTTP请求操作仍然是基础,但可以通过封装好的API或SDK简化此步骤,如某些语言模型的API调用法可以直接发起请求。
- 数据提取:使用AI模型直接从HTML字符串中提取结构化信息,如通过训练好的模型理解HTML标签结构,直接输出JSON格式数据。
-
Prompt Engineering:
- 明确意图:向AI模型提供清晰的指令:“从豆瓣电影排行榜页面HTML中提取最新电影的名称、图片链接、简介和评分。”
- 数据格式:指示模型以特定格式输出数据,例如JSON数组,确保结果直接符合后续处理需求。
使用AI进行网页数据抓取与解析
1. 自然语言指令驱动的爬虫:
- 设想直接用自然语言指令代替编写详细的爬虫代码。例如:“从豆瓣电影排行榜抓取前20部电影的名称、评分、简介和海报链接。” AI模型理解指令后,自动发起网络请求,解析返回的HTML,并基于自然语言描述的结构规则提取数据。
总结
- AI优先:在处理自然语言理解和生成式任务方面,如解析网页内容、生成结构化数据,大模型展现了强大的能力。这减少了手动编写正则表达式和解析逻辑的繁琐,提升了开发效率。
- 传统与AI融合:对于非自然语言处理的任务,如底层的网络请求和文件操作,传统编程依然重要。AI与传统编程的结合形成了AIGC全栈,使得开发更加高效、灵活。
- Prompt的重要性:驱动AI模型的关键在于提供精准的提示,清晰表达需求,使模型能够准确执行,如同编程中的算法设计一样重要。