引言
在信息爆炸的时代,掌握数据获取的能力显得尤为重要。通过数据抓取,我们可以从互联网上获取大量有价值的信息,并进行深入分析。本文将介绍如何使用 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):# 构造新的 URLurl = 'https://movie.douban.com/top250?start=' + str(i * 25)print(f"正在抓取第 {i+1} 页:{url}")# 发送 GET 请求data = requests.get(url, headers=headers).content# 解析 HTMLsoup = 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).contentsoup = 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+'] += 1elif rating >= 8.0:rating_distribution['8.0-8.9'] += 1elif rating >= 7.0:rating_distribution['7.0-7.9'] += 1else:rating_distribution['7.0-'] += 1print("评分分布:", 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).contentsoup = 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 页面获取数据。进一步地,我们对抓取到的数据进行了简单的分析,展示了评分分布和评分与排名的关系。这些技能可以帮助你在日常工作和学习中更好地处理和分析数据,发现数据背后的价值。
希望本文对你有所帮助,欢迎在评论区留言交流!