目录
- 项目概述
- 代码解释
- 实现过程中出现的问题
- 感言
1. 项目概述
随着互联网的快速发展,网络上的信息量呈指数级增长,尤其是影视内容。在这个项目中,我们使用 Python 编程语言的 requests
和 lxml
库来爬取某电影网站的电影数据。我们的目标是获取不同类别(如喜剧、爱情、恐怖等)的电影信息,并将其保存为 CSV 文件,便于后续的数据分析与处理。
2. 代码解释
以下是项目的代码及详细解释:
2.1 导入库:首先,我们导入了三个必要的库:
requests
:用于发送 HTTP 请求并获取网页内容。lxml.html
:用于解析 HTML 文档,提取所需的数据。pandas
:用于数据处理和存储,方便将数据保存为 CSV 文件。import requests from lxml import html import pandas as pd
2.2 类别列表:定义一个包含多个电影类别的列表。这个列表用于循环遍历,获取每个类别的电影信息。
# 类别列表
categories = ["喜剧", "爱情", "恐怖", "动作", "科幻", "剧情"]
2.3 基础 URL:定义一个基础 URL 模板,{}
是占位符,将在后续代码中用具体的类别名称进行格式化。这种设计使得构建 URL 变得简单且灵活。
# 基础 URL
base_url = "https://sc1080.top/index.php/vod/show/class/{}/id/1.html"
2.3 循环遍历类别:使用 for
循环遍历 categories
列表中的每个类别,使用 format()
方法将当前类别插入到基础 URL 中,生成完整的请求 URL。同时,打印出当前正在处理的类别和对应的 URL,便于调试和追踪。
for category in categories:
# 构建类别的 URL
url = base_url.format(category)
print(f"正在获取类别: {category} - URL: {url}")
2.4 发送请求并编码:使用 requests.get()
方法向构建的 URL 发送 HTTP GET 请求,以获取网页内容。并且进行编码设置 response.encoding
为 response.apparent_encoding
,确保网页内容编码正确,以避免中文字符乱码。
# 发送请求
response = requests.get(url)
response.encoding = response.apparent_encoding # 确保编码正确
2.5 解析 HTML并提取数据:使用 lxml
的 fromstring()
方法将获取的网页内容解析为 HTML 树,然后使用 XPath 表达式选择包含电影信息的所有节点,并将结果存储在 movies
列表中。这个 XPath 定位到每个电影条目的容器,确保能提取到相关信息。
# 解析网页内容
tree = html.fromstring(response.text)
# 获取电影列表中的所有电影数据
movies = tree.xpath('//*[@id="main"]/div/div[2]/div[1]/div/div[@class="module-item"]')
2.6 初始化数据存储:创建一个空列表 movie_data
,用于存储当前类别下的所有电影数据,并且对每个 movie
对象进行遍历,在 try
块中提取电影的各项信息并且添加到movie_data中
。
movie_title
:使用 XPath 获取电影标题。cover_image
:获取电影封面图片的 URL。release_date
:获取电影的出版日期。actors
:获取电影主演的列表。
# 创建一个空列表用于存储当前类别的电影数据
movie_data = []
for movie in movies:
try:
movie_title = movie.xpath('.//div[@class="module-item-pic"]/a/@title')[0] # 电影标题
cover_image = movie.xpath('.//div[@class="module-item-pic"]/img/@src')[0] # 封面地址
release_date = movie.xpath('.//div[@class="module-item-caption"]/span[1]/text()')[0] # 出版日期
actors = movie.xpath('.//div[@class="module-item-content"]/div[2]/a/text()') # 主演
# 将电影数据添加到列表中
movie_data.append({
"标题": movie_title,
"封面地址": f"https://sc1080.top{cover_image}",
"出版日期": release_date,
"主演": ', '.join(actors)
})
2.7 数据存储到csv:将 movie_data
列表转换为 Pandas DataFrame,使用 to_csv()
方法将 DataFrame 保存为 CSV 文件,文件名为当前类别名称,确保不包含索引,且编码格式为 UTF-8,避免中文乱码。
# 创建 DataFrame 并保存到每个类别的 CSV 文件
df = pd.DataFrame(movie_data)
category_filename = f'{category}.csv' # 使用类别名称作为文件名
df.to_csv(category_filename, index=False, encoding='utf-8-sig')
print(f"{category} 数据已成功保存到 '{category_filename}'")
3. 实现过程中出现的问题
在项目实施过程中,我们遇到了一些挑战:
-
XPath 的使用:最初,在获取数据时,由于 XPath 路径的书写错误导致无法获取到所需信息。通过反复检查和调试,最终找到了正确的 XPath。
-
网络请求的频率:在发送请求的过程中,频繁的请求可能会导致服务器的防爬虫机制触发,导致获取的数据不完整。为此,我们在请求之间加入了适当的延迟(例如
time.sleep()
),以降低请求频率。 -
数据格式:在将数据保存为 CSV 文件时,确保编码格式为 UTF-8,以避免中文字符出现乱码。
4. 感言
通过这个项目,我深入了解了网页爬虫的基本原理与实用技巧。实践中,我不仅提升了编程能力,还对数据获取和处理有了更深的认识。这次经历让我意识到,技术的应用在于解决实际问题,而持续学习和尝试是不断前进的动力。希望未来能够在数据分析和人工智能领域做出更多探索与贡献。