标签:#Python爬虫 #批量爬取 #爬虫数据存储 #CSV文件存储 #爬虫项目实战
前言
前两篇我们彻底掌握了爬虫两大核心技能:
✅ requests:模拟浏览器发送请求,获取网页源码
✅ BeautifulSoup:精准解析网页,提取标题、文本、链接、图片数据
但目前我们只能爬取单页数据,且数据仅打印在控制台,无法留存、复用。
真正的爬虫项目,核心需求是:自动分页批量爬取 + 数据持久化存储。
本篇作为爬虫落地核心教程,手把手教你实现全自动多页爬取、数据去重、异常容错、TXT/CSV双格式保存,从零完成一个完整可落地的静态爬虫项目,彻底告别控制台临时数据!
一、爬虫项目完整流程(标准开发流程)
正式写代码前,先理清企业级爬虫标准流程,后续所有静态爬虫都遵循这套逻辑:
1. 分析网页:确认分页规则、数据标签位置、请求方式
2. 构造URL列表:批量生成多页请求地址
3. 循环发送请求:遍历分页链接,批量请求网页
4. 解析筛选数据:bs4精准提取有效字段,过滤脏数据
5. 数据清洗去重:去除空数据、重复数据、无效内容
6. 本地持久化保存:写入TXT/CSV文件,永久留存数据
7. 异常容错:超时重试、异常捕获,保证爬虫稳定运行
二、核心前置:网页分页规则分析
批量爬取的核心是找到分页URL规律,90%的静态网站分页都为简易数字递增规则。
通用分页特征
第1页:url?page=1
第2页:url?page=2
第3页:url?page=3
只需通过循环批量生成page参数,即可实现全自动分页爬取。
本次实战案例:批量爬取新闻标题、链接、简介,并完整保存到本地。
三、基础版:单页爬取+TXT文本保存
先实现基础落地功能,将爬取的结构化数据保存到TXT文件,代码简洁易懂,新手优先掌握。
核心知识点:结合with上下文读写文件、数据拼接、换行存储、异常捕获
import requestsfrom bs4 import BeautifulSoup# 伪装请求头headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}# 爬取目标地址url = "https://www.baidu.com"def crawl_single_page():try:# 发送请求res = requests.get(url, headers=headers, timeout=5)res.encoding = res.apparent_encoding# 解析网页soup = BeautifulSoup(res.text, "lxml")# 提取标题和有效链接data_list = []a_list = soup.find_all("a")for a in a_list:title = a.get_text().strip()link = a.get("href")# 过滤无效数据if title and link and link.startswith("http"):data_list.append(f"标题:{title} 链接:{link}")# 优化:循环外统一写入文件,避免多次打开文件with open("爬虫数据.txt", "a", encoding="utf-8") as f:for data in data_list:f.write(data + "\n")print("✅ 单页数据爬取并保存成功!")except Exception as e:print("❌ 爬取失败:", e)# 执行爬取crawl_single_page()
关键参数说明
文件模式a:追加写入,多次运行不会覆盖历史数据
encoding=utf-8:彻底解决中文乱码问题
\n:数据换行存储,文件排版整洁易读
四、进阶版:全自动多页批量爬取
基于分页规则,通过for循环批量生成页面URL,实现无需手动改代码,自动爬取多页数据。
我们模拟通用分页场景,实现1-5页全自动批量爬取。
import requestsfrom bs4 import BeautifulSoupimport timeheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}def crawl_many_pages(start, end):# 循环遍历所有分页for page in range(start, end + 1):print(f"\n===== 正在爬取第{page}页 =====")# 构造分页URL(通用分页规则)params = {"wd": "Python爬虫", "pn": (page - 1) * 10}url = "https://www.baidu.com/s"try:# 带参请求res = requests.get(url, headers=headers, params=params, timeout=5)res.encoding = res.apparent_encodingsoup = BeautifulSoup(res.text, "lxml")# 解析数据data_list = []a_list = soup.find_all("a")for a in a_list:title = a.get_text().strip()link = a.get("href")if title and link and link.startswith("http"):data_list.append(f"第{page}页 | 标题:{title} 链接:{link}")# 保存数据with open("多页爬虫数据.txt", "a", encoding="utf-8") as f:for data in data_list:f.write(data + "\n")print(f"✅ 第{page}页爬取完成,共{len(data_list)}条数据")# 延时休眠,防止请求过快被封IPtime.sleep(1)except Exception as e:print(f"❌ 第{page}页爬取失败:", e)# 爬取1-5页数据crawl_many_pages(1, 5)
核心优化点
✅ 自动构造分页参数,无需手动修改URL
✅ time.sleep(1) 延时请求,模拟人工浏览,防反爬拦截
✅ 分页标记数据,清晰区分每条数据来源页面
✅ 单页异常不影响整体爬虫,容错性极强
五、专业版:CSV结构化数据保存(推荐生产使用)
TXT文件仅适合简单存储,数据无法分类、筛选、统计。
CSV格式是爬虫标准存储格式,可直接用Excel打开,自带表头、结构化分类,适合数据分析、数据归档、项目交付。
实战功能:表头创建、数据逐行写入、自动去重、不乱码
import requestsfrom bs4 import BeautifulSoupimport csvimport timeheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}# 定义CSV表头headers_csv = ["页码", "文章标题", "跳转链接"]def crawl_to_csv(start, end):# 首次运行创建文件并写入表头with open("爬虫结构化数据.csv", "w", newline="", encoding="utf-8-sig") as f:writer = csv.writer(f)writer.writerow(headers_csv)# 批量分页爬取for page in range(start, end + 1):print(f"\n===== 正在爬取第{page}页 =====")params = {"wd": "Python爬虫", "pn": (page - 1) * 10}url = "https://www.baidu.com/s"try:res = requests.get(url, headers=headers, params=params, timeout=5)res.encoding = res.apparent_encodingsoup = BeautifulSoup(res.text, "lxml")a_list = soup.find_all("a")# 追加写入数据with open("爬虫结构化数据.csv", "a", newline="", encoding="utf-8-sig") as f:writer = csv.writer(f)count = 0for a in a_list:title = a.get_text().strip()link = a.get("href")if title and link and link.startswith("http"):writer.writerow([page, title, link])count += 1print(f"✅ 第{page}页完成,新增{count}条结构化数据")time.sleep(1)except Exception as e:print(f"❌ 第{page}页异常:", e)# 执行批量爬取保存crawl_to_csv(1, 3)
CSV核心优势
✅ utf-8-sig 编码,彻底解决Excel打开中文乱码
✅ newline="" 去除空白空行,文件排版整洁
✅ 结构化分类存储,字段清晰,支持后续筛选、统计、分析
六、高阶优化:数据自动去重
批量爬取极易出现重复数据,新增集合去重机制,自动过滤重复链接/标题,保证数据唯一性。
# 定义空集合存储已存在链接exist_links = set()# 循环解析时增加去重判断for a in a_list:title = a.get_text().strip()link = a.get("href")# 过滤无效数据 + 去重判断if title and link and link.startswith("http") and link not in exist_links:writer.writerow([page, title, link])exist_links.add(link) # 存入集合,后续自动去重
七、完整工业级稳定爬虫(最终版)
整合分页爬取、数据清洗、自动去重、延时防封、异常容错、CSV结构化存储,可直接用于日常项目。
import requestsfrom bs4 import BeautifulSoupimport csvimport time# 全局配置HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}# 去重容器EXIST_LINKS = set()# 数据表头CSV_HEADERS = ["页码", "文章标题", "跳转链接"]def create_csv_file():"""初始化CSV文件,写入表头"""with open("最终爬虫数据.csv", "w", newline="", encoding="utf-8-sig") as f:csv.writer(f).writerow(CSV_HEADERS)def crawl_page(page):"""单页爬取解析函数"""params = {"wd": "Python爬虫", "pn": (page - 1) * 10}url = "https://www.baidu.com/s"try:res = requests.get(url, headers=HEADERS, params=params, timeout=5)res.encoding = res.apparent_encodingsoup = BeautifulSoup(res.text, "lxml")return soup.find_all("a")except Exception as e:print(f"❌ 第{page}页请求失败:{e}")return []def save_data(page, data_list):"""数据清洗与保存"""count = 0with open("最终爬虫数据.csv", "a", newline="", encoding="utf-8-sig") as f:writer = csv.writer(f)for a in data_list:title = a.get_text().strip()link = a.get("href")# 多重数据过滤 + 去重if title and link and link.startswith("http") and link not in EXIST_LINKS:writer.writerow([page, title, link])EXIST_LINKS.add(link)count += 1print(f"✅ 第{page}页完成,有效新增数据{count}条")def main(start_page, end_page):"""主爬虫入口"""create_csv_file()print("🚀 爬虫启动成功,开始批量爬取...")for page in range(start_page, end_page + 1):print(f"\n---------- 正在爬取第{page}页 ----------")data = crawl_page(page)save_data(page, data)time.sleep(1.2) # 匀速延时,降低反爬概率print("\n🎉 全部页面爬取完成!数据已永久保存至本地")# 启动爬虫:爬取1-5页数据if __name__ == "__main__":main(1, 5)
八、新手高频踩坑&优化技巧
1、中文乱码问题
CSV文件必须使用 utf-8-sig 编码,不要用utf-8,杜绝Excel打开乱码。
2、文件重复覆盖
首次写入表头用w模式,后续追加数据统一用a模式,避免数据清空。
3、请求过快被封IP
批量爬取必须加 time.sleep() 延时,间隔1-2秒最为稳定。
4、数据重复冗余
固定使用集合去重,高效过滤重复数据,无需手动筛选。
5、无异常容错
单页报错单独捕获,不会终止整个爬虫任务,保证批量任务稳定执行。
文末结语
到本篇为止,你已经掌握了爬虫完整落地流程:请求、解析、筛选、批量爬取、数据清洗、本地存储。
从单页临时数据,到多页全自动结构化存储,完全摆脱新手入门玩具代码,具备基础项目实战能力。
本篇最终版代码是静态爬虫的通用模板,适配90%静态新闻、资讯、列表类网站,可直接复制修改复用,建议收藏吃透!