如何用 Python 爬取豆瓣电影 Top 250?


文章目录

  • 如何用 Python 爬取豆瓣电影 Top 250?
  • 前言
  • 1. 工具与环境
  • 2. 爬虫实现步骤
  • 2.1 页面结构分析
  • 2.2 爬虫代码
  • 3. 代码解析
  • 4. 运行结果
  • 5. 注意事项
  • 6. 进阶优化
  • 总结
  • 如何用 Python 爬取豆瓣电影 Top 250?

    前言

    豆瓣电影 Top 250 是影迷们寻找经典好片的常用榜单。作为 Python 爱好者,我们可以利用 Python 爬虫 技术将该榜单的所有电影标题抓取下来,并在本地保存或分析。本文将详细介绍如何实现这个目标。


    1. 工具与环境

    在实现爬取的过程中,我们主要会用到以下工具:

  • Python 3.x:主语言。
  • requests 库:用于发送 HTTP 请求。
  • BeautifulSoup4 库:用于解析网页内容。
  • 豆瓣 Top 250 页面:分页展示电影榜单,每页 25 条,共 10 页。

  • 2. 爬虫实现步骤

    2.1 页面结构分析

    打开 豆瓣电影 Top 250 页面,按 F12 查看网页源代码:

  • 每个电影标题包含在:
    <span class="title">电影名称</span>
    
  • 每页显示 25 部电影,共 10 页,URL 格式如下:
    https://movie.douban.com/top250?start=0
    https://movie.douban.com/top250?start=25
    https://movie.douban.com/top250?start=50
    ...
    
  • 2.2 爬虫代码

    下面是完整的代码,包含分页爬取、标题提取和去重处理:

    from bs4 import BeautifulSoup
    import requests
    
    # 设置请求头,模拟浏览器访问
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
    }
    
    # 电影标题列表
    all_movies = []
    
    # 逐页爬取,每页 25 条,总共 10 页
    for page in range(10):
        url = f"https://movie.douban.com/top250?start={page * 25}"
        response = requests.get(url, headers=headers)
    
        # 确保请求成功
        if response.status_code == 200:
            content = response.text
            soup = BeautifulSoup(content, "html.parser")
    
            # 提取标题并过滤外文名
            titles = soup.findAll("span", attrs={"class": "title"})
            for link in titles:
                title = link.text
                if "/" not in title:  # 过滤掉外文名
                    all_movies.append(title)
        else:
            print(f"请求失败,状态码: {response.status_code}, 页面: {url}")
            break
    
    # 输出所有电影标题
    for idx, movie in enumerate(all_movies, 1):
        print(f"{idx}. {movie}")
    
    # 验证数量
    print(f"\n总共爬取到 {len(all_movies)} 部电影")
    

    3. 代码解析

    1. 设置请求头
      模拟浏览器访问,防止网站反爬机制拦截请求:

      headers = {
          "User-Agent": "Mozilla/5.0 ..."
      }
      
    2. 分页请求
      通过循环逐页爬取,每次请求对应页面:

      for page in range(10):
          url = f"https://movie.douban.com/top250?start={page * 25}"
      
    3. HTML 解析
      使用 BeautifulSoup 提取所有包含电影标题的 <span> 标签:

      titles = soup.findAll("span", attrs={"class": "title"})
      
    4. 去除外文名
      豆瓣的标题中有时包含外文名(例如:肖申克的救赎 / The Shawshank Redemption),通过简单判断过滤掉:

      if "/" not in title:
          all_movies.append(title)
      
    5. 结果输出
      打印所有电影标题,并验证爬取数量是否正确。


    4. 运行结果

    运行代码后,会输出类似以下结果:

    1. 肖申克的救赎
    2. 霸王别姬
    3. 阿甘正传
    4. 这个杀手不太冷
    5. 美丽人生
    ...
    250. 教父2
    
    总共爬取到 250 部电影
    

    5. 注意事项

    1. 反爬机制

    2. 添加 User-Agent 头部信息,模拟正常用户访问。
    3. 若请求频繁,建议增加访问间隔,例如 time.sleep(1)
    4. HTML 结构变化
      豆瓣可能随时更新页面结构,需要重新检查标签选择器。

    5. 数据存储
      爬取的数据可存储为文件,如 CSV、TXT、JSON 格式,便于后续分析。


    6. 进阶优化

  • 多线程爬取:使用多线程提高爬取速度。
  • 数据存储:将结果保存到数据库(如 SQLite)。
  • 图表分析:用 Matplotlib 绘制电影排名分析图。

  • 总结

    通过本文的学习,你已掌握了如何使用 Python 和 BeautifulSoup 爬取豆瓣电影 Top 250 榜单。这不仅帮助你加深了对网页爬虫的理解,也为进一步数据分析和项目开发打下了基础。

    如果你感兴趣,可以尝试扩展爬取电影的评分、简介、导演等信息,做更深入的数据分析。


    代码已提供,动手实践是最好的学习方式! 🚀
    如果喜欢这篇博客,请点赞、分享或者留言交流!😊

    作者:远方2.0

    物联沃分享整理
    物联沃-IOTWORD物联网 » 如何用 Python 爬取豆瓣电影 Top 250?

    发表回复