1. 项目概述当Python爬虫遇上AIGC最近在整理个人影单时突然想到如果能自动抓取豆瓣电影榜单数据再用AI生成个性化推荐该多方便。说干就干我用Python的requestsBeautifulSoup组合实现了基础爬虫接着用通义千问API对数据进行二次加工。整个过程就像搭积木——先获取原材料网页数据再用AI工具进行精加工分析推荐。这个项目特别适合两类朋友一是刚学Python想找实战项目的入门者网页抓取是检验基础语法的最佳试金石二是对AIGC应用感兴趣的技术爱好者你会发现大模型API调用比想象中简单得多。下面我就把踩过的坑和最终方案完整分享出来代码已上传GitHub文末附链接。2. 技术选型与工具准备2.1 为什么选择这套技术栈爬虫部分选用requestsBeautifulSoup而非Scrapy主要考虑三点学习曲线平缓Scrapy框架需要理解中间件、管道等概念豆瓣页面结构相对简单无需分布式爬取配合lxml解析器速度足够应对中小规模抓取测试时发现豆瓣电影TOP250页面有基础反爬措施User-Agent校验需模拟浏览器访问频率限制需设置2-3秒间隔动态加载内容部分数据需要解析JavaScript对于AIGC部分选择通义千问API出于以下考量中文处理能力强于GPT-3.5提供免费额度足够本项目使用返回结果包含结构化数据便于后续处理2.2 环境配置清单# 核心依赖库 pip install requests beautifulsoup4 lxml # AIGC相关 pip install dashscope # 通义千问Python SDK重要提示建议使用Python 3.8版本部分新特性如f-string能让代码更简洁。我在Windows 11VS Code和macOSPyCharm环境下均测试通过。3. 爬虫实现详解3.1 网页结构分析首先用Chrome开发者工具(F12)观察豆瓣TOP250页面每部电影信息包裹在div classitem中评分位于span classrating_num短评数量藏在div classstar下的第2个span详情页链接在div classhd的a标签href属性关键发现翻页通过URL参数?start控制每页25条共10页。3.2 核心爬取代码import requests from bs4 import BeautifulSoup import time headers { User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 } def scrape_douban_top250(): base_url https://movie.douban.com/top250 movies [] for page in range(0, 250, 25): url f{base_url}?start{page} response requests.get(url, headersheaders) soup BeautifulSoup(response.text, lxml) for item in soup.find_all(div, class_item): title item.find(span, class_title).text rating item.find(span, class_rating_num).text comment_count item.find(div, class_star).find_all(span)[-1].text[:-3] detail_url item.find(div, class_hd).a[href] movies.append({ title: title, rating: float(rating), comment_count: int(comment_count), detail_url: detail_url }) time.sleep(2.5) # 礼貌性延迟 return movies3.3 反爬应对策略User-Agent轮换准备多个主流浏览器的UA字符串存入列表随机选择IP代理池使用免费代理IP服务如西刺代理但注意免费IP稳定性差请求间隔随机化将固定2.5秒改为random.uniform(1.5, 3.5)Cookie维持使用requests.Session()保持会话实测发现豆瓣对单个IP的容忍度较高只要不短时间高频访问如每秒多次基础UA延迟就能稳定抓取。4. AIGC数据处理实践4.1 数据清洗与结构化原始爬取数据存在三个问题中文片名和英文片名混在一起如肖申克的救赎 / The Shawshank Redemption部分字段缺失如老电影可能没有评分人数数据类型需要转换字符串转数值清洗代码示例def clean_movie_data(raw_data): cleaned [] for movie in raw_data: # 分离中英文片名 title_parts movie[title].split( / ) main_title title_parts[0] # 处理可能缺失的字段 rating movie.get(rating, 0) comments movie.get(comment_count, 0) cleaned.append({ chinese_title: main_title, original_title: title_parts[1] if len(title_parts) 1 else , rating: rating, comment_count: comments, detail_url: movie[detail_url] }) return cleaned4.2 通义千问API接入首先到阿里云开通DashScope服务获取API Keyimport dashscope dashscope.api_key 你的API_KEY def analyze_with_ai(movie_data): prompt f请根据以下电影信息生成推荐理由 片名{movie_data[chinese_title]} 评分{movie_data[rating]}/10 短评数{movie_data[comment_count]} 要求 1. 指出电影类型如剧情/科幻 2. 50字以内推荐语 3. 用emoji表情增加趣味性 response dashscope.Generation.call( modelqwen-turbo, promptprompt ) return response.output[text]4.3 结果可视化使用PandasMatplotlib生成基础图表import pandas as pd import matplotlib.pyplot as plt def visualize_results(movies): df pd.DataFrame(movies) # 评分分布直方图 plt.figure(figsize(10, 6)) df[rating].hist(bins20) plt.title(豆瓣TOP250评分分布) plt.xlabel(评分) plt.ylabel(电影数量) plt.savefig(rating_dist.png) # 评分与评论数散点图 plt.figure(figsize(10, 6)) plt.scatter(df[rating], df[comment_count], alpha0.5) plt.title(评分 vs 评论数) plt.xlabel(评分) plt.ylabel(评论数) plt.savefig(rating_vs_comments.png)5. 完整项目架构douban-ai-analyzer/ ├── scraper/ # 爬虫模块 │ ├── __init__.py │ ├── douban.py # 核心爬取逻辑 │ └── utils.py # 反爬工具类 ├── aigc/ # AI处理模块 │ ├── analyzer.py # 通义千问接口封装 │ └── prompts/ # 预设提示词模板 ├── data/ # 数据存储 │ ├── raw/ # 原始数据 │ └── processed/ # 清洗后数据 ├── docs/ # 文档 ├── requirements.txt # 依赖清单 └── main.py # 入口文件6. 常见问题与解决方案6.1 爬虫被封怎么办现象返回403状态码或验证码页面解决方案检查User-Agent是否有效增加代理IP降低请求频率至每分钟不超过20次使用selenium模拟人工操作终极方案6.2 AIGC返回内容不符合预期优化方向改进提示词工程# 不好的示例 说说这部电影怎么样 # 好的示例 请以专业影评人角度分析 1. 指出3个核心亮点表演/剧情/摄影 2. 用1-10分评估艺术价值 3. 适合哪类观众调整temperature参数控制创造性对输出结果后处理提取关键信息6.3 数据存储方案选型根据数据量选择小型项目CSV文件pandas.to_csv中型项目SQLite内置支持无需安装大型项目MongoDB适合非结构化数据# SQLite示例 import sqlite3 conn sqlite3.connect(movies.db) df.to_sql(douban_top250, conn, if_existsreplace, indexFalse)7. 项目扩展思路实时监控用APScheduler定时运行检测榜单变化情感分析抓取短评后用NLP分析情感倾向个性化推荐结合用户历史评分构建推荐系统自动化报告用Jinja2生成HTML周报部署为服务FastAPI暴露RESTful接口# FastAPI简易示例 from fastapi import FastAPI app FastAPI() app.get(/recommend) async def recommend_genre(genre: str): return [m for m in movies if genre in analyze_with_ai(m)]这个项目最让我惊喜的是AIGC的接入成本之低——不到50行代码就实现了智能影评生成。有个小心得豆瓣的robots.txt并未禁止/top250的抓取但商业用途仍需获得授权。完整代码已放在GitHub搜索douban-ai-analyzer欢迎Star交流。