当前位置:首页>python>Python爬虫零基础实战③:静态网页批量分页爬取+数据保存,TXT/CSV本地落地存储,完整项目实战

Python爬虫零基础实战③:静态网页批量分页爬取+数据保存,TXT/CSV本地落地存储,完整项目实战

  • 2026-10-11 05:42:15
Python爬虫零基础实战③:静态网页批量分页爬取+数据保存,TXT/CSV本地落地存储,完整项目实战

标签:#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_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"第{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)}条数据")            # 延时休眠,防止请求过快被封IP            time.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_encoding            soup = 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 = 0                for 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 += 1            print(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_encoding        soup = 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 = 0    with 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 += 1    print(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%静态新闻、资讯、列表类网站,可直接复制修改复用,建议收藏吃透!

最新文章

随机文章