前言经过前面章节学习我们已掌握环境配置、requests库使用、GET/POST 请求、请求头伪装、网页编码处理五大核心基础能力。本章不再单独讲解新语法而是将所有知识点融会贯通通过综合实战项目、通用代码模板、全场景排错手册、开发规范四大板块把零散知识点落地为可直接用于生产的爬虫代码。同时梳理基础爬虫常见坑点、优化技巧帮助你完成从 “会写代码” 到 “会做项目” 的过渡。本章参考链接requests 完整 API 文档https://docs.python-requests.org/HTTP 状态码速查https://httpstatuses.com/编码识别工具https://chardet.readthedocs.io/一、通用标准爬虫模板可直接复用整合会话对象、UA 轮换、完整请求头、随机延时、自动编码探测、异常捕获打造通用基础爬虫模板适用于 90% 以上静态网页、公开接口采集场景。1.1 完整版通用模板python运行import requests import random import time import chardet from requests.exceptions import RequestException, Timeout, ConnectionError # 全局配置区按需修改 # UA池可自行扩充 UA_POOL [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0 Safari/537.36, Mozilla/5.0 (Windows NT 10.0; Win64; x64) Edg/126.0.0.0 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) Safari/605.1.15 ] # 基础请求头固定字段 BASE_HEADERS { Referer: , Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9, Accept-Encoding: gzip, deflate, br, Cache-Control: max-age0, Upgrade-Insecure-Requests: 1 } # 请求超时时间 TIMEOUT 8 # 随机延时区间单位秒 SLEEP_MIN 1 SLEEP_MAX 3 # # 创建全局会话对象 session requests.Session() def get_random_ua() - str: 随机获取UA return random.choice(UA_POOL) def get_page_html(url: str) - str: 通用网页请求函数 :param url: 目标网址 :return: 解码后的网页源码失败返回空字符串 # 拼接当前请求头 current_headers BASE_HEADERS.copy() current_headers[User-Agent] get_random_ua() session.headers current_headers try: # 发起请求 resp session.get(url, timeoutTIMEOUT) resp.raise_for_status() # 主动抛出4xx/5xx异常 # 自动探测编码并解码 detect_result chardet.detect(resp.content) charset detect_result.get(encoding, utf-8) html resp.content.decode(charset, errorsignore) return html except Timeout: print(f【异常】{url} 请求超时) except ConnectionError: print(f【异常】{url} 网络连接失败) except RequestException as e: print(f【异常】{url} 未知请求错误{str(e)}) return def close_session(): 关闭会话释放资源 session.close() if __name__ __main__: # 待采集网址列表 target_urls [ https://httpbin.org/get, https://httpbin.org/headers, https://httpbin.org/cookies ] for idx, url in enumerate(target_urls, 1): print(f\n 开始采集第{idx}个页面{url} ) page_content get_page_html(url) if page_content: print(页面片段内容, page_content[:300]) # 随机延时 time.sleep(random.uniform(SLEEP_MIN, SLEEP_MAX)) close_session() print(\n 全部采集任务执行完成 )1.2 模板使用说明配置区修改仅需修改UA_POOL、Referer、目标 URL 列表即可快速适配新站点核心能力自动换 UA、完整请求头伪装、随机延时、自动编码、全类型异常捕获适用场景新闻列表、资讯站点、文档页面、公开接口等静态资源采集。二、实战案例 1模拟登录 数据采集POSTSession 综合结合 POST 表单提交、Session 会话、Cookie 保持、请求伪装实现账号登录后采集专属页面是爬虫高频业务场景。python运行import requests import random import time from requests.exceptions import RequestException # 全局配置 UA_POOL [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0 Safari/537.36 ] HEADERS { Referer: https://httpbin.org/, Accept-Language: zh-CN,zh;q0.9 } TIMEOUT 6 # 登录信息 LOGIN_URL https://httpbin.org/post LOGIN_DATA { username: test_spider, password: 123456abc } # 登录后访问的页面 INDEX_URL https://httpbin.org/cookies def login_and_crawl(): session requests.Session() headers HEADERS.copy() headers[User-Agent] random.choice(UA_POOL) session.headers headers try: # 第一步POST登录 print(正在执行登录请求...) login_resp session.post(LOGIN_URL, dataLOGIN_DATA, timeoutTIMEOUT) login_resp.raise_for_status() print(登录成功返回数据, login_resp.text[:200]) time.sleep(random.uniform(1, 2)) # 第二步登录态访问页面 print(\n正在访问个人页面...) index_resp session.get(INDEX_URL, timeoutTIMEOUT) index_resp.raise_for_status() print(页面数据, index_resp.text) except RequestException as e: print(f任务失败{str(e)}) finally: session.close() if __name__ __main__: login_and_crawl()案例要点登录使用POST data表单传参符合传统网页登录逻辑Session自动保存登录 Cookie全程维持登录状态分步请求 延时模拟真人操作行为。三、实战案例 2文件资源下载二进制流处理整合 GET 请求、流式下载、请求伪装实现大文件 / 图片批量下载严格区分二进制数据与文本数据处理逻辑。python运行import requests import random import time UA Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0 Safari/537.36 HEADERS {User-Agent: UA} TIMEOUT 15 # 图片地址与保存名称映射 img_list [ (https://httpbin.org/image/jpeg, pic1.jpg), (https://httpbin.org/image/png, pic2.png) ] def download_file(url, save_name): try: # 开启流式下载降低内存占用 resp requests.get(url, headersHEADERS, streamTrue, timeoutTIMEOUT) resp.raise_for_status() # 二进制模式写入文件不做任何解码 with open(save_name, wb) as f: for chunk in resp.iter_content(chunk_size1024): if chunk: f.write(chunk) print(f【成功】{save_name} 下载完成) except Exception as e: print(f【失败】{save_name} 下载异常{str(e)}) if __name__ __main__: for url, name in img_list: download_file(url, name) time.sleep(2) print(所有文件下载完毕)四、基础爬虫全场景排错手册汇总前面所有章节的高频报错、现象、原因与解决方案作为开发常备查阅清单。4.1 状态码类问题表格状态码现象解决方案403 Forbidden拒绝访问1. 替换默认 UA2. 补充 Referer3. 增加请求延时4. 复刻完整浏览器请求头404 Not Found页面不存在核对 URL 地址、检查接口路径、判断页面是否已删除301/302 重定向页面跳转关闭allow_redirectsFalse手动处理或直接使用默认自动跳转500/502/503服务器错误稍后重试、增加延时、检查接口参数格式4.2 编码乱码类问题中文变成????/□□□网页为 GBK/GB2312手动指定resp.encodinggbk或content.decode(gbk)自动编码为ISO-8859-1响应头 / HTML 无编码声明使用chardet自动探测解码抛出UnicodeDecodeError解码时添加errorsignore忽略非法字符。4.3 请求异常类问题Timeout 请求超时延长timeout时间、检查本地网络、更换 IP 重试ConnectionError 连接失败域名错误、网站宕机、IP 被封禁SSLError 证书错误请求添加参数verifyFalse关闭 HTTPS 证书校验。4.4 POST 传参类问题参数提交后服务器接收为空分清data表单和jsonJSON 接口不可混用登录请求失败核对字段名、补充 Referer、使用 Session 携带前置 Cookie。五、爬虫开发代码规范基础阶段强制遵守规范代码可以降低出错概率、提升可读性适合个人开发与团队协作。请求规范所有请求必须设置timeout防止程序永久阻塞正式项目禁止使用 requests 默认 UA必须配置浏览器 UA高频采集务必添加随机延时拒绝毫秒级连续请求。编码规范静态网页优先手动指定编码未知编码使用chardet探测图片、视频等二进制资源永远使用resp.content不执行 decode异常规范循环采集、批量任务必须添加异常捕获单条失败不影响整体优先捕获具体异常Timeout、ConnectionError最后用通用异常兜底。资源规范使用Session会话时程序结束务必执行close()释放网络连接文件读写统一使用with语句自动关闭文件句柄。六、本阶段学习总结与后续学习方向6.1 基础阶段知识复盘至此Python 基础爬虫全系列内容正式完结你已掌握完整基础技术栈环境搭建Python pip 库安装、镜像源配置核心工具requests库全用法GET/POST、Session、文件下载、流式请求协议知识HTTP 基础、请求头、状态码、幂等性反爬基础UA 伪装、Referer、Cookie、行为模拟数据处理网页编码、乱码修复、自动编码探测工程能力异常处理、代码模板、项目规范、排错思路。基于以上内容你可以独立完成普通静态网页采集、表单登录爬虫、图片 / 文件下载、公开 API 接口数据获取等常规任务。6.2 进阶学习路线下一阶段推荐内容基础学完后可按照以下路线持续深耕爬虫技术网页解析BeautifulSoup、XPath、CSS 选择器提取网页指定文本、链接、图片地址动态网页爬虫Selenium、Playwright解决 JS 动态渲染、Ajax 加载页面进阶反爬绕过代理 IP、Cookie 池、验证码识别、JS 逆向框架实战Scrapy 分布式爬虫、Scrapy-Redis数据存储MySQL、MongoDB、CSV/Excel 数据持久化。
网站建设
高端定制
企业官网