Smart猪 2025-07-31 20:32 采纳率: 0%
浏览 6

获取豆瓣电影所有分类,所有好评区间,所有页的全部电影数据 解析字段:标题,评分,评价人数,演员列表=

获取豆瓣电影所有分类,所有好评区间,所有页的全部电影数据
解析字段:标题,评分,评价人数,演员列表=

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-07-31 20:33
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    要获取豆瓣电影所有分类、所有好评区间、所有页的全部电影数据,并解析出标题、评分、评价人数、演员列表字段,我们需要进行以下步骤:


    一、项目目标

    • 获取豆瓣电影的所有分类(如:剧情、喜剧、动作等);
    • 遍历每个分类下的所有好评区间(如:9.0以上、8.0-9.0等);
    • 爬取每个分类和好评区间的所有页的电影数据;
    • 提取每部电影的:
      • 标题
      • 评分
      • 评价人数
      • 演员列表

    二、技术方案

    1. 抓取豆瓣电影分类

    • 使用 requestsselenium 发送请求到豆瓣电影主页。
    • 解析页面中的分类链接(如: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 + headersSelenium 模拟浏览器行为。
    • 速率控制:避免频繁请求导致 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()
    

    五、总结

    • 重点实现步骤

      1. 获取豆瓣电影分类;
      2. 遍历每个分类下的评分区间;
      3. 爬取每页的电影数据;
      4. 提取所需字段并保存为文件。
    • 关键点

      • 反爬策略:使用合理的 headers 和延时;
      • 数据结构:使用字典存储每条电影信息;
      • 输出格式:CSV 文件便于后续分析。

    如需进一步扩展功能(如自动识别分类、动态爬取更多评分区间),可结合 SeleniumScrapy 进行优化。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月31日