前言在互联网数据体量持续增长的当下网页数据采集已成为数据分析、市场调研、内容聚合等领域的基础技术手段。静态网页作为互联网最基础的页面形态具备代码结构固定、渲染逻辑简单、访问门槛低等特点是学习网络爬虫技术的首选场景。静态网页指页面内容由服务端直接生成 HTML 代码并返回至客户端页面展示内容不会随用户操作、前端脚本动态变更浏览器接收到完整 HTML 源码后即可直接完成页面渲染这也让数据提取工作无需处理异步加载、动态渲染等复杂问题。本文围绕 Python 实现静态网页数据提取展开全面讲解从环境准备、基础网络请求、网页源码解读到数据初步筛选、异常处理、基础实战案例逐层推进搭建完整的静态爬虫知识体系。为方便读者快速获取所需工具与官方文档本文涉及的核心库官方地址如下 Python 官方下载地址、requests 库官方文档、pip 官方使用文档、HTTP 状态码标准参考文档。对于零基础学习者而言掌握静态网页爬虫不仅能够理解网络请求的底层逻辑更能为后续学习动态网页爬取、分布式爬虫、反爬应对等高阶内容筑牢根基。全文结合理论解析、代码实操、原理讲解与问题总结兼顾理论深度与工程实用性读者跟随内容逐步实操即可独立完成常规静态网页的内容抓取工作。一、爬虫基础认知与静态网页原理1.1 网络爬虫的定义与应用场景网络爬虫又被称作网络蜘蛛、网络机器人是一种按照既定规则自动抓取互联网网页数据的程序。其核心工作逻辑为模拟客户端向目标服务器发送网络请求接收服务器返回的页面数据再按照需求对数据进行解析、提取、存储等一系列操作。从应用领域划分爬虫技术目前已广泛落地于多个行业。在电商行业爬虫可抓取商品价格、销量、评价数据用于竞品分析与价格监控在资讯行业可批量采集新闻、文章内容完成内容聚合平台的数据更新在科研领域能够大规模抓取公开文献、行业报告支撑数据统计与学术研究在运营领域可采集社交平台、论坛的公开舆情信息实现舆情监测。需要明确的是爬虫技术的使用必须严格遵守《网络安全法》《著作权法》以及目标网站的robots.txt协议禁止未经授权抓取涉密数据、用户隐私数据、付费版权内容同时需控制请求频率避免对目标服务器造成过载压力做到合法合规使用技术。1.2 静态网页与动态网页核心区分开展爬虫学习前必须清晰区分静态网页与动态网页二者的数据加载逻辑不同对应的爬取方案也存在本质差异下表为两类网页的核心特征对比表格对比维度静态网页动态网页数据加载方式服务端拼接完整 HTML 代码一次性返回全部内容初始仅返回框架代码通过 JavaScript 异步请求接口加载数据页面后缀常见.html、.htm常见.php、.jsp、.asp也存在伪静态.html源码特征网页可见内容全部包含在 HTML 源码中可见内容不存在于初始 HTML 源码需抓接口获取爬取难度低直接解析源码即可提取数据高需分析接口、处理 JS 渲染、签名校验等典型站点企业官网、静态文档站、老式资讯页面主流电商平台、短视频平台、交互式论坛静态网页的核心优势在于数据与 HTML 源码绑定当客户端发起访问请求后Web 服务器会直接将编写完成的 HTML 文件发送给浏览器页面上所有文字、图片地址、链接等信息均完整存在于响应源码内。爬虫程序只需获取到完整源码就能通过字符串匹配、标签筛选等方式提取目标数据这也是静态爬虫入门的核心切入点。1.3 静态爬虫完整工作流程一套标准的静态网页爬虫整体分为六大核心环节各环节环环相扣缺一不可具体流程如下目标分析确定需要爬取的网站、页面地址、目标数据查看页面结构判断是否为纯静态网页同时查阅网站robots.txt协议确认爬取权限。环境准备安装 Python 解释器、第三方请求库配置运行环境保证代码可以正常执行网络请求。发送网络请求模拟浏览器向目标 URL 发送 HTTP 请求携带请求头、请求参数等信息获取服务器返回的响应数据。响应校验判断请求是否成功通过 HTTP 状态码、响应内容长度等信息排查访问失败、页面跳转、封禁 IP 等问题。数据提取对返回的 HTML 源码进行解析根据 HTML 标签、属性、文本内容筛选出所需数据。数据存储与收尾将提取到的文本、链接、地址等数据保存至文件、数据库同时添加异常捕获、请求延时优化爬虫稳定性。整个流程逻辑简单清晰入门阶段的核心学习重点集中在网络请求发送与基础数据提取两大模块。二、运行环境搭建与依赖库安装2.1 Python 环境配置Python 是目前爬虫领域使用最广泛的编程语言其语法简洁、第三方库生态完善极大降低了爬虫开发的门槛。首先需要完成 Python 解释器的安装推荐使用 3.8 及以上版本高版本 Python 对网络请求库、解析库的兼容性更佳。安装步骤简述进入前文提供的 Python 官方下载地址根据自身操作系统Windows、macOS、Linux选择对应安装包Windows 系统安装时建议勾选 “Add Python to PATH” 自动配置环境变量安装完成后打开系统命令行工具CMD、PowerShell、终端输入以下命令验证安装是否成功bash运行python --version若命令行输出对应的 Python 版本号则代表环境配置完成。2.2 核心依赖库介绍与安装原生 Python 内置了urllib模块用于网络请求但该模块语法繁琐、功能单一在实际项目中极少使用。行业内主流使用requests 库实现 HTTP 请求该库封装了复杂的网络请求逻辑语法人性化支持 GET、POST 等多种请求方式同时兼容请求头、代理、超时设置等常用功能。2.2.1 pip 包管理工具pip是 Python 官方的第三方库管理工具Python3.4 及以上版本默认自带pip无需额外安装。在命令行输入以下命令验证pip可用性bash运行pip --version若输出版本信息即可正常使用若提示命令不存在可手动配置环境变量或使用python -m pip替代pip指令。2.2.2 requests 库安装在命令行中执行以下安装命令完成 requests 库的在线安装bash运行pip install requests网络不佳的用户可以使用国内镜像源加速安装以清华镜像源为例命令如下bash运行pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可进入 Python 交互环境执行import requests若无报错则说明库安装成功。2.3 辅助工具介绍2.3.1 浏览器开发者工具主流浏览器Chrome、Edge、Firefox均内置开发者工具是爬虫开发的核心辅助工具主要作用为查看网页 HTML 源码、定位数据对应的 HTML 标签、查看网络请求信息、分析请求头与响应内容。 调用方式打开目标网页后按下F12快捷键或右键页面选择 “检查”即可调出工具面板。其中Elements面板用于查看完整 HTML 结构Network面板用于监控所有网络请求。2.3.2 文本编辑器 / IDE代码编写工具推荐使用 VS Code、PyCharm两类工具均提供语法高亮、代码提示、断点调试等功能适合 Python 代码开发。入门阶段也可使用系统自带记事本编写简单代码但不建议长期使用。三、HTTP 协议与网络请求基础3.1 HTTP 协议核心概念爬虫本质是基于HTTP/HTTPS 协议的客户端程序。HTTP 即超文本传输协议是互联网应用最广泛的应用层协议规定了客户端与服务端之间数据传输的格式与规则。HTTPS 是 HTTP 的加密版本基于 SSL/TLS 协议对传输数据进行加密目前绝大多数正规网站均使用 HTTPS 协议。一次完整的 HTTP 交互分为两部分客户端请求与服务端响应。客户端爬虫 / 浏览器按照协议规则发送请求报文服务端接收到请求后处理业务逻辑并返回响应报文整个交互过程基于 “请求 - 响应” 模型完成。3.2 常见 HTTP 请求方式HTTP 协议定义了多种请求方法静态网页爬取中最常用的为GET 请求其次为 POST 请求其余请求方法在入门阶段极少使用两种核心请求方式的区别如下表格请求方式适用场景参数传递形式静态爬虫使用频率GET单纯获取页面数据、查询内容参数拼接在 URL 地址后方公开可见极高静态网页主流POST提交表单、上传数据、登录验证参数放置在请求体中相对隐蔽较低静态页面基本不用GET 请求是静态网页爬取的核心当我们在浏览器地址栏输入网址访问页面、点击普通链接跳转页面时浏览器发送的都是 GET 请求。3.3 HTTP 请求头与核心参数请求头Request Headers是请求报文的重要组成部分用于向服务端传递客户端的基础信息包括浏览器类型、操作系统、语言、Cookie 等。很多网站会校验请求头信息若爬虫程序不携带合法请求头会被服务器识别为非法程序直接拒绝访问返回 403 禁止访问错误。请求头中User-Agent是最关键的参数该字段用于标识客户端身份浏览器、爬虫程序、移动端设备都会携带专属的 User-Agent 信息。爬虫入门阶段必须模拟浏览器的 User-Agent伪装成正常客户端发起请求。获取浏览器 User-Agent 的方法打开浏览器开发者工具切换至 Network 面板刷新页面点击第一条请求记录在 Request Headers 列表中找到User-Agent字段复制其对应值即可。3.4 HTTP 响应状态码服务端返回的响应报文中会包含状态码用于标识本次请求的执行结果状态码分为五大类别静态爬虫中高频出现的状态码及含义如下2xx 成功类200 OK请求成功服务器正常返回页面数据是爬虫最希望得到的响应结果。3xx 重定向类301 永久重定向、302 临时重定向页面地址发生跳转爬虫会自动跟随跳转获取新页面内容。4xx 客户端错误404 Not Found页面不存在、403 Forbidden禁止访问多为反爬拦截、400 Bad Request请求格式错误。5xx 服务端错误500 服务器内部错误、502 网关错误代表目标网站服务器出现故障非爬虫代码问题。在代码中判断状态码是排查爬虫访问异常的首要步骤。四、requests 库实现基础网络请求4.1 发送简单 GET 请求使用 requests 库发送 GET 请求是静态爬虫的第一步本节从最简代码开始逐步叠加功能讲解每一段代码的作用与底层原理。4.1.1 基础 GET 请求代码示例python运行# 导入第三方请求库 import requests # 定义目标网页URL url https://www.example.com # 发送GET请求获取响应对象 response requests.get(url) # 打印HTTP状态码 print(请求状态码, response.status_code) # 打印网页原始源码字节流格式 print(字节流源码, response.content) # 打印解码后的网页文本字符串格式 print(网页文本源码, response.text)4.1.2 代码逐行原理解析import requests导入已安装的 requests 第三方库只有导入库后程序才能调用库中封装的网络请求相关方法这是 Python 调用外部库的标准语法。url https://www.example.com定义字符串变量存储目标网页的统一资源定位符也就是网页地址。URL 是客户端定位互联网资源的唯一标识爬虫必须依靠 URL 确定访问目标。response requests.get(url)调用 requests 库的get()方法向指定 URL 发送 GET 请求该方法会自动完成网络连接、报文封装、数据接收等操作最终返回一个Response 响应对象。这个对象并非单纯的字符串而是封装了状态码、源码、请求头、响应头、编码格式等一系列数据的复合对象。response.status_code读取响应对象的status_code属性获取本次请求的 HTTP 状态码用于判断请求是否成功。response.content该属性返回bytes 字节流数据是服务器原始返回的数据未经过字符编码转换。网页、图片、文件等所有网络资源在网络传输中均以字节流形式传递这是网络传输的底层格式。字节流适合下载图片、视频、附件等非文本类资源。response.text该属性返回字符串文本数据requests 库会自动根据网页默认编码将字节流解码为人类可阅读的字符串。解析 HTML 网页源码、提取文本数据时优先使用该属性。4.1.3 编码问题说明部分网页会出现response.text输出乱码的情况根本原因是 requests 自动识别的编码格式与网页实际编码格式不匹配。中文网页常用编码为utf-8与gbk出现乱码时需要手动指定编码格式优化代码如下python运行import requests url https://www.example.com response requests.get(url) # 手动设置编码格式解决中文乱码 response.encoding utf-8 html response.text print(html)原理补充网络传输的字节流没有字符概念不同编码规则会将字节解析为不同文字。response.encoding属性用于强制指定解码规则匹配网页真实编码后即可消除乱码。4.2 携带请求头的 GET 请求伪装浏览器绝大多数网站会拦截无 User-Agent 的请求上一节的基础代码在爬取常规网站时大概率会触发 403 禁止访问错误。解决方案就是自定义请求头模拟真实浏览器。4.2.1 携带请求头代码示例python运行import requests # 目标URL url https://www.example.com # 自定义请求头字典 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 } # 发送GET请求传入请求头参数 response requests.get(url, headersheaders) # 校验请求结果 if response.status_code 200: response.encoding utf-8 print(网页源码获取成功) print(response.text) else: print(f请求失败状态码{response.status_code})4.2.2 代码原理解析headers {}请求头以 Python 字典格式定义字典的键对应请求头字段名值对应字段内容。字典是 Python 中存储键值对数据的标准结构与 HTTP 请求头的键值对格式完全契合因此 requests 库采用字典接收请求头参数。headers中的User-Agent字段复制自真实浏览器的请求头信息作用是向服务器声明 “当前客户端为 Chrome 浏览器”绕过基础的客户端校验规则。除 User-Agent 外还可根据网站要求添加Referer、Accept等字段进一步完善伪装效果。requests.get(url, headersheaders)get()方法支持多个可选参数headers为其中之一作用是将自定义请求头附加到请求报文中一并发送至服务器。状态码判断逻辑增加分支判断仅当状态码为 200请求成功时才解析并输出网页源码否则打印错误状态码。该逻辑是工程化代码的基础能够有效区分正常请求与异常请求提升代码健壮性。4.3 增加超时参数防止程序卡死网络环境存在不确定性可能出现目标服务器无响应、网络中断等问题。若不设置超时时间requests.get()方法会一直阻塞等待响应导致爬虫程序卡死。因此在正式代码中必须添加timeout超时参数。4.3.1 超时设置代码示例python运行import requests url https://www.example.com 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 } try: # timeout单位为秒超过设定时间未响应则抛出异常 response requests.get(url, headersheaders, timeout10) response.encoding utf-8 print(源码长度, len(response.text)) except requests.exceptions.Timeout: print(请求超时服务器无响应) except Exception as e: print(f请求出现未知异常{e})4.3.2 原理解析timeout10设置请求超时时间为 10 秒含义是从客户端发起请求开始计时若 10 秒内未接收到服务器完整响应requests 库会主动终止请求并抛出Timeout超时异常。行业内静态爬虫超时时间通常设置为 5~15 秒。try...except异常捕获结构Python 标准的异常处理语法将可能出现错误的网络请求代码放入try代码块中。当代码抛出指定异常时执行对应except代码块的逻辑程序不会直接崩溃而是输出错误提示并继续运行。细分异常类型代码中单独捕获Timeout超时异常同时设置通用异常捕获区分不同错误类型便于开发者定位问题。网络爬虫常见异常包含超时、连接失败、SSL 证书错误、网络中断等。五、HTML 网页结构详解数据提取基础成功获取网页源码后下一步就是理解 HTML 结构这是从源码中精准提取数据的核心前提。HTML 全称超文本标记语言是构建网页的标准标记语言所有静态网页的视觉内容、文本、链接都由 HTML 标签组合而成。5.1 HTML 基础标签规则HTML 由标签组成绝大多数标签为成对出现的双标签格式为标签名内容/标签名少数为单标签格式为标签名 /。标签可以互相嵌套形成层级化的树状结构这也是后续解析库定位元素的核心依据。基础语法规则标签名称不区分大小写但行业规范中统一使用小写标签。标签内部可以添加属性格式为属性名属性值属性用于对标签进行补充描述是定位元素的重要依据。整个 HTML 页面由根标签html包裹内部分为head头部区域与body主体区域页面可见内容全部位于body标签内部。5.2 静态网页高频标签介绍结合爬虫数据提取场景整理网页中出现频率最高的标签、属性及对应作用如下表所示表格标签名称标签类型主要作用爬虫提取场景title双标签定义网页标题显示在浏览器标签栏提取网页标题a双标签超链接标签实现页面跳转提取网址、链接文本p双标签段落标签包裹正文文本提取文章段落、描述文本div双标签块级容器标签用于布局分组定位数据区块批量提取内容span双标签行内容器标签包裹小段文本提取局部关键词、数字h1~h6双标签标题标签六级标题层级提取文章标题、栏目名称img单标签图片标签展示图片提取图片地址链接ul/li组合标签无序列表列表项组合提取列表类数据榜单、目录5.3 标签属性详解定位元素核心标签属性是区分同类标签的关键同一个页面中会存在大量重复的div、a标签单纯依靠标签名无法精准找到目标数据必须借助属性筛选。爬虫开发中最常用的三大属性id 属性理论上在整个 HTML 页面中唯一格式div idcontent定位精度最高优先使用。class 属性用于给标签归类多个标签可以共用同一个 class格式div classlist-item批量提取同类元素的首选属性。href 属性专属a标签存储链接地址是提取 URL 的核心属性。src 属性专属img标签存储图片地址。示例 HTML 代码片段html预览div classarticle-list div classitem h2 classtitlePython静态爬虫入门教程/h2 p classdesc本文讲解静态网页数据提取基础/p a hrefhttps://www.example.com/detail查看详情/a /div /div从这段代码可以看出标签层层嵌套class属性对不同区块进行分类href存储跳转链接完整呈现了静态网页的数据组织形式。爬虫提取数据的本质就是根据标签名、属性、层级关系在这段结构化文本中筛选目标内容。六、原生字符串方法实现简易数据提取在不使用专业 HTML 解析库的前提下可以利用 Python 内置的字符串方法对网页源码进行截取、匹配、分割实现基础的数据提取。该方式能够帮助开发者理解 “从源码中捞取数据” 的底层逻辑也是理解解析库原理的铺垫。6.1 核心字符串方法介绍Python 字符串内置大量处理方法静态数据提取常用方法如下find()查找子字符串的索引位置找到返回起始下标未找到返回 - 1。split()按照指定分隔符切割字符串返回字符串列表。strip()去除字符串首尾的空格、换行符、制表符等空白字符。字符串切片[起始下标:结束下标]根据索引截取指定范围的字符串。6.2 实战案例提取网页标题网页标题存放在title和/title标签之间使用字符串截取的方式提取标题代码及原理如下6.2.1 代码示例python运行import requests url https://www.example.com 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 } try: response requests.get(url, headersheaders, timeout10) response.encoding utf-8 html response.text # 定义前后标记字符串 start_tag title end_tag /title # 查找起始标签的索引 start_index html.find(start_tag) # 标题内容起始位置 起始标签索引 标签长度 content_start start_index len(start_tag) # 查找结束标签的索引 end_index html.find(end_tag, content_start) # 切片截取标题内容 title html[content_start:end_index] # 去除首尾空白字符 title title.strip() print(网页标题, title) except Exception as e: print(请求或解析出错, e)6.2.2 代码原理解析先通过 requests 库获取完整的网页 HTML 字符串html整个源码是一个超长的单行 / 多行字符串。确定目标数据的左右边界标记也就是包裹标题的title开始标签和/title结束标签这是字符串截取的核心思路。html.find(start_tag)从整个字符串中查找title第一次出现的位置返回该字符的下标索引。字符串在计算机中以字符数组形式存储每一个字符都有唯一的数字下标。content_start start_index len(start_tag)find()返回的是开始标签第一个字符的下标想要获取标签内部的内容需要跳过整个开始标签因此加上标签字符串的长度。html.find(end_tag, content_start)第二个参数代表查找的起始位置从标题内容开始的位置向后查找结束标签避免匹配到页面其他位置的同名结束标签。字符串切片html[content_start:end_index]截取两个下标之间的所有字符即为标题原始内容。最后使用strip()清理多余的换行、空格得到干净的标题文本。6.3 实战案例批量提取超链接网页中大量链接均由a标签包裹结合find()循环匹配与字符串分割可批量提取所有链接地址与链接文本。该案例能够体现字符串提取方式的局限性也侧面引出专业解析库的必要性。6.3.1 代码示例python运行import requests url https://www.example.com 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 } def extract_links(html_str): link_list [] # 循环查找所有a标签 a_start html_str.find(a) while a_start ! -1: # 从a位置向后查找href属性起始位置 href_start html_str.find(href, a_start) if href_start -1: break # 链接地址起始位置 url_start href_start len(href) # 查找链接结束的双引号 url_end html_str.find(, url_start) # 截取链接地址 link_url html_str[url_start:url_end] # 查找链接文本结束位置/a标签 a_end html_str.find(/a, url_end) # 截取链接文本 link_text html_str[url_end 1:a_end].strip() # 存入列表 link_list.append({链接地址: link_url, 链接文本: link_text}) # 从下一个位置继续查找下一个a标签 a_start html_str.find(a, a_end) return link_list try: res requests.get(url, headersheaders, timeout10) res.encoding utf-8 html_content res.text links extract_links(html_content) # 遍历输出结果 for item in links: print(item) except Exception as e: print(执行异常, e)6.3.2 原理与局限性分析原理逻辑延续 “标记截取” 思路通过while循环反复查找a标签逐个提取href属性内的链接地址与标签内部的文本内容将结果以字典形式存入列表实现批量提取。明显局限性容错率极低若网页 HTML 格式发生微小变化如标签内增加空格、属性顺序调换、使用单引号替代双引号代码会直接提取失败。代码冗余复杂面对多层嵌套、复杂结构的 HTML 页面需要编写大量循环与判断逻辑开发效率极低。无法精准定位不能根据class、id等属性筛选指定范围内的链接只能全局匹配所有a标签。正是由于原生字符串方法存在以上缺陷行业内才诞生了 BeautifulSoup、lxml 等专业 HTML/XML 解析库这类库会将 HTML 文本转换为树形结构基于节点、标签、属性进行智能匹配大幅降低数据提取难度。原生字符串方法仅适合理解底层逻辑正式项目中不推荐使用。七、爬虫基础优化与合规性规范7.1 请求延时设置规避访问限制高频、不间断的请求会给目标服务器造成压力同时极易触发网站反爬机制导致 IP 被临时封禁。在循环爬取多个页面的场景中必须添加请求延时模拟人类正常浏览网页的行为节奏。Python 内置time模块可实现延时功能代码示例python运行import requests import time url_list [ https://www.example.com/1, https://www.example.com/2, https://www.example.com/3 ] 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 } for url in url_list: response requests.get(url, headersheaders, timeout10) print(f已爬取{url}状态码{response.status_code}) # 延时2秒再执行下一次请求 time.sleep(2)原理说明time.sleep(n)表示程序暂停运行 n 秒单位为秒。常规静态爬虫延时设置为 1~3 秒即可访问防护严格的网站可适当延长延时时间。7.2 数据本地存储文本文件提取到的数据若仅在控制台输出无法长期保存入门阶段最简易的存储方式为写入本地txt文本文件。Python 内置文件操作语法无需额外安装库。7.2.1 追加写入文件代码示例python运行import requests url https://www.example.com 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 } try: res requests.get(url, headersheaders, timeout10) res.encoding utf-8 html res.text # 截取标题 s1 html.find(title) len(title) s2 html.find(/title, s1) title html[s1:s2].strip() # 以追加模式打开文件编码指定为utf-8避免中文乱码 with open(spider_data.txt, a, encodingutf-8) as f: f.write(f网页标题{title}\n) print(数据已保存至本地文件) except Exception as e: print(出错, e)原理说明open()函数用于打开本地文件a代表追加写入模式新数据会续写在文件末尾w为覆盖写入模式会清空原有内容。with语句可以自动关闭文件流是 Python 推荐的文件操作写法。7.3 爬虫合规性与行业准则遵守robots.txt协议几乎所有正规网站根目录下都存在robots.txt文件该文件明确标注了网站允许 / 禁止爬虫访问的目录与页面爬取前建议优先查看。禁止抓取隐私与版权数据用户手机号、身份证、个人相册等隐私数据以及付费文章、影视资源、原创图文等版权内容严禁私自抓取与传播。控制请求频率无论网站是否有反爬措施都需要设置合理延时拒绝高频轰炸式请求维护网络服务稳定。禁止恶意攻击爬虫的核心用途为数据采集不得利用爬虫技术发起 DDoS 攻击、批量注册、恶意刷量等违规行为。八、综合实战完整静态网页爬虫项目结合前文所有知识点搭建一套完整、可运行、具备异常处理、延时、数据存储的静态网页综合爬虫案例实现 “多页面遍历、数据提取、本地存储” 全流程整合网络请求、编码处理、字符串提取、异常捕获、延时、文件存储等所有基础知识点。8.1 项目需求批量爬取多个静态页面提取每个页面的标题、页面简介将所有数据统一保存至本地文本文件要求伪装浏览器请求、设置超时、异常捕获、请求延时、中文不乱码。8.2 完整项目代码python运行# 导入所需模块 import requests import time # 1. 全局配置项 # 待爬取的页面地址列表 target_urls [ https://www.example.com/page1, https://www.example.com/page2, https://www.example.com/page3 ] # 模拟浏览器请求头 request_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 } # 请求超时时间 time_out 10 # 页面请求间隔时间 sleep_time 2 # 2. 定义数据提取函数 def parse_html(html_content): 解析HTML源码提取标题与简介 :param html_content: 网页源码字符串 :return: 标题、简介 # 提取标题 title_start html_content.find(title) title_end html_content.find(/title, title_start) title html_content[title_start len(title):title_end].strip() # 提取简介假设简介位于p classintro标签内 intro_start html_content.find(p classintro) intro_end html_content.find(/p, intro_start) intro html_content[intro_start len(p classintro):intro_end].strip() return title, intro # 3. 主爬虫逻辑 def main_spider(): print( 静态网页爬虫开始运行 ) # 以追加模式打开文件统一存储数据 with open(static_spider_result.txt, a, encodingutf-8) as file: for index, url in enumerate(target_urls): print(f正在爬取第{index 1}个页面{url}) try: # 发送GET请求 response requests.get( urlurl, headersrequest_headers, timeouttime_out ) # 判断请求状态 if response.status_code ! 200: print(f页面访问失败状态码{response.status_code}) # 写入错误信息 file.write(f链接{url} 访问失败状态码{response.status_code}\n) # 延时后继续下一个页面 time.sleep(sleep_time) continue # 设置编码处理中文乱码 response.encoding utf-8 html_text response.text # 调用解析函数提取数据 page_title, page_intro parse_html(html_text) # 控制台输出结果 print(f页面标题{page_title}) print(f页面简介{page_intro}) # 数据写入本地文件 save_content f链接地址{url}\n标题{page_title}\n简介{page_intro}\n-------------------------\n file.write(save_content) except requests.exceptions.Timeout: print(f页面 {url} 请求超时) file.write(f链接{url} 请求超时\n-------------------------\n) except Exception as e: print(f页面 {url} 出现未知异常{str(e)}) file.write(f链接{url} 异常信息{str(e)}\n-------------------------\n) # 每个页面爬取完成后延时 time.sleep(sleep_time) print( 所有页面爬取完成数据已保存 ) # 程序入口 if __name__ __main__: main_spider()8.3 项目整体原理与代码分层解析全局配置区将 URL 列表、请求头、超时时间、延时时间统一定义为全局变量后期修改爬取地址、调整延时仅需修改此处代码可维护性更强是工程化编程的基础规范。数据提取函数parse_html将 HTML 解析、数据截取逻辑封装为独立函数实现代码解耦。函数接收网页源码参数返回提取后的标题与简介符合 Python 函数化编程思想。主函数main_spider作为爬虫核心执行入口采用for循环遍历所有目标 URL实现多页面批量爬取。多层异常处理单独捕获超时异常同时设置通用异常捕获区分不同故障类型保证单个页面出错不会导致整个爬虫程序终止。文件存储逻辑全程使用with语句操作文件所有页面的数据统一写入同一个文本文件格式规整便于后续查阅。请求延时逻辑每完成一个页面的请求与解析执行time.sleep()延时模拟正常浏览行为降低被反爬拦截的概率。8.4 项目拓展方向本案例为纯静态网页入门爬虫基于现有代码可进行多维度拓展也是后续进阶学习的方向适配分页爬取分析网站分页 URL 规则自动拼接分页地址实现全站分页数据爬取。替换解析方式使用 BeautifulSoup、XPath 等专业解析方式替代原生字符串截取提升代码稳定性。更换存储介质将文本文件存储替换为 CSV、Excel、轻量级数据库适配大批量数据存储场景。添加代理 IP针对 IP 封禁严重的网站增加代理池功能切换不同 IP 发起请求。九、常见问题排查与总结9.1 入门阶段高频问题及解决方案结合静态爬虫入门学习过程中学习者遇到的典型问题整理故障现象、原因与对应解决办法如下表表格故障现象产生原因解决方案运行代码提示ModuleNotFoundError: No module named requests未安装 requests 库或多 Python 版本环境冲突执行pip install requests重新安装确认使用对应版本 pip网页输出内容中文乱码自动编码识别错误手动设置response.encoding utf-8或gbk请求返回 403 Forbidden服务器识别为爬虫拒绝访问补充完整 User-Agent 请求头模拟浏览器程序长时间无响应、卡死网络无响应未设置超时添加timeout参数设置请求超时时间部分标签内容提取为空字符串截取的标记不匹配核对 HTML 源码修正截取的前后标签、属性9.2 全文知识总结本文作为 Python 静态网页数据提取的入门内容完整覆盖了从环境搭建、网络原理、请求实现、HTML 解读、数据提取到项目实战的全流程知识核心知识点梳理如下明确静态网页核心特征页面所有可见内容均包含在初始 HTML 源码中无需处理动态加载逻辑是爬虫入门的最优场景。掌握 requests 库核心用法GET 请求发送、请求头伪装、超时设置、异常捕获这是 Python 爬虫网络请求的通用基础。理解 HTML 树形结构与标签、属性规则能够借助浏览器开发者工具定位目标数据所在的标签位置。掌握 Python 字符串截取的底层提取逻辑理解专业解析库的设计初衷与优势。具备基础工程化思维代码分层、函数封装、请求延时、数据持久化、异常处理保证爬虫程序稳定运行。树立合规爬虫意识遵守网络相关法规与网站规则做到合法使用爬虫技术。静态网页爬虫是整个 Python 爬虫体系的基石本文所讲解的网络请求、异常处理、文件存储、代码规范等内容同样适用于后续动态网页爬取、接口爬取、分布式爬虫等高阶场景。完成本文学习与案例实操后读者已具备独立开发简易静态爬虫的能力后续可继续学习专业 HTML 解析库、正则表达式、反爬应对、数据库存储等进阶内容逐步构建完整的爬虫技术栈。
Python 爬虫项目:静态网页数据提取入门
前言在互联网数据体量持续增长的当下网页数据采集已成为数据分析、市场调研、内容聚合等领域的基础技术手段。静态网页作为互联网最基础的页面形态具备代码结构固定、渲染逻辑简单、访问门槛低等特点是学习网络爬虫技术的首选场景。静态网页指页面内容由服务端直接生成 HTML 代码并返回至客户端页面展示内容不会随用户操作、前端脚本动态变更浏览器接收到完整 HTML 源码后即可直接完成页面渲染这也让数据提取工作无需处理异步加载、动态渲染等复杂问题。本文围绕 Python 实现静态网页数据提取展开全面讲解从环境准备、基础网络请求、网页源码解读到数据初步筛选、异常处理、基础实战案例逐层推进搭建完整的静态爬虫知识体系。为方便读者快速获取所需工具与官方文档本文涉及的核心库官方地址如下 Python 官方下载地址、requests 库官方文档、pip 官方使用文档、HTTP 状态码标准参考文档。对于零基础学习者而言掌握静态网页爬虫不仅能够理解网络请求的底层逻辑更能为后续学习动态网页爬取、分布式爬虫、反爬应对等高阶内容筑牢根基。全文结合理论解析、代码实操、原理讲解与问题总结兼顾理论深度与工程实用性读者跟随内容逐步实操即可独立完成常规静态网页的内容抓取工作。一、爬虫基础认知与静态网页原理1.1 网络爬虫的定义与应用场景网络爬虫又被称作网络蜘蛛、网络机器人是一种按照既定规则自动抓取互联网网页数据的程序。其核心工作逻辑为模拟客户端向目标服务器发送网络请求接收服务器返回的页面数据再按照需求对数据进行解析、提取、存储等一系列操作。从应用领域划分爬虫技术目前已广泛落地于多个行业。在电商行业爬虫可抓取商品价格、销量、评价数据用于竞品分析与价格监控在资讯行业可批量采集新闻、文章内容完成内容聚合平台的数据更新在科研领域能够大规模抓取公开文献、行业报告支撑数据统计与学术研究在运营领域可采集社交平台、论坛的公开舆情信息实现舆情监测。需要明确的是爬虫技术的使用必须严格遵守《网络安全法》《著作权法》以及目标网站的robots.txt协议禁止未经授权抓取涉密数据、用户隐私数据、付费版权内容同时需控制请求频率避免对目标服务器造成过载压力做到合法合规使用技术。1.2 静态网页与动态网页核心区分开展爬虫学习前必须清晰区分静态网页与动态网页二者的数据加载逻辑不同对应的爬取方案也存在本质差异下表为两类网页的核心特征对比表格对比维度静态网页动态网页数据加载方式服务端拼接完整 HTML 代码一次性返回全部内容初始仅返回框架代码通过 JavaScript 异步请求接口加载数据页面后缀常见.html、.htm常见.php、.jsp、.asp也存在伪静态.html源码特征网页可见内容全部包含在 HTML 源码中可见内容不存在于初始 HTML 源码需抓接口获取爬取难度低直接解析源码即可提取数据高需分析接口、处理 JS 渲染、签名校验等典型站点企业官网、静态文档站、老式资讯页面主流电商平台、短视频平台、交互式论坛静态网页的核心优势在于数据与 HTML 源码绑定当客户端发起访问请求后Web 服务器会直接将编写完成的 HTML 文件发送给浏览器页面上所有文字、图片地址、链接等信息均完整存在于响应源码内。爬虫程序只需获取到完整源码就能通过字符串匹配、标签筛选等方式提取目标数据这也是静态爬虫入门的核心切入点。1.3 静态爬虫完整工作流程一套标准的静态网页爬虫整体分为六大核心环节各环节环环相扣缺一不可具体流程如下目标分析确定需要爬取的网站、页面地址、目标数据查看页面结构判断是否为纯静态网页同时查阅网站robots.txt协议确认爬取权限。环境准备安装 Python 解释器、第三方请求库配置运行环境保证代码可以正常执行网络请求。发送网络请求模拟浏览器向目标 URL 发送 HTTP 请求携带请求头、请求参数等信息获取服务器返回的响应数据。响应校验判断请求是否成功通过 HTTP 状态码、响应内容长度等信息排查访问失败、页面跳转、封禁 IP 等问题。数据提取对返回的 HTML 源码进行解析根据 HTML 标签、属性、文本内容筛选出所需数据。数据存储与收尾将提取到的文本、链接、地址等数据保存至文件、数据库同时添加异常捕获、请求延时优化爬虫稳定性。整个流程逻辑简单清晰入门阶段的核心学习重点集中在网络请求发送与基础数据提取两大模块。二、运行环境搭建与依赖库安装2.1 Python 环境配置Python 是目前爬虫领域使用最广泛的编程语言其语法简洁、第三方库生态完善极大降低了爬虫开发的门槛。首先需要完成 Python 解释器的安装推荐使用 3.8 及以上版本高版本 Python 对网络请求库、解析库的兼容性更佳。安装步骤简述进入前文提供的 Python 官方下载地址根据自身操作系统Windows、macOS、Linux选择对应安装包Windows 系统安装时建议勾选 “Add Python to PATH” 自动配置环境变量安装完成后打开系统命令行工具CMD、PowerShell、终端输入以下命令验证安装是否成功bash运行python --version若命令行输出对应的 Python 版本号则代表环境配置完成。2.2 核心依赖库介绍与安装原生 Python 内置了urllib模块用于网络请求但该模块语法繁琐、功能单一在实际项目中极少使用。行业内主流使用requests 库实现 HTTP 请求该库封装了复杂的网络请求逻辑语法人性化支持 GET、POST 等多种请求方式同时兼容请求头、代理、超时设置等常用功能。2.2.1 pip 包管理工具pip是 Python 官方的第三方库管理工具Python3.4 及以上版本默认自带pip无需额外安装。在命令行输入以下命令验证pip可用性bash运行pip --version若输出版本信息即可正常使用若提示命令不存在可手动配置环境变量或使用python -m pip替代pip指令。2.2.2 requests 库安装在命令行中执行以下安装命令完成 requests 库的在线安装bash运行pip install requests网络不佳的用户可以使用国内镜像源加速安装以清华镜像源为例命令如下bash运行pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可进入 Python 交互环境执行import requests若无报错则说明库安装成功。2.3 辅助工具介绍2.3.1 浏览器开发者工具主流浏览器Chrome、Edge、Firefox均内置开发者工具是爬虫开发的核心辅助工具主要作用为查看网页 HTML 源码、定位数据对应的 HTML 标签、查看网络请求信息、分析请求头与响应内容。 调用方式打开目标网页后按下F12快捷键或右键页面选择 “检查”即可调出工具面板。其中Elements面板用于查看完整 HTML 结构Network面板用于监控所有网络请求。2.3.2 文本编辑器 / IDE代码编写工具推荐使用 VS Code、PyCharm两类工具均提供语法高亮、代码提示、断点调试等功能适合 Python 代码开发。入门阶段也可使用系统自带记事本编写简单代码但不建议长期使用。三、HTTP 协议与网络请求基础3.1 HTTP 协议核心概念爬虫本质是基于HTTP/HTTPS 协议的客户端程序。HTTP 即超文本传输协议是互联网应用最广泛的应用层协议规定了客户端与服务端之间数据传输的格式与规则。HTTPS 是 HTTP 的加密版本基于 SSL/TLS 协议对传输数据进行加密目前绝大多数正规网站均使用 HTTPS 协议。一次完整的 HTTP 交互分为两部分客户端请求与服务端响应。客户端爬虫 / 浏览器按照协议规则发送请求报文服务端接收到请求后处理业务逻辑并返回响应报文整个交互过程基于 “请求 - 响应” 模型完成。3.2 常见 HTTP 请求方式HTTP 协议定义了多种请求方法静态网页爬取中最常用的为GET 请求其次为 POST 请求其余请求方法在入门阶段极少使用两种核心请求方式的区别如下表格请求方式适用场景参数传递形式静态爬虫使用频率GET单纯获取页面数据、查询内容参数拼接在 URL 地址后方公开可见极高静态网页主流POST提交表单、上传数据、登录验证参数放置在请求体中相对隐蔽较低静态页面基本不用GET 请求是静态网页爬取的核心当我们在浏览器地址栏输入网址访问页面、点击普通链接跳转页面时浏览器发送的都是 GET 请求。3.3 HTTP 请求头与核心参数请求头Request Headers是请求报文的重要组成部分用于向服务端传递客户端的基础信息包括浏览器类型、操作系统、语言、Cookie 等。很多网站会校验请求头信息若爬虫程序不携带合法请求头会被服务器识别为非法程序直接拒绝访问返回 403 禁止访问错误。请求头中User-Agent是最关键的参数该字段用于标识客户端身份浏览器、爬虫程序、移动端设备都会携带专属的 User-Agent 信息。爬虫入门阶段必须模拟浏览器的 User-Agent伪装成正常客户端发起请求。获取浏览器 User-Agent 的方法打开浏览器开发者工具切换至 Network 面板刷新页面点击第一条请求记录在 Request Headers 列表中找到User-Agent字段复制其对应值即可。3.4 HTTP 响应状态码服务端返回的响应报文中会包含状态码用于标识本次请求的执行结果状态码分为五大类别静态爬虫中高频出现的状态码及含义如下2xx 成功类200 OK请求成功服务器正常返回页面数据是爬虫最希望得到的响应结果。3xx 重定向类301 永久重定向、302 临时重定向页面地址发生跳转爬虫会自动跟随跳转获取新页面内容。4xx 客户端错误404 Not Found页面不存在、403 Forbidden禁止访问多为反爬拦截、400 Bad Request请求格式错误。5xx 服务端错误500 服务器内部错误、502 网关错误代表目标网站服务器出现故障非爬虫代码问题。在代码中判断状态码是排查爬虫访问异常的首要步骤。四、requests 库实现基础网络请求4.1 发送简单 GET 请求使用 requests 库发送 GET 请求是静态爬虫的第一步本节从最简代码开始逐步叠加功能讲解每一段代码的作用与底层原理。4.1.1 基础 GET 请求代码示例python运行# 导入第三方请求库 import requests # 定义目标网页URL url https://www.example.com # 发送GET请求获取响应对象 response requests.get(url) # 打印HTTP状态码 print(请求状态码, response.status_code) # 打印网页原始源码字节流格式 print(字节流源码, response.content) # 打印解码后的网页文本字符串格式 print(网页文本源码, response.text)4.1.2 代码逐行原理解析import requests导入已安装的 requests 第三方库只有导入库后程序才能调用库中封装的网络请求相关方法这是 Python 调用外部库的标准语法。url https://www.example.com定义字符串变量存储目标网页的统一资源定位符也就是网页地址。URL 是客户端定位互联网资源的唯一标识爬虫必须依靠 URL 确定访问目标。response requests.get(url)调用 requests 库的get()方法向指定 URL 发送 GET 请求该方法会自动完成网络连接、报文封装、数据接收等操作最终返回一个Response 响应对象。这个对象并非单纯的字符串而是封装了状态码、源码、请求头、响应头、编码格式等一系列数据的复合对象。response.status_code读取响应对象的status_code属性获取本次请求的 HTTP 状态码用于判断请求是否成功。response.content该属性返回bytes 字节流数据是服务器原始返回的数据未经过字符编码转换。网页、图片、文件等所有网络资源在网络传输中均以字节流形式传递这是网络传输的底层格式。字节流适合下载图片、视频、附件等非文本类资源。response.text该属性返回字符串文本数据requests 库会自动根据网页默认编码将字节流解码为人类可阅读的字符串。解析 HTML 网页源码、提取文本数据时优先使用该属性。4.1.3 编码问题说明部分网页会出现response.text输出乱码的情况根本原因是 requests 自动识别的编码格式与网页实际编码格式不匹配。中文网页常用编码为utf-8与gbk出现乱码时需要手动指定编码格式优化代码如下python运行import requests url https://www.example.com response requests.get(url) # 手动设置编码格式解决中文乱码 response.encoding utf-8 html response.text print(html)原理补充网络传输的字节流没有字符概念不同编码规则会将字节解析为不同文字。response.encoding属性用于强制指定解码规则匹配网页真实编码后即可消除乱码。4.2 携带请求头的 GET 请求伪装浏览器绝大多数网站会拦截无 User-Agent 的请求上一节的基础代码在爬取常规网站时大概率会触发 403 禁止访问错误。解决方案就是自定义请求头模拟真实浏览器。4.2.1 携带请求头代码示例python运行import requests # 目标URL url https://www.example.com # 自定义请求头字典 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 } # 发送GET请求传入请求头参数 response requests.get(url, headersheaders) # 校验请求结果 if response.status_code 200: response.encoding utf-8 print(网页源码获取成功) print(response.text) else: print(f请求失败状态码{response.status_code})4.2.2 代码原理解析headers {}请求头以 Python 字典格式定义字典的键对应请求头字段名值对应字段内容。字典是 Python 中存储键值对数据的标准结构与 HTTP 请求头的键值对格式完全契合因此 requests 库采用字典接收请求头参数。headers中的User-Agent字段复制自真实浏览器的请求头信息作用是向服务器声明 “当前客户端为 Chrome 浏览器”绕过基础的客户端校验规则。除 User-Agent 外还可根据网站要求添加Referer、Accept等字段进一步完善伪装效果。requests.get(url, headersheaders)get()方法支持多个可选参数headers为其中之一作用是将自定义请求头附加到请求报文中一并发送至服务器。状态码判断逻辑增加分支判断仅当状态码为 200请求成功时才解析并输出网页源码否则打印错误状态码。该逻辑是工程化代码的基础能够有效区分正常请求与异常请求提升代码健壮性。4.3 增加超时参数防止程序卡死网络环境存在不确定性可能出现目标服务器无响应、网络中断等问题。若不设置超时时间requests.get()方法会一直阻塞等待响应导致爬虫程序卡死。因此在正式代码中必须添加timeout超时参数。4.3.1 超时设置代码示例python运行import requests url https://www.example.com 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 } try: # timeout单位为秒超过设定时间未响应则抛出异常 response requests.get(url, headersheaders, timeout10) response.encoding utf-8 print(源码长度, len(response.text)) except requests.exceptions.Timeout: print(请求超时服务器无响应) except Exception as e: print(f请求出现未知异常{e})4.3.2 原理解析timeout10设置请求超时时间为 10 秒含义是从客户端发起请求开始计时若 10 秒内未接收到服务器完整响应requests 库会主动终止请求并抛出Timeout超时异常。行业内静态爬虫超时时间通常设置为 5~15 秒。try...except异常捕获结构Python 标准的异常处理语法将可能出现错误的网络请求代码放入try代码块中。当代码抛出指定异常时执行对应except代码块的逻辑程序不会直接崩溃而是输出错误提示并继续运行。细分异常类型代码中单独捕获Timeout超时异常同时设置通用异常捕获区分不同错误类型便于开发者定位问题。网络爬虫常见异常包含超时、连接失败、SSL 证书错误、网络中断等。五、HTML 网页结构详解数据提取基础成功获取网页源码后下一步就是理解 HTML 结构这是从源码中精准提取数据的核心前提。HTML 全称超文本标记语言是构建网页的标准标记语言所有静态网页的视觉内容、文本、链接都由 HTML 标签组合而成。5.1 HTML 基础标签规则HTML 由标签组成绝大多数标签为成对出现的双标签格式为标签名内容/标签名少数为单标签格式为标签名 /。标签可以互相嵌套形成层级化的树状结构这也是后续解析库定位元素的核心依据。基础语法规则标签名称不区分大小写但行业规范中统一使用小写标签。标签内部可以添加属性格式为属性名属性值属性用于对标签进行补充描述是定位元素的重要依据。整个 HTML 页面由根标签html包裹内部分为head头部区域与body主体区域页面可见内容全部位于body标签内部。5.2 静态网页高频标签介绍结合爬虫数据提取场景整理网页中出现频率最高的标签、属性及对应作用如下表所示表格标签名称标签类型主要作用爬虫提取场景title双标签定义网页标题显示在浏览器标签栏提取网页标题a双标签超链接标签实现页面跳转提取网址、链接文本p双标签段落标签包裹正文文本提取文章段落、描述文本div双标签块级容器标签用于布局分组定位数据区块批量提取内容span双标签行内容器标签包裹小段文本提取局部关键词、数字h1~h6双标签标题标签六级标题层级提取文章标题、栏目名称img单标签图片标签展示图片提取图片地址链接ul/li组合标签无序列表列表项组合提取列表类数据榜单、目录5.3 标签属性详解定位元素核心标签属性是区分同类标签的关键同一个页面中会存在大量重复的div、a标签单纯依靠标签名无法精准找到目标数据必须借助属性筛选。爬虫开发中最常用的三大属性id 属性理论上在整个 HTML 页面中唯一格式div idcontent定位精度最高优先使用。class 属性用于给标签归类多个标签可以共用同一个 class格式div classlist-item批量提取同类元素的首选属性。href 属性专属a标签存储链接地址是提取 URL 的核心属性。src 属性专属img标签存储图片地址。示例 HTML 代码片段html预览div classarticle-list div classitem h2 classtitlePython静态爬虫入门教程/h2 p classdesc本文讲解静态网页数据提取基础/p a hrefhttps://www.example.com/detail查看详情/a /div /div从这段代码可以看出标签层层嵌套class属性对不同区块进行分类href存储跳转链接完整呈现了静态网页的数据组织形式。爬虫提取数据的本质就是根据标签名、属性、层级关系在这段结构化文本中筛选目标内容。六、原生字符串方法实现简易数据提取在不使用专业 HTML 解析库的前提下可以利用 Python 内置的字符串方法对网页源码进行截取、匹配、分割实现基础的数据提取。该方式能够帮助开发者理解 “从源码中捞取数据” 的底层逻辑也是理解解析库原理的铺垫。6.1 核心字符串方法介绍Python 字符串内置大量处理方法静态数据提取常用方法如下find()查找子字符串的索引位置找到返回起始下标未找到返回 - 1。split()按照指定分隔符切割字符串返回字符串列表。strip()去除字符串首尾的空格、换行符、制表符等空白字符。字符串切片[起始下标:结束下标]根据索引截取指定范围的字符串。6.2 实战案例提取网页标题网页标题存放在title和/title标签之间使用字符串截取的方式提取标题代码及原理如下6.2.1 代码示例python运行import requests url https://www.example.com 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 } try: response requests.get(url, headersheaders, timeout10) response.encoding utf-8 html response.text # 定义前后标记字符串 start_tag title end_tag /title # 查找起始标签的索引 start_index html.find(start_tag) # 标题内容起始位置 起始标签索引 标签长度 content_start start_index len(start_tag) # 查找结束标签的索引 end_index html.find(end_tag, content_start) # 切片截取标题内容 title html[content_start:end_index] # 去除首尾空白字符 title title.strip() print(网页标题, title) except Exception as e: print(请求或解析出错, e)6.2.2 代码原理解析先通过 requests 库获取完整的网页 HTML 字符串html整个源码是一个超长的单行 / 多行字符串。确定目标数据的左右边界标记也就是包裹标题的title开始标签和/title结束标签这是字符串截取的核心思路。html.find(start_tag)从整个字符串中查找title第一次出现的位置返回该字符的下标索引。字符串在计算机中以字符数组形式存储每一个字符都有唯一的数字下标。content_start start_index len(start_tag)find()返回的是开始标签第一个字符的下标想要获取标签内部的内容需要跳过整个开始标签因此加上标签字符串的长度。html.find(end_tag, content_start)第二个参数代表查找的起始位置从标题内容开始的位置向后查找结束标签避免匹配到页面其他位置的同名结束标签。字符串切片html[content_start:end_index]截取两个下标之间的所有字符即为标题原始内容。最后使用strip()清理多余的换行、空格得到干净的标题文本。6.3 实战案例批量提取超链接网页中大量链接均由a标签包裹结合find()循环匹配与字符串分割可批量提取所有链接地址与链接文本。该案例能够体现字符串提取方式的局限性也侧面引出专业解析库的必要性。6.3.1 代码示例python运行import requests url https://www.example.com 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 } def extract_links(html_str): link_list [] # 循环查找所有a标签 a_start html_str.find(a) while a_start ! -1: # 从a位置向后查找href属性起始位置 href_start html_str.find(href, a_start) if href_start -1: break # 链接地址起始位置 url_start href_start len(href) # 查找链接结束的双引号 url_end html_str.find(, url_start) # 截取链接地址 link_url html_str[url_start:url_end] # 查找链接文本结束位置/a标签 a_end html_str.find(/a, url_end) # 截取链接文本 link_text html_str[url_end 1:a_end].strip() # 存入列表 link_list.append({链接地址: link_url, 链接文本: link_text}) # 从下一个位置继续查找下一个a标签 a_start html_str.find(a, a_end) return link_list try: res requests.get(url, headersheaders, timeout10) res.encoding utf-8 html_content res.text links extract_links(html_content) # 遍历输出结果 for item in links: print(item) except Exception as e: print(执行异常, e)6.3.2 原理与局限性分析原理逻辑延续 “标记截取” 思路通过while循环反复查找a标签逐个提取href属性内的链接地址与标签内部的文本内容将结果以字典形式存入列表实现批量提取。明显局限性容错率极低若网页 HTML 格式发生微小变化如标签内增加空格、属性顺序调换、使用单引号替代双引号代码会直接提取失败。代码冗余复杂面对多层嵌套、复杂结构的 HTML 页面需要编写大量循环与判断逻辑开发效率极低。无法精准定位不能根据class、id等属性筛选指定范围内的链接只能全局匹配所有a标签。正是由于原生字符串方法存在以上缺陷行业内才诞生了 BeautifulSoup、lxml 等专业 HTML/XML 解析库这类库会将 HTML 文本转换为树形结构基于节点、标签、属性进行智能匹配大幅降低数据提取难度。原生字符串方法仅适合理解底层逻辑正式项目中不推荐使用。七、爬虫基础优化与合规性规范7.1 请求延时设置规避访问限制高频、不间断的请求会给目标服务器造成压力同时极易触发网站反爬机制导致 IP 被临时封禁。在循环爬取多个页面的场景中必须添加请求延时模拟人类正常浏览网页的行为节奏。Python 内置time模块可实现延时功能代码示例python运行import requests import time url_list [ https://www.example.com/1, https://www.example.com/2, https://www.example.com/3 ] 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 } for url in url_list: response requests.get(url, headersheaders, timeout10) print(f已爬取{url}状态码{response.status_code}) # 延时2秒再执行下一次请求 time.sleep(2)原理说明time.sleep(n)表示程序暂停运行 n 秒单位为秒。常规静态爬虫延时设置为 1~3 秒即可访问防护严格的网站可适当延长延时时间。7.2 数据本地存储文本文件提取到的数据若仅在控制台输出无法长期保存入门阶段最简易的存储方式为写入本地txt文本文件。Python 内置文件操作语法无需额外安装库。7.2.1 追加写入文件代码示例python运行import requests url https://www.example.com 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 } try: res requests.get(url, headersheaders, timeout10) res.encoding utf-8 html res.text # 截取标题 s1 html.find(title) len(title) s2 html.find(/title, s1) title html[s1:s2].strip() # 以追加模式打开文件编码指定为utf-8避免中文乱码 with open(spider_data.txt, a, encodingutf-8) as f: f.write(f网页标题{title}\n) print(数据已保存至本地文件) except Exception as e: print(出错, e)原理说明open()函数用于打开本地文件a代表追加写入模式新数据会续写在文件末尾w为覆盖写入模式会清空原有内容。with语句可以自动关闭文件流是 Python 推荐的文件操作写法。7.3 爬虫合规性与行业准则遵守robots.txt协议几乎所有正规网站根目录下都存在robots.txt文件该文件明确标注了网站允许 / 禁止爬虫访问的目录与页面爬取前建议优先查看。禁止抓取隐私与版权数据用户手机号、身份证、个人相册等隐私数据以及付费文章、影视资源、原创图文等版权内容严禁私自抓取与传播。控制请求频率无论网站是否有反爬措施都需要设置合理延时拒绝高频轰炸式请求维护网络服务稳定。禁止恶意攻击爬虫的核心用途为数据采集不得利用爬虫技术发起 DDoS 攻击、批量注册、恶意刷量等违规行为。八、综合实战完整静态网页爬虫项目结合前文所有知识点搭建一套完整、可运行、具备异常处理、延时、数据存储的静态网页综合爬虫案例实现 “多页面遍历、数据提取、本地存储” 全流程整合网络请求、编码处理、字符串提取、异常捕获、延时、文件存储等所有基础知识点。8.1 项目需求批量爬取多个静态页面提取每个页面的标题、页面简介将所有数据统一保存至本地文本文件要求伪装浏览器请求、设置超时、异常捕获、请求延时、中文不乱码。8.2 完整项目代码python运行# 导入所需模块 import requests import time # 1. 全局配置项 # 待爬取的页面地址列表 target_urls [ https://www.example.com/page1, https://www.example.com/page2, https://www.example.com/page3 ] # 模拟浏览器请求头 request_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 } # 请求超时时间 time_out 10 # 页面请求间隔时间 sleep_time 2 # 2. 定义数据提取函数 def parse_html(html_content): 解析HTML源码提取标题与简介 :param html_content: 网页源码字符串 :return: 标题、简介 # 提取标题 title_start html_content.find(title) title_end html_content.find(/title, title_start) title html_content[title_start len(title):title_end].strip() # 提取简介假设简介位于p classintro标签内 intro_start html_content.find(p classintro) intro_end html_content.find(/p, intro_start) intro html_content[intro_start len(p classintro):intro_end].strip() return title, intro # 3. 主爬虫逻辑 def main_spider(): print( 静态网页爬虫开始运行 ) # 以追加模式打开文件统一存储数据 with open(static_spider_result.txt, a, encodingutf-8) as file: for index, url in enumerate(target_urls): print(f正在爬取第{index 1}个页面{url}) try: # 发送GET请求 response requests.get( urlurl, headersrequest_headers, timeouttime_out ) # 判断请求状态 if response.status_code ! 200: print(f页面访问失败状态码{response.status_code}) # 写入错误信息 file.write(f链接{url} 访问失败状态码{response.status_code}\n) # 延时后继续下一个页面 time.sleep(sleep_time) continue # 设置编码处理中文乱码 response.encoding utf-8 html_text response.text # 调用解析函数提取数据 page_title, page_intro parse_html(html_text) # 控制台输出结果 print(f页面标题{page_title}) print(f页面简介{page_intro}) # 数据写入本地文件 save_content f链接地址{url}\n标题{page_title}\n简介{page_intro}\n-------------------------\n file.write(save_content) except requests.exceptions.Timeout: print(f页面 {url} 请求超时) file.write(f链接{url} 请求超时\n-------------------------\n) except Exception as e: print(f页面 {url} 出现未知异常{str(e)}) file.write(f链接{url} 异常信息{str(e)}\n-------------------------\n) # 每个页面爬取完成后延时 time.sleep(sleep_time) print( 所有页面爬取完成数据已保存 ) # 程序入口 if __name__ __main__: main_spider()8.3 项目整体原理与代码分层解析全局配置区将 URL 列表、请求头、超时时间、延时时间统一定义为全局变量后期修改爬取地址、调整延时仅需修改此处代码可维护性更强是工程化编程的基础规范。数据提取函数parse_html将 HTML 解析、数据截取逻辑封装为独立函数实现代码解耦。函数接收网页源码参数返回提取后的标题与简介符合 Python 函数化编程思想。主函数main_spider作为爬虫核心执行入口采用for循环遍历所有目标 URL实现多页面批量爬取。多层异常处理单独捕获超时异常同时设置通用异常捕获区分不同故障类型保证单个页面出错不会导致整个爬虫程序终止。文件存储逻辑全程使用with语句操作文件所有页面的数据统一写入同一个文本文件格式规整便于后续查阅。请求延时逻辑每完成一个页面的请求与解析执行time.sleep()延时模拟正常浏览行为降低被反爬拦截的概率。8.4 项目拓展方向本案例为纯静态网页入门爬虫基于现有代码可进行多维度拓展也是后续进阶学习的方向适配分页爬取分析网站分页 URL 规则自动拼接分页地址实现全站分页数据爬取。替换解析方式使用 BeautifulSoup、XPath 等专业解析方式替代原生字符串截取提升代码稳定性。更换存储介质将文本文件存储替换为 CSV、Excel、轻量级数据库适配大批量数据存储场景。添加代理 IP针对 IP 封禁严重的网站增加代理池功能切换不同 IP 发起请求。九、常见问题排查与总结9.1 入门阶段高频问题及解决方案结合静态爬虫入门学习过程中学习者遇到的典型问题整理故障现象、原因与对应解决办法如下表表格故障现象产生原因解决方案运行代码提示ModuleNotFoundError: No module named requests未安装 requests 库或多 Python 版本环境冲突执行pip install requests重新安装确认使用对应版本 pip网页输出内容中文乱码自动编码识别错误手动设置response.encoding utf-8或gbk请求返回 403 Forbidden服务器识别为爬虫拒绝访问补充完整 User-Agent 请求头模拟浏览器程序长时间无响应、卡死网络无响应未设置超时添加timeout参数设置请求超时时间部分标签内容提取为空字符串截取的标记不匹配核对 HTML 源码修正截取的前后标签、属性9.2 全文知识总结本文作为 Python 静态网页数据提取的入门内容完整覆盖了从环境搭建、网络原理、请求实现、HTML 解读、数据提取到项目实战的全流程知识核心知识点梳理如下明确静态网页核心特征页面所有可见内容均包含在初始 HTML 源码中无需处理动态加载逻辑是爬虫入门的最优场景。掌握 requests 库核心用法GET 请求发送、请求头伪装、超时设置、异常捕获这是 Python 爬虫网络请求的通用基础。理解 HTML 树形结构与标签、属性规则能够借助浏览器开发者工具定位目标数据所在的标签位置。掌握 Python 字符串截取的底层提取逻辑理解专业解析库的设计初衷与优势。具备基础工程化思维代码分层、函数封装、请求延时、数据持久化、异常处理保证爬虫程序稳定运行。树立合规爬虫意识遵守网络相关法规与网站规则做到合法使用爬虫技术。静态网页爬虫是整个 Python 爬虫体系的基石本文所讲解的网络请求、异常处理、文件存储、代码规范等内容同样适用于后续动态网页爬取、接口爬取、分布式爬虫等高阶场景。完成本文学习与案例实操后读者已具备独立开发简易静态爬虫的能力后续可继续学习专业 HTML 解析库、正则表达式、反爬应对、数据库存储等进阶内容逐步构建完整的爬虫技术栈。