
最近经常看到一个问题为什么很多人学 Python 学了大半年还是只会 print(Hello World)原因多数不是不努力而是方向错了。一上来就啃语法书、刷理论视频学了 list、dict、tuple却不知道这些东西在爬虫和数据分析里到底怎么用。等到真要写一个抓取脚本、处理一份 CSV脑子还是空的。这次我们换一种思路来聊 Python不按教材章节走而是把爬虫和数据分析作为主线需要什么语法就补什么语法。从环境配置、基础语法、请求库使用、HTML 解析、数据清洗到可视化一条线走完。文章里会给出可直接运行的代码、完整的测试步骤和常见报错排查清单读完你至少能自己写一个简单的数据采集和处理脚本而不是停留在“看得懂、写不出”的阶段。先说明一下这篇内容的适用范围零基础、想转数据相关岗位、想用 Python 处理重复性工作的读者都适合。如果你已经能熟练写爬虫或用 pandas 做分析这篇对你来说偏基础可以重点看后面的排查清单和最佳实践部分。接下来我们直接开工。1. Python 爬虫与数据分析到底学什么很多人对 Python 的学习路径有误解以为要先学完所有语法才能开始做项目。实际上爬虫和数据分析用到的 Python 知识是高度收敛的。从实际工作角度看爬虫需要这几块能力发送 HTTP 请求用 requests 库获取网页内容。解析 HTML用 BeautifulSoup、lxml、re 从网页中提取目标信息。数据存储把抓到的数据保存为 CSV、Excel、JSON或写入数据库。应对反爬机制处理请求头、Cookie、IP 频率限制、验证码等注意这里要强调合法授权和遵守 robots 协议。数据分析需要这几块能力数据加载用 pandas 读取 CSV、Excel、数据库。数据清洗处理缺失值、重复值、异常值转换数据类型。数据聚合groupby、pivot_table 做分组统计。数据可视化用 matplotlib、seaborn、pyecharts 把结果画成图表。所以你真正要掌握的 Python 基础并不复杂变量与数据类型、列表与字典、条件判断与循环、函数定义、文件读写、异常处理。这些基础内容配合项目实际操作几周时间是可以掌握的用不着花几个月死磕。下面给出一个完整的路线图按一周时间安排每天 2 到 3 小时可以比较从容地走完。阶段学习内容目标第 1 天Python 环境安装、IDE 配置、基础语法能独立运行脚本理解变量、数据类型、条件与循环第 2 天函数、文件读写、异常处理、常用内置库能写一个带日志和异常捕获的脚本第 3 天requests 库、HTTP 基础、请求头构造能抓取一个静态页面的 HTML第 4 天BeautifulSoup 解析、CSS 选择器、正则表达式能提取列表页中的标题、链接、价格等信息第 5 天pandas 数据加载、数据清洗、数据筛选能把爬虫结果保存为 DataFrame 并清洗第 6 天matplotlib 可视化、分组聚合统计能生成柱状图、折线图、饼图第 7 天综合实战抓取公开数据并分析完成一个“爬虫 清洗 可视化”闭环这个安排的核心思路是先建立完整链路再逐步加深细节。哪怕第一版代码写得很粗糙也比只学语法不写项目要有效得多。2. 环境准备与 Python 安装在开始写代码之前先把 Python 环境装好。2.1 Windows 安装步骤去 Python 官网下载 Windows 安装包。这里有几个关键点安装时务必勾选 Add Python to PATH否则命令行里找不到 python 命令。选择 Customize installation确认 pip 被勾选。安装完成后打开 CMD 或 PowerShell执行python --version pip --version如果输出版本号说明安装成功。如果提示“python 不是内部或外部命令”一般是 PATH 没配好重新安装并勾选 Add Python to PATH或者手动把 Python 安装目录加入系统环境变量。2.2 macOS 安装步骤macOS 自带 Python 2但早就停止维护了。建议使用 Homebrew 安装 Python 3brew install python3安装完成后验证python3 --version pip3 --version注意 macOS 上可能同时存在系统 Python 和 Homebrew Python建议在项目里使用虚拟环境隔离避免依赖冲突。2.3 Linux 安装步骤Ubuntu / Debian 系使用 apt 安装sudo apt update sudo apt install python3 python3-pip -yCentOS / RHEL 系使用 yum 或 dnfsudo yum install python3 python3-pip -y2.4 pip 换源与常用命令国内直连 PyPI 下载依赖经常很慢建议把 pip 源换成国内镜像。以清华源为例pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple配置完成后安装依赖的速度会明显提升。常用命令先记住这几个pip install 包名 # 安装包 pip uninstall 包名 # 卸载包 pip list # 查看已安装包 pip show 包名 # 查看包详情 pip freeze requirements.txt # 导出当前环境依赖2.5 开发环境推荐入门阶段推荐 VS Code轻量、配置简单、插件生态好。需要装以下插件Python微软官方插件Pylance代码补全和类型检查Jupyter如果要做数据分析建议直接使用 Notebook也可以用 PyCharm Community Edition社区版免费对新手更友好但启动和索引速度比 VS Code 慢一些。安装完成后创建一个测试文件 test.py写入print(Hello Python)在终端运行python test.py能看到输出就说明整个链路已经通了。3. Python 基础语法只学够用的部分爬虫和数据分析中Python 基础语法不需要学得面面俱到。下面按优先级列出必须掌握的内容所有代码都可以直接复制运行。3.1 变量与数据类型Python 是动态类型语言变量不需要声明类型直接赋值即可。name Python # 字符串 version 3.12 # 浮点数 is_ready True # 布尔值 skills [爬虫, 数据分析] # 列表 info {name: Python, type: 语言} # 字典爬虫里最常用的是列表和字典。列表用于存储多个结果字典用于存储单条记录的字段。比如抓取一条商品信息用字典比较合适item { title: Python编程从入门到实践, price: 59.80, shop: 人民邮电出版社 }3.2 条件判断与循环条件判断用于过滤数据比如只保留价格大于 50 的商品循环用于遍历列表比如逐个处理每个商品的 URL。prices [19.9, 59.8, 45.0, 99.0] for price in prices: if price 50: print(f价格较高{price}) else: print(f价格较低{price})3.3 函数函数用于封装重复逻辑。比如写一个发送请求的函数后续所有爬虫脚本都可以复用import requests def fetch_page(url, headersNone, timeout10): 发送 GET 请求返回响应对象 try: response requests.get(url, headersheaders, timeouttimeout) response.raise_for_status() response.encoding response.apparent_encoding return response except requests.RequestException as e: print(f请求失败: {e}) return None3.4 文件读写爬虫抓到的数据要保存到本地数据分析前也要从文件读取数据。基础的文件读写# 写入文件 with open(output.txt, w, encodingutf-8) as f: f.write(Hello Python\n) # 读取文件 with open(output.txt, r, encodingutf-8) as f: content f.read() print(content)注意编码问题Windows 下默认编码可能不是 UTF-8建议读写文件时都显式指定encodingutf-8。3.5 异常处理爬虫运行中常见网络超时、连接拒绝、解析失败等问题。用 try-except 包裹可能出错的代码是保证脚本稳定运行的关键try: result 10 / 0 except ZeroDivisionError as e: print(f捕获异常: {e}) finally: print(无论如何都会执行)Python 基础学到这个程度已经足够支撑你进入爬虫和数据分析的项目实践了。不要在这里恋战先写项目遇到不懂的语法再回头查效果更好。4. 爬虫入门requests 请求库实战爬虫的第一步是拿到网页内容。requests 是 Python 最常用的 HTTP 请求库接口设计简洁上手成本很低。4.1 安装 requestspip install requests4.2 发送 GET 请求以请求一个公开的测试页面为例import requests url https://httpbin.org/get response requests.get(url, timeout10) print(response.status_code) # 状态码 print(response.text[:500]) # 响应内容前500字符运行后你会看到类似这样的输出200 { args: {}, headers: { Accept: */*, Host: httpbin.org, User-Agent: python-requests/2.31.0 }, origin: 你的IP地址, url: https://httpbin.org/get }如果返回 200说明请求成功。如果返回 403 或 418说明目标服务器有反爬策略需要构造请求头。4.3 构造请求头很多网站会检查 User-Agent默认的python-requests很容易被识别。构造一个浏览器常见的请求头import requests 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, Accept-Language: zh-CN,zh;q0.9 } url https://httpbin.org/get response requests.get(url, headersheaders, timeout10) print(response.json()[headers][User-Agent])从返回结果可以看到服务器收到的 User-Agent 已经变成了浏览器的标识。4.4 处理 Cookie 与 Session如果需要保持登录状态建议使用 requests.Session。Session 会保存 Cookie 信息后续请求自动携带import requests session requests.Session() # 第一次请求服务器设置 Cookie session.get(https://httpbin.org/cookies/set?namepython) # 第二次请求自动携带 Cookie response session.get(https://httpbin.org/cookies) print(response.text)注意使用 Session 抓取需要登录的数据时要确保你有权限访问这些数据不要绕过登录逻辑抓取非公开信息。4.5 请求频率控制批量抓取时请求过快容易触发反爬机制也会给目标服务器造成压力。建议每次请求之间加延时import time import requests urls [https://httpbin.org/get] * 5 headers {User-Agent: Mozilla/5.0} for i, url in enumerate(urls): response requests.get(url, headersheaders, timeout10) print(f第 {i1} 次请求完成状态码: {response.status_code}) time.sleep(1) # 每次请求间隔1秒这是爬虫的基本礼仪也是降低被封风险的有效手段。更严格的频率限制、代理池、验证码处理、滑块等反爬问题属于进阶内容需要结合具体网站和合规要求来处理这里不展开。5. HTML 解析BeautifulSoup 从页面提取数据拿到 HTML 之后下一步是提取目标信息。BeautifulSoup 是最常用的解析库配合 lxml 解析器效率更高。5.1 安装 BeautifulSoup 和 lxmlpip install beautifulsoup4 lxml5.2 基础解析流程from bs4 import BeautifulSoup html html body div classitem>import csv import requests from 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://books.toscrape.com/ response requests.get(url, headersheaders, timeout10) if response.status_code 200: response.encoding utf-8 soup BeautifulSoup(response.text, lxml) books [] for article in soup.select(article.product_pod): title article.select_one(h3 a).get(title) price article.select_one(p.price_color).text books.append({title: title, price: price}) print(f抓取到 {len(books)} 本图书) with open(books.csv, w, encodingutf-8, newline) as f: writer csv.DictWriter(f, fieldnames[title, price]) writer.writeheader() writer.writerows(books) print(数据已保存到 books.csv) else: print(f请求失败状态码: {response.status_code})books.toscrape.com 是一个专门用于爬虫练习的公开网站数据抓取权限清晰适合入门测试。实际抓取其他网站时要先检查 robots.txt 和网站使用条款确认有权限抓取。5.4 翻页抓取列表页通常有多页翻页抓取的核心是找到 URL 规律。很多网站的翻页 URL 规则是?page2、?page3import time import requests from bs4 import BeautifulSoup headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } all_books [] for page in range(1, 4): url fhttps://books.toscrape.com/catalogue/page-{page}.html response requests.get(url, headersheaders, timeout10) if response.status_code ! 200: print(f第 {page} 页请求失败) continue soup BeautifulSoup(response.text, lxml) for article in soup.select(article.product_pod): title article.select_one(h3 a).get(title) price article.select_one(p.price_color).text all_books.append({title: title, price: price}) print(f第 {page} 页完成当前累计 {len(all_books)} 条) time.sleep(1) print(f全部完成共 {len(all_books)} 条数据)这个示例演示了批量任务的雏形循环请求、逐步解析、统一保存。后面可以扩展到更大的数据集。6. pandas 数据清洗与分析爬虫抓回来的数据往往是脏的比如价格里有货币符号、日期格式不统一、存在缺失值。这些都需要用 pandas 来处理。6.1 安装 pandaspip install pandas6.2 读取 CSV 数据用上一节的 books.csv 为例import pandas as pd df pd.read_csv(books.csv) print(df.head()) print(df.info())head()显示前 5 行info()显示每列的数据类型和非空数量。6.3 数据清洗去除货币符号并转换类型价格列是£51.77这样的格式需要去掉货币符号并转为浮点数import pandas as pd df pd.read_csv(books.csv) # 去掉货币符号转为浮点数 df[price] df[price].str.replace(£, ).astype(float) print(df.dtypes) print(df[price].describe())describe()会输出价格列的统计信息平均值、标准差、最小值、最大值等。到这里数据已经可以进行基础分析了。6.4 处理缺失值和重复值真实数据中缺失值和重复值非常常见import pandas as pd # 示例数据 data { title: [A, B, C, A], price: [10.5, None, 30.2, 10.5] } df pd.DataFrame(data) # 查看缺失值 print(df.isnull().sum()) # 删除包含缺失值的行 df_clean df.dropna() # 删除重复行 df_clean df_clean.drop_duplicates() print(df_clean)对于缺失值除了直接删除还可以用均值、中位数或前向填充来处理。具体用哪种方式取决于业务场景# 用均值填充 df[price] df[price].fillna(df[price].mean()) # 用中位数填充 df[price] df[price].fillna(df[price].median())6.5 数据筛选与排序import pandas as pd df pd.read_csv(books.csv) df[price] df[price].str.replace(£, ).astype(float) # 筛选价格大于 30 的图书 expensive_books df[df[price] 30] print(expensive_books) # 按价格排序 sorted_books df.sort_values(price, ascendingFalse) print(sorted_books.head(5))6.6 分组统计如果你的数据中有一个分类列比如图书类别、商品分类可以按类别做分组统计import pandas as pd data { category: [编程, 编程, 数据, 数据, 数据], price: [59.8, 79.0, 89.0, 45.0, 120.0] } df pd.DataFrame(data) # 按分类统计数量和平均价格 result df.groupby(category).agg( count(price, count), avg_price(price, mean) ) print(result)输出count avg_price category 编程 2 69.4 数据 3 84.7这就是数据分析中非常高频的操作。实际工作中你还会用到pivot_table、merge、concat等操作核心逻辑都是类似的先加载数据再清洗再聚合。7. matplotlib 数据可视化数据清洗完成后用图表展示结果会更直观。matplotlib 是 Python 最基础的可视化库。7.1 安装 matplotlibpip install matplotlib7.2 绘制折线图和柱状图import matplotlib.pyplot as plt import pandas as pd # 准备数据 data { month: [1月, 2月, 3月, 4月, 5月, 6月], sales: [120, 150, 130, 180, 160, 210] } df pd.DataFrame(data) # 折线图 plt.figure(figsize(8, 5)) plt.plot(df[month], df[sales], markero, linestyle-) plt.title(月度销售额趋势) plt.xlabel(月份) plt.ylabel(销售额万元) plt.grid(True, alpha0.3) plt.show() # 柱状图 plt.figure(figsize(8, 5)) plt.bar(df[month], df[sales], colorskyblue) plt.title(月度销售额对比) plt.xlabel(月份) plt.ylabel(销售额万元) plt.show()7.3 中文显示问题matplotlib 默认字体不支持中文图表中会出现方框。解决方式是手动指定中文字体import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, PingFang SC] plt.rcParams[axes.unicode_minus] False不同系统对应的字体名称不同。Windows 下用SimHei或Microsoft YaHeimacOS 下可以用PingFang SCLinux 下需要先安装中文字体。7.4 画布保存写完图表直接显示之外建议保存为图片文件便于后续使用plt.savefig(sales.png, dpi150, bbox_inchestight)dpi控制清晰度bbox_inchestight会自动裁剪多余空白。8. 综合实战从抓取到分析的全流程到这里我们把爬虫、数据清洗、可视化串成一条完整链路。用一个实际场景来演示抓取公开图书网站的图书信息清洗价格数据统计价格分布并生成直方图。8.1 抓取数据import requests from bs4 import BeautifulSoup import pandas as pd headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } url https://books.toscrape.com/ response requests.get(url, headersheaders, timeout10) soup BeautifulSoup(response.text, lxml) books [] for article in soup.select(article.product_pod): title article.select_one(h3 a).get(title) price article.select_one(p.price_color).text books.append({title: title, price: price}) df pd.DataFrame(books) print(f抓取到 {len(df)} 条数据)8.2 清洗数据# 清洗价格列 df[price] df[price].str.replace(£, ).astype(float) # 检查缺失值 print(df.isnull().sum()) print(df.head())8.3 分析价格分布import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, PingFang SC] plt.rcParams[axes.unicode_minus] False # 直方图 plt.figure(figsize(10, 6)) plt.hist(df[price], bins10, edgecolorblack, alpha0.7) plt.title(图书价格分布) plt.xlabel(价格英镑) plt.ylabel(数量) plt.grid(True, alpha0.3) plt.show() # 输出统计信息 print(df[price].describe())运行结果会显示价格均值、中位数、最大最小值以及一张价格分布直方图。到这里你已经完成了一个爬虫 数据分析 可视化的最小闭环。这个流程扩展一下完全可以应用到商品比价、舆情分析、市场调研等场景。9. 常见问题与排查方法以下是 Python 学习和实践中最常见的报错与问题直接对照排查。问题现象可能原因排查方式解决方案pip 不是内部或外部命令安装时没有勾选 Add Python to PATH检查环境变量重新安装并勾选或手动添加 PATHModuleNotFoundError: No module named requests依赖未安装执行pip list查看执行pip install requests安装依赖速度极慢默认连接 PyPI 官方源观察下载进度配置国内镜像源运行脚本中文乱码文件编码不是 UTF-8检查文件编码在文件开头添加# -*- coding: utf-8 -*-爬虫请求返回 403请求头被服务器识别查看响应内容构造浏览器 User-Agent添加 Cookie爬虫请求超时网络问题或目标服务器响应慢检查网络连接增加 timeout设置重试机制BeautifulSoup 解析不到内容选择器写错或页面是动态渲染打印 HTML 检查结构审查选择器动态内容用 Selenium 或找接口pandas 读取 CSV 乱码文件编码与读取编码不一致查看原文件编码指定encodingutf-8或encodinggbkmatplotlib 中文显示为方块默认字体不支持中文打印可用字体列表设置font.sans-serif为中文字体ValueError: could not convert string to float字符串中包含非数字字符打印原始值用str.replace清理符号后再转换10. 学习建议与避坑指南最后给几条实操建议这些是最容易踩坑的地方。10.1 不要先刷完所有语法再做项目Python 的语法工具是“够用就行”的。你只需要掌握变量、列表、字典、循环、判断、函数、文件读写和异常处理就可以开始写爬虫。其余语法在项目中遇到时再查即可。先把“爬虫到分析”的闭环跑通再逐步补充细节节奏更健康。10.2 用虚拟环境隔离项目依赖不同项目可能依赖不同版本的库直接全部装到全局环境容易冲突。建议每个项目创建独立虚拟环境python -m venv venv激活虚拟环境Windowsvenv\Scripts\activatemacOS / Linuxsource venv/bin/activate之后再执行 pip install依赖只会安装到当前虚拟环境里不会污染全局。10.3 爬虫必须注意合规性抓取数据前先检查目标网站的 robots.txt确认允许抓取的范围。只抓取公开、合法授权的数据不抓取需要登录才能访问的非公开信息不绕过验证码、不放大请求频率。如果数据是用于商业用途务必确认目标网站的使用条款和版权要求。批量请求要控制频率避免对目标服务器造成压力。10.4 建立自己的代码库把常用的功能写成函数分模块保存。比如 requests 请求函数、CSV 保存函数、数据清洗函数放到独立的.py文件里。下次做新项目时直接导入不用重新写# utils.py import requests def fetch_page(url, headersNone, timeout10): try: response requests.get(url, headersheaders, timeouttimeout) response.raise_for_status() response.encoding response.apparent_encoding return response except requests.RequestException: return None调用时from utils import fetch_page response fetch_page(https://books.toscrape.com/, headers{User-Agent: Mozilla/5.0}) if response: print(response.status_code)这是一套比较轻的“工具箱”思路随着实践增加逐步扩充你的开发效率会有明显提升。10.5 先小批量验证再全量运行无论是爬虫还是数据清洗第一次运行时先用小批量数据验证流程确认输出正确后再放大规模。批量抓取时建议打印进度日志方便定位失败位置for i, url in enumerate(urls): print(f[{i1}/{len(urls)}] 正在处理: {url})这样跑挂了你能立刻知道是在哪一步出的问题。遇到失败请求可以用 try-except 捕获并记录到日志文件重试策略放到日志清晰之后再设计。11. 总结与下一步从环境配置、基础语法、requests 请求、BeautifulSoup 解析、pandas 清洗到 matplotlib 可视化这条路已经完整走了一遍。最值得你记住的是Python 学习要以项目为主线不要孤立地学语法。爬虫和数据分析是很好的入门方向因为两者结合能让你快速看到“从网上拿数据到出分析结果”的完整效果正反馈很强。下一步建议做这三件事把文章里的代码全部手动敲一遍不要复制粘贴。敲的过程会暴露语法细节比如缩进、冒号、引号这些都是只看不写容易忽略的。找一个你熟悉的公开网站非登录、非敏感信息尝试自己写一个抓取脚本用 pandas 做一次简单统计。把数据可视化中常用的图表类型折线图、柱状图、饼图、直方图都画一遍理解不同图表适合表达什么信息。爬虫这个方向从静态页面到动态渲染、从单页到分布式、从请求到反爬对抗越往后越深数据分析方向从 pandas 到 numpy、从描述统计到建模预测也能不断延伸。但所有进阶能力都建立在“能把一个完整的小项目跑通”这个基础上。先完成最小闭环再决定往哪个方向深入这套方法对大多数零基础学习者来说是更不容易放弃的路线。