华为eNSP ACL配置避坑指南:从‘全网通’到‘精准控制’,我踩过的那些坑
2026/6/15 7:16:52
在数据采集与分析的工作场景中,Python 爬虫是获取网络公开数据的核心技术手段,而将爬取到的数据规范化存储则是后续数据处理的基础环节。CSV(逗号分隔值)格式作为一种轻量级、跨平台的表格文件格式,因其结构简单、易读取、兼容性强的特点,成为爬虫数据存储的首选方式之一。本文将从实战角度出发,系统讲解如何通过 Python 实现网页数据爬取,并将结构化数据精准存入 CSV 表格,同时兼顾代码的规范性、可读性与可扩展性,帮助开发者掌握爬虫数据持久化的核心方法。
本文以「豆瓣电影 Top250」(https://movie.douban.com/top250)为爬取目标,详细阐述 Python 爬虫从请求发送、数据解析到 CSV 数据写入的全流程实现。内容涵盖 requests 库发起 HTTP 请求、BeautifulSoup 库解析 HTML 页面、csv 模块处理表格数据存储等核心技术点,同时针对编码问题、数据结构化、异常处理等关键环节给出解决方案,最终实现爬取电影名称、评分、简介等信息并写入 CSV 文件的完整实战案例。
实现本次爬虫实战需依赖以下 Python 库,各库的核心作用如下表所示:
| 库名称 | 核心作用 | 安装命令 |
|---|---|---|
| requests | 发送 HTTP/HTTPS 请求,获取网页源代码 | pip install requests |
| beautifulsoup4 | 解析 HTML/XML 页面,提取结构化数据 | pip install beautifulsoup4 |
| csv | Python 内置库,处理 CSV 文件的读写操作 | 无需安装,内置 |
| fake-useragent | 生成随机 User-Agent,规避基础反爬机制 | pip install fake-useragent |
本次实战的爬虫流程遵循「请求 - 解析 - 存储」的经典逻辑:
在爬取公开数据前,需遵守以下合规原则:
python
运行
import requests from bs4 import BeautifulSoup import csv import time from fake_useragent import UserAgent # 配置项 TARGET_URL = "https://movie.douban.com/top250" CSV_FILE_PATH = "douban_top250.csv" HEADERS = { "User-Agent": UserAgent().random, "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive" } # 重试次数 RETRY_TIMES = 3 def get_page_html(url): """ 获取指定URL的网页HTML源代码 :param url: 目标网页URL :return: 网页HTML文本(失败返回None) """ for i in range(RETRY_TIMES): try: response = requests.get(url, headers=HEADERS, timeout=10) # 校验响应状态码 response.raise_for_status() # 设置正确的编码 response.encoding = response.apparent_encoding return response.text except requests.exceptions.RequestException as e: print(f"第{i+1}次请求失败,错误信息:{e}") time.sleep(2) # 重试前休眠2秒 return None def parse_movie_data(html): """ 解析HTML页面,提取电影数据 :param html: 网页HTML文本 :return: 电影数据列表(每个元素为字典) """ movie_list = [] soup = BeautifulSoup(html, "html.parser") # 定位电影列表容器 movie_items = soup.find_all("div", class_="item") for item in movie_items: # 提取排名 rank = item.find("em").text # 提取电影名称 title = item.find("span", class_="title").text # 提取评分 score = item.find("span", class_="rating_num").text # 提取评价人数 comment_num = item.find("div", class_="star").find_all("span")[-1].text.replace("人评价", "") # 提取简介(部分电影无简介,做容错处理) quote_tag = item.find("span", class_="inq") quote = quote_tag.text if quote_tag else "无简介" # 构造电影数据字典 movie_info = { "排名": rank, "电影名称": title, "评分": score, "评价人数": comment_num, "简介": quote } movie_list.append(movie_info) return movie_list def write_to_csv(data, file_path): """ 将电影数据写入CSV文件 :param data: 电影数据列表 :param file_path: CSV文件保存路径 """ # 定义CSV表头 headers = ["排名", "电影名称", "评分", "评价人数", "简介"] # 打开文件,设置newline避免空行,encoding设置为utf-8-sig解决中文乱码 with open(file_path, "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=headers) # 写入表头 writer.writeheader() # 写入数据行 writer.writerows(data) print(f"数据已成功写入CSV文件:{file_path}") def crawl_douban_top250(): """ 爬取豆瓣电影Top250并写入CSV """ all_movie_data = [] page = 0 while True: # 构造分页URL(豆瓣Top250每页25条,偏移量为page*25) page_url = f"{TARGET_URL}?start={page*25}&filter=" print(f"正在爬取第{page+1}页:{page_url}") # 获取页面HTML html = get_page_html(page_url) if not html: print(f"第{page+1}页爬取失败,终止爬取") break # 解析电影数据 movie_data = parse_movie_data(html) if not movie_data: print("已爬取完所有数据,终止爬取") break # 合并数据 all_movie_data.extend(movie_data) # 休眠1秒,降低请求频率 time.sleep(1) page += 1 # 将所有数据写入CSV if all_movie_data: write_to_csv(all_movie_data, CSV_FILE_PATH) else: print("未爬取到任何数据") if __name__ == "__main__": # 执行主爬取函数 crawl_douban_top250()fake-useragent生成随机 User-Agent,避免被服务器识别为爬虫;response.apparent_encoding),避免乱码。html.parser解析器解析 HTML 文本;find_all定位所有电影条目(div.item);csv.DictWriter按字典键值对写入数据,无需手动拼接逗号;newline=""避免 CSV 文件出现空行;utf-8-sig,解决 Windows 系统下 CSV 中文乱码问题;start,每页 25 条);plaintext
正在爬取第1页:https://movie.douban.com/top250?start=0&filter= 正在爬取第2页:https://movie.douban.com/top250?start=25&filter= 正在爬取第3页:https://movie.douban.com/top250?start=50&filter= ... 正在爬取第10页:https://movie.douban.com/top250?start=225&filter= 数据已成功写入CSV文件:douban_top250.csv| 排名 | 电影名称 | 评分 | 评价人数 | 简介 |
|---|---|---|---|---|
| 1 | 肖申克的救赎 | 9.7 | 2651197 | 希望让人自由 |
| 2 | 霸王别姬 | 9.6 | 1923302 | 风华绝代 |
| 3 | 阿甘正传 | 9.5 | 1852050 | 一部美国近现代史 |
| ... | ... | ... | ... | ... |
| 250 | 摩登时代 | 9.3 | 655690 | 永不落幕的经典 |
utf-8-sig(而非utf-8),utf-8-sig会添加 BOM 头,让 Windows 记事本、Excel 等工具正确识别编码。time.sleep(1)改为time.sleep(2));本文通过豆瓣电影 Top250 爬取案例,完整实现了「请求 - 解析 - 存储」的爬虫闭环,核心要点包括:
utf-8-sig是解决中文乱码的通用方案。通过本次实战,开发者可掌握爬虫数据存入 CSV 的核心方法,后续可基于此框架适配不同目标网站的爬取需求,实现更复杂的数据分析场景。