自学内容网 自学内容网

《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 页面获取数据。进一步地,我们对抓取到的数据进行了简单的分析,展示了评分分布和评分与排名的关系。这些技能可以帮助你在日常工作和学习中更好地处理和分析数据,发现数据背后的价值。

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


原文地址:https://blog.csdn.net/Zyj_0101/article/details/143777464

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!