《Python Web 抓取实战:豆瓣电影 Top 250 数据抓取与分析》

引言

在信息爆炸的时代,掌握数据获取的能力显得尤为重要。通过数据抓取,我们可以从互联网上获取大量有价值的信息,并进行深入分析。本文将介绍如何使用 Python 进行 Web 抓取,以豆瓣电影 Top 250 为例,展示数据抓取的整个过程,并对其进行简单的分析。

1. 环境准备

在开始之前,我们需要确保已经安装了以下 Python 库:

  • requests:用于发送 HTTP 请求。
  • BeautifulSoup:用于解析 HTML 文档。
  • 你可以通过以下命令安装这些库:

    pip install requests beautifulsoup4
    

    2. 抓取豆瓣电影 Top 250 数据

    我们将从豆瓣电影 Top 250 页面抓取电影的排名、名称、评分以及链接。以下是抓取代码的详细步骤:

    2.1 导入库
    import requests
    from bs4 import BeautifulSoup
    

    2.2 设定抓取的 URL 和 Headers
    url = 'https://movie.douban.com/top250?start=0'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
        'Cookie': 'bid=rGc9sMDwa54; ap_v=0,6.0; __utma=30149280.1585206026.1731574671.1731574671.1731574671.1; __utmb=30149280.0.10.1731574671; __utmc=30149280; __utmz=30149280.1731574671.1.1.utmcsr=link.csdn.net|utmccn=(referral)|utmcmd=referral|utmcct=/'
    }
    

    2.3 抓取数据
    for i in range(10):
        # 构造新的 URL
        url = 'https://movie.douban.com/top250?start=' + str(i * 25)
        print(f"正在抓取第 {i+1} 页:{url}")
        
        # 发送 GET 请求
        data = requests.get(url, headers=headers).content
        
        # 解析 HTML
        soup = BeautifulSoup(data, 'lxml')
        
        # 使用 CSS 选择器获取电影名称、排名、评分和链接
        name = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a > span:nth-child(1)')
        rank = soup.select("#content > div > div.article > ol > li > div > div.pic > em")
        pingfen = soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > div > span.rating_num')
        web = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a')
        
        # 遍历每一部电影,构造电影信息字符串并打印
        for i in range(len(name)):
            temp = str(rank[i].get_text()) + "--" + str(name[i].get_text()) + "--" + str(pingfen[i].get_text()) + "--" + web[i]['href']
            print(str(temp))
    

    3. 数据分析

    抓取到的数据可以进行进一步的分析。以下是一些简单的分析示例:

    3.1 统计评分分布

    我们可以统计各个评分区间的电影数量,了解评分的分布情况。

    from collections import defaultdict
    
    # 初始化评分分布字典
    rating_distribution = defaultdict(int)
    
    for i in range(10):
        url = 'https://movie.douban.com/top250?start=' + str(i * 25)
        data = requests.get(url, headers=headers).content
        soup = BeautifulSoup(data, 'lxml')
        pingfen = soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > div > span.rating_num')
        
        for score in pingfen:
            rating = float(score.get_text())
            if rating >= 9.0:
                rating_distribution['9.0+'] += 1
            elif rating >= 8.0:
                rating_distribution['8.0-8.9'] += 1
            elif rating >= 7.0:
                rating_distribution['7.0-7.9'] += 1
            else:
                rating_distribution['7.0-'] += 1
    
    print("评分分布:", rating_distribution)
    

    3.2 分析评分与排名的关系

    我们可以分析评分与排名之间的关系,看看是否存在高评分但排名较低的情况。

    import matplotlib.pyplot as plt
    
    # 初始化评分和排名列表
    ratings = []
    ranks = []
    
    for i in range(10):
        url = 'https://movie.douban.com/top250?start=' + str(i * 25)
        data = requests.get(url, headers=headers).content
        soup = BeautifulSoup(data, 'lxml')
        pingfen = soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > div > span.rating_num')
        rank = soup.select("#content > div > div.article > ol > li > div > div.pic > em")
        
        for score, r in zip(pingfen, rank):
            ratings.append(float(score.get_text()))
            ranks.append(int(r.get_text()))
    
    # 绘制评分与排名的关系图
    plt.figure(figsize=(10, 6))
    plt.scatter(ranks, ratings, alpha=0.5)
    plt.title('豆瓣电影 Top 250 评分与排名关系')
    plt.xlabel('排名')
    plt.ylabel('评分')
    plt.grid(True)
    plt.show()
    

    4. 总结

    通过本文的实战演示,我们学会了如何使用 Python 进行 Web 抓取,并从豆瓣电影 Top 250 页面获取数据。进一步地,我们对抓取到的数据进行了简单的分析,展示了评分分布和评分与排名的关系。这些技能可以帮助你在日常工作和学习中更好地处理和分析数据,发现数据背后的价值。

    希望本文对你有所帮助,欢迎在评论区留言交流!

    作者:one piece是真实存在的

    物联沃分享整理
    物联沃-IOTWORD物联网 » 《Python Web 抓取实战:豆瓣电影 Top 250 数据抓取与分析》

    发表回复