前言在 Python 爬虫技术体系中网络请求模块是实现数据采集的核心入口而requests库凭借简洁的调用语法、完善的功能封装、优秀的兼容性成为目前工业界与学习场景中使用率最高的 HTTP 请求库。相较于 Python 标准库内置的urllib系列模块requests大幅简化了 HTTP 请求的编写逻辑屏蔽了底层网络交互的复杂细节支持常规请求、会话保持、文件上传、代理配置、HTTPS 证书处理等全场景功能能够覆盖绝大多数中小型爬虫、接口测试、数据采集等业务需求。熟练掌握requests库的基础语法、对象属性、调用逻辑与异常处理是开展 GET/POST 请求、请求伪装、网页解析等后续爬虫开发工作的必要前提。本文围绕requests库展开全维度实战讲解从库的安装导入、核心请求对象、常用属性方法到基础请求案例、异常捕获、基础调试技巧逐一拆解结合可直接运行的代码示例与底层原理分析帮助开发者建立完整的requests使用知识体系。文中涉及的工具、库文档官方链接汇总如下requests 官方文档https://docs.python-requests.org/requests PyPI 主页https://pypi.org/project/requests/HTTP 状态码参考文档https://httpstatuses.com/在线测试接口平台https://httpbin.org/一、requests 库安装与基础导入1.1 库安装操作requests属于 Python 第三方开源库并未随 Python 解释器内置需要借助pip包管理工具完成安装。结合上一章节配置的国内镜像源可有效提升安装速度与成功率全平台通用安装指令如下shell# 常规安装命令使用已配置的全局镜像源 pip install requests # 如需指定版本安装示例如下 pip install requests2.31.0 # 临时指定清华镜像源安装网络异常时使用 pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/安装完成后可通过pip show requests指令查看库的安装路径、版本号、依赖关系等信息确认安装状态。若终端提示权限不足Windows 系统可切换至管理员身份运行命令行macOS 与 Linux 系统可在指令前追加sudo获取系统权限。1.2 模块导入规范在 Python 代码文件中使用import关键字导入requests模块这是调用其所有功能的前置操作。标准导入写法如下python运行# 标准导入方式项目通用写法 import requests导入完成后即可通过requests.方法名的形式调用库内封装的各类请求方法、工具函数。若项目中存在多处高频调用也可结合别名简化书写语法为import requests as 别名示例python运行# 设置别名sp简化代码书写 import requests as sp行业内默认优先使用原生名称导入别名方式仅在多模块名称冲突、代码极简编写场景下使用。二、requests 核心架构与响应对象解析使用requests发起网络请求后程序会接收服务器返回的数据流并自动封装为Response 响应对象。该对象承载了本次网络交互的全部数据包括响应状态码、网页源码、请求头、响应头、Cookie、编码格式等核心信息。理解 Response 对象的属性与方法是解析网页数据、判断请求状态的关键。2.1 核心属性分类与功能说明下文将 Response 对象常用属性进行分类整理并结合功能、使用场景、返回数据类型做出说明同时配套基础代码演示。表格属性名称数据类型功能描述适用场景status_code整型HTTP 响应状态码用于判断请求结果校验请求是否成功、识别服务器异常text字符串自动解码后的网页文本内容即网页源码解析静态网页、提取文本类数据content字节流原始二进制响应数据未经过解码下载图片、视频、文件、二进制资源headers字典服务器返回的响应头信息分析服务器配置、获取响应字段request.headers字典本次请求携带的请求头信息校验请求伪装、排查请求参数异常cookiesRequestsCookieJar 对象服务器下发的 Cookie 集合会话保持、登录态维持、身份校验url字符串最终请求的完整 URL 地址含重定向后地址追踪页面跳转、校验目标地址encoding字符串响应内容的编码格式手动修正编码、解决网页乱码问题elapsed时间对象单次请求的耗时时长接口性能测试、爬虫速度优化2.2 基础示例发起请求并打印响应属性以下代码为标准的基础请求模板调用requests.get()方法向测试地址发起请求并依次打印上述核心属性完整演示 Response 对象的调用方式python运行import requests # 定义目标请求地址httpbin为专业HTTP测试接口 url https://httpbin.org/ # 发起GET请求接收返回的Response对象 resp requests.get(url) # 依次打印核心属性 print(HTTP状态码, resp.status_code) print(最终请求URL, resp.url) print(请求耗时, resp.elapsed) print(网页编码格式, resp.encoding) print( 响应头信息 ) print(resp.headers) print( 原始二进制数据长度 ) print(len(resp.content))代码原理详解requests.get(url)调用requests库内置的 GET 请求方法程序基于底层 TCP/IP 协议与目标服务器建立连接发送 HTTP 请求报文等待服务器返回数据后将所有数据封装为Response对象并赋值给变量resp。resp.status_code读取 HTTP 协议规定的状态码遵循统一标准200 系列代表请求成功400 系列代表客户端错误500 系列代表服务器错误。resp.text与resp.content二者是爬虫中使用频率最高的两个属性。text会根据encoding属性自动对二进制数据进行字符解码输出人类可直接阅读的文本content保留原始字节流不做任何编码转换二进制类资源必须使用该属性读取。resp.encodingrequests会自动从响应头、网页源码中推测编码格式当自动推测出现偏差时会直接引发中文乱码也是后续编码处理章节的核心知识点。2.3 状态码详解与请求结果判断逻辑HTTP 状态码是网络请求的 “结果标识”爬虫程序需要根据状态码自动判断请求是否正常进而执行后续逻辑。结合爬虫开发场景对高频状态码划分并说明2xx 成功类状态码200 OK请求成功服务器正常返回数据是爬虫最期望的返回结果201 Created请求成功且服务器创建了新资源多用于接口提交场景。3xx 重定向类状态码301/302页面永久 / 临时跳转requests默认自动跟随重定向最终resp.url会显示跳转后的地址4xx 客户端错误类状态码404 Not Found目标网页不存在URL 地址错误或页面已删除403 Forbidden服务器拒绝访问大概率触发基础反爬机制400 Bad Request请求参数格式错误5xx 服务器错误类状态码500 Internal Server Error服务器内部代码报错502 Bad Gateway、503 Service Unavailable服务器网关异常、服务宕机或过载。在实际爬虫开发中通常以状态码等于 200作为请求成功的判断依据代码判断模板如下python运行import requests url https://httpbin.org/get resp requests.get(url) # 条件判断请求是否成功 if resp.status_code 200: print(请求成功开始解析数据) print(resp.text) else: print(f请求失败状态码{resp.status_code})requests库还提供了内置判定方法resp.ok该方法会自动判断状态码是否属于 200~299 区间返回布尔值可简化判断逻辑python运行if resp.ok: print(请求正常) else: print(请求异常)三、基础 GET 请求全场景实战GET 请求是 HTTP 协议中最基础的请求方式主要用于从服务器获取数据不会向服务器提交额外数据。日常访问网页、查询公开接口、浏览静态页面本质都是发送 GET 请求。requests.get()是实现 GET 请求的核心方法本节结合无参数 GET、带 URL 参数 GET、长链接 GET 等场景逐一实战。3.1 无参数 GET 请求基础网页访问无参数 GET 请求即直接访问目标 URL不拼接任何查询参数适用于访问首页、静态详情页等场景也是入门最基础的用法。实战代码python运行import requests # 目标网址百度首页 target_url https://www.baidu.com # 发起GET请求 response requests.get(target_url) # 输出核心信息 print(状态码, response.status_code) # 输出网页源码前500个字符避免内容过长 print(网页源码片段, response.text[:500])原理解析程序根据传入的 URL 解析域名与端口通过 DNS 解析获取服务器 IP 地址建立 TCP 连接后按照 HTTP 协议标准构造 GET 请求报文并发送。服务器接收请求后检索对应页面资源将网页源码、样式文件、脚本文件等整合为响应数据返回客户端。response.text[:500]对返回的长文本进行切片截取仅展示前 500 字符是调试阶段常用的优化写法。该示例中未设置请求头requests会使用默认的客户端标识部分网站会识别默认标识并拦截请求这也是后续请求伪装章节需要解决的问题。3.2 带查询参数的 GET 请求在实际场景中搜索页面、分页页面、筛选页面的 URL 都会携带查询参数格式通常为url?键1值1键2值2。例如搜索关键词、切换页码、筛选分类等操作都会在 URL 末尾拼接参数。requests.get()方法提供了params参数专门用于拼接 URL 查询参数无需开发者手动拼接字符串有效规避拼接错误、特殊字符转义等问题。3.2.1 字典传参标准写法将所有查询参数以字典形式组织传入params形参requests会自动完成 URL 拼接、特殊字符编码转义。实战代码python运行import requests # 基础URL不包含参数 base_url https://httpbin.org/get # 定义查询参数字典 params_data { username: spider001, page: 2, keyword: Python爬虫 } # 传入params参数发起带参GET请求 resp requests.get(base_url, paramsparams_data) # 打印最终拼接完成的URL print(拼接后的完整URL, resp.url) # 打印接口返回数据 print(接口响应内容, resp.text)原理解析字典params_data内的键值对对应 URL 中的查询字段与字段值requests会自动将字典转换为usernamespider001page2keywordPython爬虫格式并拼接在基础 URL 之后。针对中文、空格、特殊符号等内容库会自动执行 URL 编码无需开发者手动调用编码函数大幅降低编码错误概率。最终resp.url可以清晰看到拼接后的完整地址用于校验参数是否传递成功。3.2.2 列表类型参数传递部分接口支持一个键对应多个值的参数形式格式为?tagjavatagpython此时可将字典的值设置为列表requests会自动解析为多组同名参数。实战代码python运行import requests url https://httpbin.org/get # 列表作为参数值 param { tag: [Python, Java, C] } resp requests.get(url, paramsparam) print(完整URL, resp.url)运行后可见 URL 自动拼接为tagPythontagJavatagC完全符合接口参数规范。3.3 请求超时设置网络环境存在不确定性可能出现服务器无响应、网络卡死等问题。若不设置超时时间requests会永久阻塞等待导致程序卡死。因此所有正式爬虫代码必须配置超时参数。get方法中的timeout参数用于设置超时时间单位为秒。当请求耗时超过设定时间仍未收到响应程序会主动抛出requests.exceptions.Timeout异常并终止请求。实战代码python运行import requests url https://httpbin.org/delay/5 # 设置超时时间为3秒目标接口延迟5秒返回数据会触发超时异常 try: # timeout3 代表3秒超时 resp requests.get(url, timeout3) print(resp.text) except requests.exceptions.Timeout: print(请求超时网络或服务器响应缓慢)原理解析timeout参数定义了从请求发送到数据接收完成的最大允许时长分为连接超时与读取超时单一数值代表总超时时间。代码中使用try...except异常捕获结构主动捕获超时异常避免程序崩溃这是工业级爬虫的基础容错规范。超时时间需根据业务场景合理设置常规网页请求建议设置为 5~10 秒大型文件下载可适当延长。四、二进制资源请求实战图片、文件下载前文提到resp.text适用于文本类数据而图片、音频、视频、压缩包等二进制资源必须使用resp.content属性读取。结合 GET 请求本节实现图片下载、文件保存的完整案例这也是爬虫中资源采集的常用场景。4.1 单张图片下载实战实战代码python运行import requests # 图片资源地址 img_url https://httpbin.org/image/jpeg # 发起GET请求 resp requests.get(img_url, timeout10) # 判断请求成功后将二进制数据写入本地文件 if resp.status_code 200: # 以二进制写入模式打开文件wb代表write binary with open(test_image.jpg, wb) as f: # 写入原始二进制数据 f.write(resp.content) print(图片下载完成) else: print(图片请求失败)原理解析图片属于非文本资源服务器返回的是原始字节流使用resp.text会强制解码为字符串造成文件损坏、无法打开因此必须使用resp.content获取字节数据。文件操作模式wbw表示覆盖写入b表示二进制模式二进制文件读写必须携带b标识否则会出现编码错误。with open()语句为 Python 推荐的文件读写写法执行完毕后自动关闭文件句柄避免资源泄露。4.2 大文件流式下载优化下载体积较大的文件时一次性读取全部resp.content会占用大量内存容易造成内存溢出。requests支持流式读取通过streamTrue参数开启分块加载配合迭代器逐块写入文件降低内存占用。实战代码python运行import requests file_url https://httpbin.org/stream/100 save_path stream_file.txt try: # 开启流式请求不一次性加载全部内容到内存 resp requests.get(file_url, streamTrue, timeout20) if resp.ok: with open(save_path, wb) as f: # 逐块迭代读取数据默认分块大小适配网络传输单元 for chunk in resp.iter_content(chunk_size1024): # 过滤空数据块 if chunk: f.write(chunk) print(大文件流式下载完成) except Exception as e: print(文件下载异常, e)原理解析streamTrue开启流式传输模式请求仅建立连接不会立即加载全部响应数据到内存。iter_content(chunk_size1024)按指定字节大小分块迭代数据示例中每块大小为 1024 字节1KB逐块读取并写入本地。该方案广泛应用于视频、压缩包、大型文档等资源下载是爬虫项目中优化内存占用的核心手段。五、requests 会话对象 Session 基础使用普通的requests.get()请求属于单次独立请求每一次请求都会重新建立连接、重新获取 Cookie无法维持登录状态、会话信息。而Session会话对象可以持久化 Cookie、保持 TCP 连接、复用请求上下文模拟浏览器连续访问多个页面的行为是实现登录态爬虫、连贯页面采集的核心工具。5.1 Session 对象基础特性自动存储服务器下发的 Cookie并在后续同一会话的请求中自动携带复用底层 TCP 连接提升连续请求的响应速度统一管理请求头、代理、超时等公共配置简化重复代码。5.2 基础会话请求实战实战代码python运行import requests # 1. 创建会话对象整个生命周期内共享Cookie与连接 session requests.Session() # 第一次请求服务器返回Cookie并由session自动保存 url1 https://httpbin.org/cookies/set/spider/123456 resp1 session.get(url1) print(第一次请求响应, resp1.text) # 第二次请求session自动携带上一步获取的Cookie url2 https://httpbin.org/cookies resp2 session.get(url2) print(第二次请求携带Cookie, resp2.text) # 关闭会话释放连接与资源 session.close()原理解析requests.Session()创建独立会话实例该实例独立于普通请求拥有专属的 Cookie 容器、连接池。第一个接口/cookies/set会向客户端下发自定义 Cookie会话对象自动接收并保存。访问/cookies接口查询当前请求携带的 Cookie可见上一步设置的 Cookie 已自动携带证明会话状态保持生效。session.close()用于主动关闭会话释放网络连接资源程序结束前建议执行该操作。5.3 会话对象设置全局请求参数对于同一会话下的多次请求可统一设置请求头、超时时间等参数无需在每一个get方法中重复传入简化代码结构python运行import requests session requests.Session() # 为整个会话设置全局超时时间 session.timeout 8 # 两次请求均自动继承全局超时配置 url_1 https://httpbin.org/get url_2 https://httpbin.org/headers resp1 session.get(url_1) resp2 session.get(url_2) print(resp1.status_code, resp2.status_code) session.close()六、异常捕获与健壮性优化网络请求属于 IO 密集型操作受网络波动、服务器状态、URL 合法性、反爬策略等多重因素影响极易出现各类异常。完善的异常捕获机制是爬虫稳定运行的保障本节梳理requests高频异常类型并搭建通用异常捕获模板。6.1 高频异常类型汇总表格异常类触发场景requests.exceptions.Timeout请求超时服务器响应缓慢或网络中断requests.exceptions.ConnectionError连接失败域名错误、服务器宕机、断网requests.exceptions.SSLErrorHTTPS 证书验证失败requests.exceptions.TooManyRedirects重定向次数过多陷入死循环跳转requests.exceptions.RequestException所有 requests 异常的父类通用捕获6.2 通用异常捕获模板该模板覆盖主流异常类型可作为所有requests请求的标准代码框架python运行import requests from requests.exceptions import Timeout, ConnectionError, SSLError, RequestException url https://www.baidu.com try: resp requests.get(url, timeout5) resp.raise_for_status() # 主动抛出4xx/5xx状态码异常 print(请求成功源码长度, len(resp.text)) except Timeout: print(异常请求超时) except ConnectionError: print(异常网络连接失败请检查URL与网络状态) except SSLError: print(异常HTTPS证书验证失败) except RequestException as e: print(f请求通用异常{str(e)})原理解析resp.raise_for_status()主动校验状态码若为 4xx、5xx 错误手动抛出异常避免程序继续执行无效逻辑。异常捕获顺序遵循子类在前父类在后原则优先捕获具体异常最后使用父类RequestException兜底。该模板可直接复用在所有爬虫请求代码中大幅提升程序容错能力。七、本章综合实战案例多页面数据采集结合本章所学的 GET 请求、参数拼接、超时设置、异常捕获、会话保持等知识点编写综合实战案例实现带分页的模拟数据采集整合全部核心技能。python运行import requests from requests.exceptions import RequestException # 基础配置 base_url https://httpbin.org/get session requests.Session() session.timeout 6 # 循环采集1-3页数据 for page in range(1, 4): params { page_num: page, source: spider_demo } try: resp session.get(base_url, paramsparams) resp.raise_for_status() print(f 第{page}页数据 ) print(resp.text) except RequestException as e: print(f第{page}页采集失败错误信息{e}) session.close() print(多页面采集任务执行完毕)案例说明使用Session维持会话状态保证分页请求上下文连贯通过循环 字典参数实现分页功能符合真实分页爬虫的开发逻辑全局设置超时时间搭配统一异常捕获保证程序连续运行该案例完整复刻了常规列表页爬虫的请求逻辑可直接迁移至真实网站使用。
Python 爬虫项目:requests 库基础请求实战
前言在 Python 爬虫技术体系中网络请求模块是实现数据采集的核心入口而requests库凭借简洁的调用语法、完善的功能封装、优秀的兼容性成为目前工业界与学习场景中使用率最高的 HTTP 请求库。相较于 Python 标准库内置的urllib系列模块requests大幅简化了 HTTP 请求的编写逻辑屏蔽了底层网络交互的复杂细节支持常规请求、会话保持、文件上传、代理配置、HTTPS 证书处理等全场景功能能够覆盖绝大多数中小型爬虫、接口测试、数据采集等业务需求。熟练掌握requests库的基础语法、对象属性、调用逻辑与异常处理是开展 GET/POST 请求、请求伪装、网页解析等后续爬虫开发工作的必要前提。本文围绕requests库展开全维度实战讲解从库的安装导入、核心请求对象、常用属性方法到基础请求案例、异常捕获、基础调试技巧逐一拆解结合可直接运行的代码示例与底层原理分析帮助开发者建立完整的requests使用知识体系。文中涉及的工具、库文档官方链接汇总如下requests 官方文档https://docs.python-requests.org/requests PyPI 主页https://pypi.org/project/requests/HTTP 状态码参考文档https://httpstatuses.com/在线测试接口平台https://httpbin.org/一、requests 库安装与基础导入1.1 库安装操作requests属于 Python 第三方开源库并未随 Python 解释器内置需要借助pip包管理工具完成安装。结合上一章节配置的国内镜像源可有效提升安装速度与成功率全平台通用安装指令如下shell# 常规安装命令使用已配置的全局镜像源 pip install requests # 如需指定版本安装示例如下 pip install requests2.31.0 # 临时指定清华镜像源安装网络异常时使用 pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/安装完成后可通过pip show requests指令查看库的安装路径、版本号、依赖关系等信息确认安装状态。若终端提示权限不足Windows 系统可切换至管理员身份运行命令行macOS 与 Linux 系统可在指令前追加sudo获取系统权限。1.2 模块导入规范在 Python 代码文件中使用import关键字导入requests模块这是调用其所有功能的前置操作。标准导入写法如下python运行# 标准导入方式项目通用写法 import requests导入完成后即可通过requests.方法名的形式调用库内封装的各类请求方法、工具函数。若项目中存在多处高频调用也可结合别名简化书写语法为import requests as 别名示例python运行# 设置别名sp简化代码书写 import requests as sp行业内默认优先使用原生名称导入别名方式仅在多模块名称冲突、代码极简编写场景下使用。二、requests 核心架构与响应对象解析使用requests发起网络请求后程序会接收服务器返回的数据流并自动封装为Response 响应对象。该对象承载了本次网络交互的全部数据包括响应状态码、网页源码、请求头、响应头、Cookie、编码格式等核心信息。理解 Response 对象的属性与方法是解析网页数据、判断请求状态的关键。2.1 核心属性分类与功能说明下文将 Response 对象常用属性进行分类整理并结合功能、使用场景、返回数据类型做出说明同时配套基础代码演示。表格属性名称数据类型功能描述适用场景status_code整型HTTP 响应状态码用于判断请求结果校验请求是否成功、识别服务器异常text字符串自动解码后的网页文本内容即网页源码解析静态网页、提取文本类数据content字节流原始二进制响应数据未经过解码下载图片、视频、文件、二进制资源headers字典服务器返回的响应头信息分析服务器配置、获取响应字段request.headers字典本次请求携带的请求头信息校验请求伪装、排查请求参数异常cookiesRequestsCookieJar 对象服务器下发的 Cookie 集合会话保持、登录态维持、身份校验url字符串最终请求的完整 URL 地址含重定向后地址追踪页面跳转、校验目标地址encoding字符串响应内容的编码格式手动修正编码、解决网页乱码问题elapsed时间对象单次请求的耗时时长接口性能测试、爬虫速度优化2.2 基础示例发起请求并打印响应属性以下代码为标准的基础请求模板调用requests.get()方法向测试地址发起请求并依次打印上述核心属性完整演示 Response 对象的调用方式python运行import requests # 定义目标请求地址httpbin为专业HTTP测试接口 url https://httpbin.org/ # 发起GET请求接收返回的Response对象 resp requests.get(url) # 依次打印核心属性 print(HTTP状态码, resp.status_code) print(最终请求URL, resp.url) print(请求耗时, resp.elapsed) print(网页编码格式, resp.encoding) print( 响应头信息 ) print(resp.headers) print( 原始二进制数据长度 ) print(len(resp.content))代码原理详解requests.get(url)调用requests库内置的 GET 请求方法程序基于底层 TCP/IP 协议与目标服务器建立连接发送 HTTP 请求报文等待服务器返回数据后将所有数据封装为Response对象并赋值给变量resp。resp.status_code读取 HTTP 协议规定的状态码遵循统一标准200 系列代表请求成功400 系列代表客户端错误500 系列代表服务器错误。resp.text与resp.content二者是爬虫中使用频率最高的两个属性。text会根据encoding属性自动对二进制数据进行字符解码输出人类可直接阅读的文本content保留原始字节流不做任何编码转换二进制类资源必须使用该属性读取。resp.encodingrequests会自动从响应头、网页源码中推测编码格式当自动推测出现偏差时会直接引发中文乱码也是后续编码处理章节的核心知识点。2.3 状态码详解与请求结果判断逻辑HTTP 状态码是网络请求的 “结果标识”爬虫程序需要根据状态码自动判断请求是否正常进而执行后续逻辑。结合爬虫开发场景对高频状态码划分并说明2xx 成功类状态码200 OK请求成功服务器正常返回数据是爬虫最期望的返回结果201 Created请求成功且服务器创建了新资源多用于接口提交场景。3xx 重定向类状态码301/302页面永久 / 临时跳转requests默认自动跟随重定向最终resp.url会显示跳转后的地址4xx 客户端错误类状态码404 Not Found目标网页不存在URL 地址错误或页面已删除403 Forbidden服务器拒绝访问大概率触发基础反爬机制400 Bad Request请求参数格式错误5xx 服务器错误类状态码500 Internal Server Error服务器内部代码报错502 Bad Gateway、503 Service Unavailable服务器网关异常、服务宕机或过载。在实际爬虫开发中通常以状态码等于 200作为请求成功的判断依据代码判断模板如下python运行import requests url https://httpbin.org/get resp requests.get(url) # 条件判断请求是否成功 if resp.status_code 200: print(请求成功开始解析数据) print(resp.text) else: print(f请求失败状态码{resp.status_code})requests库还提供了内置判定方法resp.ok该方法会自动判断状态码是否属于 200~299 区间返回布尔值可简化判断逻辑python运行if resp.ok: print(请求正常) else: print(请求异常)三、基础 GET 请求全场景实战GET 请求是 HTTP 协议中最基础的请求方式主要用于从服务器获取数据不会向服务器提交额外数据。日常访问网页、查询公开接口、浏览静态页面本质都是发送 GET 请求。requests.get()是实现 GET 请求的核心方法本节结合无参数 GET、带 URL 参数 GET、长链接 GET 等场景逐一实战。3.1 无参数 GET 请求基础网页访问无参数 GET 请求即直接访问目标 URL不拼接任何查询参数适用于访问首页、静态详情页等场景也是入门最基础的用法。实战代码python运行import requests # 目标网址百度首页 target_url https://www.baidu.com # 发起GET请求 response requests.get(target_url) # 输出核心信息 print(状态码, response.status_code) # 输出网页源码前500个字符避免内容过长 print(网页源码片段, response.text[:500])原理解析程序根据传入的 URL 解析域名与端口通过 DNS 解析获取服务器 IP 地址建立 TCP 连接后按照 HTTP 协议标准构造 GET 请求报文并发送。服务器接收请求后检索对应页面资源将网页源码、样式文件、脚本文件等整合为响应数据返回客户端。response.text[:500]对返回的长文本进行切片截取仅展示前 500 字符是调试阶段常用的优化写法。该示例中未设置请求头requests会使用默认的客户端标识部分网站会识别默认标识并拦截请求这也是后续请求伪装章节需要解决的问题。3.2 带查询参数的 GET 请求在实际场景中搜索页面、分页页面、筛选页面的 URL 都会携带查询参数格式通常为url?键1值1键2值2。例如搜索关键词、切换页码、筛选分类等操作都会在 URL 末尾拼接参数。requests.get()方法提供了params参数专门用于拼接 URL 查询参数无需开发者手动拼接字符串有效规避拼接错误、特殊字符转义等问题。3.2.1 字典传参标准写法将所有查询参数以字典形式组织传入params形参requests会自动完成 URL 拼接、特殊字符编码转义。实战代码python运行import requests # 基础URL不包含参数 base_url https://httpbin.org/get # 定义查询参数字典 params_data { username: spider001, page: 2, keyword: Python爬虫 } # 传入params参数发起带参GET请求 resp requests.get(base_url, paramsparams_data) # 打印最终拼接完成的URL print(拼接后的完整URL, resp.url) # 打印接口返回数据 print(接口响应内容, resp.text)原理解析字典params_data内的键值对对应 URL 中的查询字段与字段值requests会自动将字典转换为usernamespider001page2keywordPython爬虫格式并拼接在基础 URL 之后。针对中文、空格、特殊符号等内容库会自动执行 URL 编码无需开发者手动调用编码函数大幅降低编码错误概率。最终resp.url可以清晰看到拼接后的完整地址用于校验参数是否传递成功。3.2.2 列表类型参数传递部分接口支持一个键对应多个值的参数形式格式为?tagjavatagpython此时可将字典的值设置为列表requests会自动解析为多组同名参数。实战代码python运行import requests url https://httpbin.org/get # 列表作为参数值 param { tag: [Python, Java, C] } resp requests.get(url, paramsparam) print(完整URL, resp.url)运行后可见 URL 自动拼接为tagPythontagJavatagC完全符合接口参数规范。3.3 请求超时设置网络环境存在不确定性可能出现服务器无响应、网络卡死等问题。若不设置超时时间requests会永久阻塞等待导致程序卡死。因此所有正式爬虫代码必须配置超时参数。get方法中的timeout参数用于设置超时时间单位为秒。当请求耗时超过设定时间仍未收到响应程序会主动抛出requests.exceptions.Timeout异常并终止请求。实战代码python运行import requests url https://httpbin.org/delay/5 # 设置超时时间为3秒目标接口延迟5秒返回数据会触发超时异常 try: # timeout3 代表3秒超时 resp requests.get(url, timeout3) print(resp.text) except requests.exceptions.Timeout: print(请求超时网络或服务器响应缓慢)原理解析timeout参数定义了从请求发送到数据接收完成的最大允许时长分为连接超时与读取超时单一数值代表总超时时间。代码中使用try...except异常捕获结构主动捕获超时异常避免程序崩溃这是工业级爬虫的基础容错规范。超时时间需根据业务场景合理设置常规网页请求建议设置为 5~10 秒大型文件下载可适当延长。四、二进制资源请求实战图片、文件下载前文提到resp.text适用于文本类数据而图片、音频、视频、压缩包等二进制资源必须使用resp.content属性读取。结合 GET 请求本节实现图片下载、文件保存的完整案例这也是爬虫中资源采集的常用场景。4.1 单张图片下载实战实战代码python运行import requests # 图片资源地址 img_url https://httpbin.org/image/jpeg # 发起GET请求 resp requests.get(img_url, timeout10) # 判断请求成功后将二进制数据写入本地文件 if resp.status_code 200: # 以二进制写入模式打开文件wb代表write binary with open(test_image.jpg, wb) as f: # 写入原始二进制数据 f.write(resp.content) print(图片下载完成) else: print(图片请求失败)原理解析图片属于非文本资源服务器返回的是原始字节流使用resp.text会强制解码为字符串造成文件损坏、无法打开因此必须使用resp.content获取字节数据。文件操作模式wbw表示覆盖写入b表示二进制模式二进制文件读写必须携带b标识否则会出现编码错误。with open()语句为 Python 推荐的文件读写写法执行完毕后自动关闭文件句柄避免资源泄露。4.2 大文件流式下载优化下载体积较大的文件时一次性读取全部resp.content会占用大量内存容易造成内存溢出。requests支持流式读取通过streamTrue参数开启分块加载配合迭代器逐块写入文件降低内存占用。实战代码python运行import requests file_url https://httpbin.org/stream/100 save_path stream_file.txt try: # 开启流式请求不一次性加载全部内容到内存 resp requests.get(file_url, streamTrue, timeout20) if resp.ok: with open(save_path, wb) as f: # 逐块迭代读取数据默认分块大小适配网络传输单元 for chunk in resp.iter_content(chunk_size1024): # 过滤空数据块 if chunk: f.write(chunk) print(大文件流式下载完成) except Exception as e: print(文件下载异常, e)原理解析streamTrue开启流式传输模式请求仅建立连接不会立即加载全部响应数据到内存。iter_content(chunk_size1024)按指定字节大小分块迭代数据示例中每块大小为 1024 字节1KB逐块读取并写入本地。该方案广泛应用于视频、压缩包、大型文档等资源下载是爬虫项目中优化内存占用的核心手段。五、requests 会话对象 Session 基础使用普通的requests.get()请求属于单次独立请求每一次请求都会重新建立连接、重新获取 Cookie无法维持登录状态、会话信息。而Session会话对象可以持久化 Cookie、保持 TCP 连接、复用请求上下文模拟浏览器连续访问多个页面的行为是实现登录态爬虫、连贯页面采集的核心工具。5.1 Session 对象基础特性自动存储服务器下发的 Cookie并在后续同一会话的请求中自动携带复用底层 TCP 连接提升连续请求的响应速度统一管理请求头、代理、超时等公共配置简化重复代码。5.2 基础会话请求实战实战代码python运行import requests # 1. 创建会话对象整个生命周期内共享Cookie与连接 session requests.Session() # 第一次请求服务器返回Cookie并由session自动保存 url1 https://httpbin.org/cookies/set/spider/123456 resp1 session.get(url1) print(第一次请求响应, resp1.text) # 第二次请求session自动携带上一步获取的Cookie url2 https://httpbin.org/cookies resp2 session.get(url2) print(第二次请求携带Cookie, resp2.text) # 关闭会话释放连接与资源 session.close()原理解析requests.Session()创建独立会话实例该实例独立于普通请求拥有专属的 Cookie 容器、连接池。第一个接口/cookies/set会向客户端下发自定义 Cookie会话对象自动接收并保存。访问/cookies接口查询当前请求携带的 Cookie可见上一步设置的 Cookie 已自动携带证明会话状态保持生效。session.close()用于主动关闭会话释放网络连接资源程序结束前建议执行该操作。5.3 会话对象设置全局请求参数对于同一会话下的多次请求可统一设置请求头、超时时间等参数无需在每一个get方法中重复传入简化代码结构python运行import requests session requests.Session() # 为整个会话设置全局超时时间 session.timeout 8 # 两次请求均自动继承全局超时配置 url_1 https://httpbin.org/get url_2 https://httpbin.org/headers resp1 session.get(url_1) resp2 session.get(url_2) print(resp1.status_code, resp2.status_code) session.close()六、异常捕获与健壮性优化网络请求属于 IO 密集型操作受网络波动、服务器状态、URL 合法性、反爬策略等多重因素影响极易出现各类异常。完善的异常捕获机制是爬虫稳定运行的保障本节梳理requests高频异常类型并搭建通用异常捕获模板。6.1 高频异常类型汇总表格异常类触发场景requests.exceptions.Timeout请求超时服务器响应缓慢或网络中断requests.exceptions.ConnectionError连接失败域名错误、服务器宕机、断网requests.exceptions.SSLErrorHTTPS 证书验证失败requests.exceptions.TooManyRedirects重定向次数过多陷入死循环跳转requests.exceptions.RequestException所有 requests 异常的父类通用捕获6.2 通用异常捕获模板该模板覆盖主流异常类型可作为所有requests请求的标准代码框架python运行import requests from requests.exceptions import Timeout, ConnectionError, SSLError, RequestException url https://www.baidu.com try: resp requests.get(url, timeout5) resp.raise_for_status() # 主动抛出4xx/5xx状态码异常 print(请求成功源码长度, len(resp.text)) except Timeout: print(异常请求超时) except ConnectionError: print(异常网络连接失败请检查URL与网络状态) except SSLError: print(异常HTTPS证书验证失败) except RequestException as e: print(f请求通用异常{str(e)})原理解析resp.raise_for_status()主动校验状态码若为 4xx、5xx 错误手动抛出异常避免程序继续执行无效逻辑。异常捕获顺序遵循子类在前父类在后原则优先捕获具体异常最后使用父类RequestException兜底。该模板可直接复用在所有爬虫请求代码中大幅提升程序容错能力。七、本章综合实战案例多页面数据采集结合本章所学的 GET 请求、参数拼接、超时设置、异常捕获、会话保持等知识点编写综合实战案例实现带分页的模拟数据采集整合全部核心技能。python运行import requests from requests.exceptions import RequestException # 基础配置 base_url https://httpbin.org/get session requests.Session() session.timeout 6 # 循环采集1-3页数据 for page in range(1, 4): params { page_num: page, source: spider_demo } try: resp session.get(base_url, paramsparams) resp.raise_for_status() print(f 第{page}页数据 ) print(resp.text) except RequestException as e: print(f第{page}页采集失败错误信息{e}) session.close() print(多页面采集任务执行完毕)案例说明使用Session维持会话状态保证分页请求上下文连贯通过循环 字典参数实现分页功能符合真实分页爬虫的开发逻辑全局设置超时时间搭配统一异常捕获保证程序连续运行该案例完整复刻了常规列表页爬虫的请求逻辑可直接迁移至真实网站使用。