获取豆瓣电影所有分类,所有好评区间,所有页的全部电影数据
解析字段:标题,评分,评价人数,演员列表=
获取豆瓣电影所有分类,所有好评区间,所有页的全部电影数据 解析字段:标题,评分,评价人数,演员列表=
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
檀越@新空间 2025-07-31 20:33关注晚上好🌙🌙🌙
本答案参考通义千问要获取豆瓣电影所有分类、所有好评区间、所有页的全部电影数据,并解析出标题、评分、评价人数、演员列表字段,我们需要进行以下步骤:
一、项目目标
- 获取豆瓣电影的所有分类(如:剧情、喜剧、动作等);
- 遍历每个分类下的所有好评区间(如:9.0以上、8.0-9.0等);
- 爬取每个分类和好评区间的所有页的电影数据;
- 提取每部电影的:
- 标题
- 评分
- 评价人数
- 演员列表
二、技术方案
1. 抓取豆瓣电影分类
- 使用
requests或selenium发送请求到豆瓣电影主页。 - 解析页面中的分类链接(如:https://movie.douban.com/subject_search?cat=1001)
示例代码:
import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/subject_search?cat=1001' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 找到所有分类 categories = soup.find_all('div', class_='category') for category in categories: print(category.get_text())
2. 获取每个分类下的好评区间
- 每个分类页面中会有“评分区间”选项,例如:9.0以上、8.0-9.0等。
- 需要遍历这些评分区间。
示例代码:
base_url = 'https://movie.douban.com/subject_search?cat={}&search_text=' category_id = '1001' # 剧情类 ratings = ['9.0+', '8.0-9.0', '7.0-8.0', '6.0-7.0', '5.0-6.0'] for rating in ratings: url = base_url.format(category_id) + f'&rating={rating}' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 处理当前评分区间的电影数据
3. 爬取所有页的电影数据
- 每个分类和评分区间下可能有多个页面,需要遍历翻页。
示例代码:
page = 1 while True: url = f'https://movie.douban.com/subject_search?cat={category_id}&search_text=&rating={rating}&start={page*15}' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') movies = soup.find_all('div', class_='item') if not movies: break for movie in movies: title = movie.find('a').get('title') score = movie.find('span', class_='rating_nums').text.strip() comment_count = movie.find('div', class_='star').find_all('span')[-1].text.strip() actors = [actor.get_text() for actor in movie.find_all('p', class_='pl')] print(f"标题: {title}") print(f"评分: {score}") print(f"评价人数: {comment_count}") print(f"演员列表: {', '.join(actors)}") print('-' * 50) page += 1
4. 数据存储
- 可以将数据保存为 CSV 文件或数据库(如 MySQL、MongoDB)。
示例代码(保存为 CSV):
import csv with open('douban_movies.csv', 'w', encoding='utf-8-sig', newline='') as f: writer = csv.writer(f) writer.writerow(['标题', '评分', '评价人数', '演员列表']) for movie in all_movies: writer.writerow([movie['title'], movie['score'], movie['comment_count'], ', '.join(movie['actors'])])
三、关键注意事项
- 反爬机制:豆瓣对爬虫有严格的限制,建议使用
requests+headers或Selenium模拟浏览器行为。 - 速率控制:避免频繁请求导致 IP 被封,建议设置随机延迟(如 1~3 秒)。
- 合法性:确保遵守《中华人民共和国计算机信息网络国际联网管理暂行规定》及网站的
robots.txt规则。
四、完整代码示例(整合)
import requests from bs4 import BeautifulSoup import csv import time import random headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } def get_category_list(): url = 'https://movie.douban.com/subject_search?cat=1001' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') return [link.get('href') for link in soup.find_all('a', href=True) if 'cat=' in link.get('href')] def parse_movie_page(url): response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') movies = soup.find_all('div', class_='item') data = [] for movie in movies: title = movie.find('a').get('title') score = movie.find('span', class_='rating_nums').text.strip() comment_count = movie.find('div', class_='star').find_all('span')[-1].text.strip() actors = [actor.get_text() for actor in movie.find_all('p', class_='pl')] data.append({ 'title': title, 'score': score, 'comment_count': comment_count, 'actors': actors }) return data def main(): categories = get_category_list() ratings = ['9.0+', '8.0-9.0', '7.0-8.0', '6.0-7.0', '5.0-6.0'] all_data = [] for category in categories: category_id = category.split('=')[1] for rating in ratings: page = 0 while True: url = f'https://movie.douban.com/subject_search?cat={category_id}&search_text=&rating={rating}&start={page*15}' try: data = parse_movie_page(url) if not data: break all_data.extend(data) print(f"已抓取 {len(all_data)} 条数据") time.sleep(random.uniform(1, 3)) except Exception as e: print("Error:", e) break page += 1 with open('douban_movies.csv', 'w', encoding='utf-8-sig', newline='') as f: writer = csv.writer(f) writer.writerow(['标题', '评分', '评价人数', '演员列表']) for item in all_data: writer.writerow([item['title'], item['score'], item['comment_count'], ', '.join(item['actors'])]) if __name__ == '__main__': main()
五、总结
-
重点实现步骤:
- 获取豆瓣电影分类;
- 遍历每个分类下的评分区间;
- 爬取每页的电影数据;
- 提取所需字段并保存为文件。
-
关键点:
- 反爬策略:使用合理的 headers 和延时;
- 数据结构:使用字典存储每条电影信息;
- 输出格式:CSV 文件便于后续分析。
如需进一步扩展功能(如自动识别分类、动态爬取更多评分区间),可结合
Selenium或Scrapy进行优化。解决 无用评论 打赏 举报