尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

零基础学Python:从环境搭建到爬虫与数据分析实战

零基础学Python:从环境搭建到爬虫与数据分析实战 关于 Python 学习网上最不缺的就是资料但最缺的是一条清晰的路线。很多零基础的读者下载了 Python、收藏了一堆教程结果今天看变量、明天看函数后天又跑去学 Django来回横跳了大半个月连一个完整的爬虫都写不出来。这篇文章会以“Python 基础 → 网络爬虫 → 数据分析”为主线整理一份可以直接照着执行的路线并从环境搭建开始逐步带你写出一个能抓网页、能存数据、能出图表的完整项目。无论你是想转行做数据相关的工作还是准备把 Python 当作自动化办公的工具这条路线都值得参考。本文适合完全没有编程经验的小白也适合学过语法但缺少实战项目的读者。你会掌握几个关键能力独立安装和配置 Python 环境掌握变量、函数、文件操作等核心语法用 requests BeautifulSoup 编写爬虫抓取网页数据再使用 pandas matplotlib 完成数据清洗、统计和可视化。这套技能组合在目前的企业招聘和日常工作中出现频率非常高也是 Python 生态里最容易形成正反馈的学习方向。1. 为什么把爬虫和数据分析放在一起学先回答一个很多新手都会问的问题Python 能做的事情那么多Web 开发、自动化运维、人工智能、量化交易为什么第一站要选爬虫和数据分析原因是这两个方向能最快形成“输入 → 处理 → 输出”的完整闭环。爬虫负责获取数据相当于把外部世界的信息变成结构化文件数据分析负责处理这些数据从中得出有价值的结论。整个过程都用 Python 实现语法覆盖面广学习过程中你会自然接触到字符串处理、列表与字典、循环、函数、异常处理、文件读写、第三方库安装这些核心知识点而且每完成一步都能看到实际成果。从就业和实际应用的角度来看数据分析相关岗位对 Python 的要求通常集中在三块数据采集能力、数据清洗能力、数据可视化能力。爬虫解决第一块pandas 解决第二块matplotlib 解决第三块。把这套流程走通之后再回头看 Python 的高级语法、面向对象、装饰器、多线程理解成本会低很多。反过来如果一上来就啃编程语言底层原理很容易在枯燥的概念里失去动力。还有一个更现实的原因这个学习路线对电脑配置要求低不需要准备服务器不需要安装大型开发工具一台普通笔记本就足够。接下来就从环境搭建开始先把基础打牢。2. 环境搭建与工具准备很多初学者学 Python 学的不是语法而是环境配置。不同操作系统、不同 Python 版本、不同 IDE 的组合会让新手眼花缭乱。下面按照最常见的场景逐步说明。2.1 Python 解释器的安装Python 是一个解释型语言代码需要由解释器逐行执行。所以第一步是在电脑上安装 Python 解释器。Windows 用户建议直接到 Python 官网下载安装包。安装时有一个非常关键的勾选项Add Python to PATH一定要勾选。这个选项会把 Python 命令自动加入系统环境变量否则后续在命令行里执行python会提示“不是内部或外部命令”。如果安装时忘记勾选也可以手动添加环境变量但远不如一开始勾选省事。macOS 用户推荐使用 Homebrew 安装也可以从官网下载 pkg 安装包。Linux 用户建议使用系统包管理器安装不过要留意部分 Linux 发行版自带的是 Python 2 或者较旧的 Python 3 版本安装后建议用python3 --version确认一下。版本选择方面目前主流是 Python 3.10 到 3.12 之间的版本。新版语法更友好第三方库的兼容性也更好。不建议选择 Python 2.x这个版本已经停止维护教程和第三方库基本都不会再兼容。安装完成后打开命令行工具执行下面命令验证python --version如果输出类似Python 3.10.12的信息说明安装成功。如果没有输出或者提示命令找不到需要回到上一步检查环境变量配置。2.2 IDE 选择与 VSCode 配置IDE 的选择会影响学习体验。对新手来说VSCode 是当前性价比最高的选择免费、轻量、插件生态丰富。PyCharm 功能强大但社区版缺少部分专业功能专业版需要付费对刚入门的读者来说有些过重。VSCode 安装 Python 插件后就具备了代码补全、语法检查、调试等核心能力。在 VSCode 的扩展市场搜索Python安装微软官方发布的插件即可。安装完成后按下Ctrl Shift PmacOS 是Cmd Shift P输入Python: Select Interpreter选择刚才安装的 Python 解释器。然后新建一个文件命名为hello.py写入下面的代码# 文件路径hello.py print(Hello, Python!)按F5或者点击右上角的运行按钮下方终端会输出Hello, Python!看到这个输出说明开发环境已经打通。后面的所有代码都可以在 VSCode 里编写和运行。2.3 虚拟环境与依赖安装Python 项目通常依赖很多第三方库。不同项目可能依赖同一个库的不同版本如果全部安装到全局环境很容易出现版本冲突。虚拟环境就是为每个项目单独创建一个隔离的 Python 环境这是工程开发的基本习惯建议从第一天就开始使用。在项目根目录下打开终端执行python -m venv venv这条命令会在当前目录生成一个venv文件夹。接下来激活虚拟环境Windows 执行venv\Scripts\activatemacOS / Linux 执行source venv/bin/activate激活后命令行前面会出现(venv)前缀。后续使用pip install安装的包都会进入这个虚拟环境不会影响系统全局。当项目不需要时可以直接删除venv文件夹或者执行deactivate退出环境。本文实战项目需要安装以下依赖在虚拟环境中统一执行pip install requests beautifulsoup4 pandas matplotlib openpyxlrequests发送 HTTP 请求获取网页内容。beautifulsoup4解析 HTML提取目标数据。pandas读取、清洗、统计分析数据。matplotlib绘制图表。openpyxlpandas 读写 Excel 文件时的底层引擎。依赖安装速度较慢时可以切换到国内镜像源这里提供一个通用做法pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests beautifulsoup4 pandas matplotlib openpyxl3. Python 核心语法速览爬虫和数据分析项目虽然会用到大量第三方库但底层逻辑仍然是 Python 基础语法。花半小时把这部分内容过一遍后面看代码就不会发怵。3.1 变量与四大常用数据类型Python 定义变量不需要声明类型直接赋值即可。字符串、整数、浮点数、布尔值是最基础的四种类型。name Python # 字符串 version 3.10 # 浮点数 year 2025 # 整数 is_popular True # 布尔值 print(name, version, year, is_popular)爬虫和数据分析中接触最多的数据结构是列表、字典、元组和集合。列表用方括号表示可以存储一组有序数据字典用花括号表示以键值对形式存储数据。# 列表存储电影评分 scores [9.7, 9.6, 9.5, 9.4] # 字典存储一部电影的完整信息 movie { title: 肖申克的救赎, year: 1994, rating: 9.7, countries: [美国] } print(movie[title]) print(scores[0])列表通过下标访问元素下标从 0 开始字典通过键访问值。实际爬虫抓取的数据最终就是为了整理成这种结构方便后续用 pandas 处理。3.2 流程控制语句流程控制包括条件判断和循环。条件判断用if/elif/else循环常用for遍历列表或字典。scores [9.7, 9.6, 9.5, 9.4] for score in scores: if score 9.5: print(f高分电影{score}) else: print(f普通分数{score})这里用到了 f-string 字符串格式化在字符串前加f然后用花括号插入变量是 Python 3.6 以后的推荐写法。爬虫翻页时最常用的循环方式是根据页码拼接 URLfor page in range(10): start page * 25 url fhttps://movie.douban.com/top250?start{start} print(url)range(10)生成 0 到 9 的整数序列start每页递增 25正好对应豆瓣 Top250 的分页规则。3.3 函数与异常处理函数是用来封装重复代码的。把爬虫的某一步操作写成函数可以让代码结构更清晰也方便重复调用。def get_page_title(url): 获取网页标题 import requests resp requests.get(url) resp.encoding utf-8 return resp.text[:100] title get_page_title(https://example.com) print(title)爬虫过程中网络波动、页面结构变化、编码错误都可能引发异常。如果不对异常做处理程序会直接崩溃导致前面抓取的数据全部丢失。使用try / except可以捕获异常并继续执行try: resp requests.get(https://example.com, timeout10) resp.raise_for_status() except requests.RequestException as e: print(f请求失败{e})raise_for_status()会在 HTTP 状态码为 4xx 或 5xx 时抛出异常避免拿到错误页面后继续解析。网络请求的超时时间一定要设置否则程序可能长时间卡住。4. 网络爬虫实战抓取豆瓣电影 Top250基础语法掌握以后就可以开始第一个完整项目了。这个项目的目标是从豆瓣电影 Top250 抓取电影名称、评分、评价人数、经典台词、年份和地区等信息保存为 CSV 文件。项目本身非常经典网上几乎每个 Python 学习者都写过非常适合作为第一个爬虫练手项目。4.1 爬虫原理与合规说明爬虫的基本流程是向目标服务器发送 HTTP 请求服务器返回网页源码再用解析库提取需要的信息。看起来简单但实际操作中有几个注意点。第一请求头要模拟真实浏览器。很多网站会检查User-Agent如果直接使用 Python 默认的请求头服务器可能返回 418 或 403 错误。第二请求频率要控制。爬虫只是抓取公开数据用于学习不能对目标网站造成访问压力。第三要尊重网站的robots.txt协议和版权规定本文示例仅供学习爬虫原理请勿用于商业用途。在代码中我们使用requests发送请求使用BeautifulSoup解析页面。这两者的配合是目前 Python 爬虫最基础的组合。4.2 抓取单页数据的核心代码先来分析页面结构。豆瓣 Top250 的列表页中每部电影位于ol.grid_view下的li标签中。每一条li包含了排名、封面、片名、评分、评价人数、经典台词、年份/地区/类型等信息。下面这段代码演示如何解析第一页的 25 条电影数据# 文件路径crawler.py import requests from bs4 import BeautifulSoup def fetch_page(url): 发送请求并返回解析后的 BeautifulSoup 对象 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() resp.encoding utf-8 return BeautifulSoup(resp.text, html.parser) def parse_movies(soup): 从 BeautifulSoup 对象中提取电影信息 movies [] items soup.select(ol.grid_view li) for item in items: rank item.select_one(.pic em).get_text() title item.select_one(.hd .title).get_text() rating item.select_one(.rating_num).get_text() quote item.select_one(.quote .inq) quote quote.get_text() if quote else info item.select_one(.hd .other).get_text().strip() movies.append({ rank: rank, title: title, rating: rating, quote: quote, other: info }) return movies if __name__ __main__: soup fetch_page(https://movie.douban.com/top250?start0) for movie in parse_movies(soup): print(movie)代码里用到了select_one和select两个方法。select返回符合选择器条件的所有元素列表select_one返回第一个匹配元素。.get_text()用于提取标签中的文本内容get(href)用于提取属性值。运行这段代码前请确认已经安装requests和beautifulsoup4。运行后终端会输出 25 条电影信息每条是一个字典。如果输出为空大概率是页面结构发生了变化或者请求被反爬拦截可以先将resp.status_code打印出来检查。4.3 实现翻页并保存为 CSV单页解析没问题后接下来实现翻页。Top250 总共 10 页每页 25 条URL 参数start从 0 开始每次 25。把每页的数据追加到一个列表中最后用csv模块写入文件。# 文件路径crawler.py完整版 import csv import time import requests from bs4 import BeautifulSoup def fetch_page(url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() resp.encoding utf-8 return BeautifulSoup(resp.text, html.parser) def parse_movies(soup): movies [] items soup.select(ol.grid_view li) for item in items: rank item.select_one(.pic em).get_text() title item.select_one(.hd .title).get_text() rating item.select_one(.rating_num).get_text() quote item.select_one(.quote .inq) quote quote.get_text() if quote else other item.select_one(.hd .other).get_text().strip() movies.append({ rank: rank, title: title, rating: rating, quote: quote, other: other }) return movies def main(): all_movies [] for page in range(10): start page * 25 url fhttps://movie.douban.com/top250?start{start} print(f正在抓取第 {page 1} 页{url}) soup fetch_page(url) movies parse_movies(soup) all_movies.extend(movies) time.sleep(2) # 请求间隔 2 秒避免对服务器造成压力 with open(douban_top250.csv, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[rank, title, rating, quote, other]) writer.writeheader() writer.writerows(all_movies) print(f抓取完成共 {len(all_movies)} 条数据) if __name__ __main__: main()这里有几个细节需要注意。encodingutf-8-sig可以让 CSV 文件在 Excel 中打开时中文不乱码。newline是为了避免 Windows 系统下 CSV 每两行之间出现空行。time.sleep(2)是爬虫的基本礼仪限制请求频率降低被封 IP 的风险。4.4 运行与验证在项目目录下执行python crawler.py程序会逐页打印抓取进度大约 20 秒后结束。此时项目目录下会生成douban_top250.csv文件用 Excel 打开后可以看到 250 条电影数据。检查第一行应该是表头最后一行排名应该是 250。到这里爬虫部分就完成了。下面进入数据分析环节。5. 数据分析实战用 Pandas 分析电影数据数据抓下来只是第一步更有价值的是从数据中发现规律。接下来使用pandas读取 CSV 文件完成数据清洗、统计和可视化。5.1 读取数据并查看基本情况用 pandas 读取 CSV 只需要一行代码# 文件路径analysis.py import pandas as pd df pd.read_csv(douban_top250.csv) print(df.head()) print(df.info()) print(df.describe())df.head()默认显示前 5 行df.info()显示每列的数据类型和非空值数量df.describe()对数值列输出统计信息。运行后可以直观看到rating列的平均值、最小值、最大值等指标都在这份输出里。爬虫抓取的数据往往存在缺失值或类型问题。比如quote列可能有空值year字段需要从other列中提取。数据清洗的目的就是把这些不规整的数据处理成适合分析的格式。5.2 数据清洗与特征提取当前 CSV 里并没有单独的年份字段年份信息混杂在other列中例如/ 1994 / 美国 / 犯罪 剧情。我们可以用正则表达式提取年份并新增一列。df[year] df[other].str.extract(r(\d{4})).astype(Int64)这条语句使用正则\d{4}从文本中提取 4 位数字作为年份astype(Int64)把列转换为整数类型缺失值保留为pd.NA。接下来统计评分最高的 10 部电影top10 df.nlargest(10, rating) print(top10[[rank, title, rating, year]])nlargest是 pandas 内置方法按指定列降序取前 N 条。如果发现多条并列分数可以调节参数比如按评价人数二次排序。5.3 分组统计与可视化分组统计是数据分析最常用的操作。下面按年份区间统计电影数量看看哪个年代的佳片最多df[decade] (df[year] // 10 * 10).astype(Int64) decade_count df.groupby(decade).size().reset_index(namecount) print(decade_count)(df[year] // 10 * 10)把年份映射到所属年代比如 1994 变成 1990。groupby按年代分组size()统计数量。输出结果通常在 1990 年代和 2010 年代会出现两个高峰。最后用 matplotlib 把评分分布画成直方图同时用柱状图展示各年代电影数量import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Microsoft YaHei] plt.rcParams[axes.unicode_minus] False fig, axes plt.subplots(1, 2, figsize(12, 4)) axes[0].hist(df[rating].dropna(), bins20, edgecolorblack, alpha0.7) axes[0].set_title(评分分布) axes[0].set_xlabel(评分) axes[0].set_ylabel(电影数量) decade_count_sorted decade_count.dropna().sort_values(decade) axes[1].bar(decade_count_sorted[decade].astype(str), decade_count_sorted[count]) axes[1].set_title(各年代电影数量) axes[1].set_xlabel(年代) axes[1].set_ylabel(数量) plt.tight_layout() plt.savefig(movie_analysis.png, dpi150) plt.show()plt.rcParams用来设置中文字体。不同操作系统字体名称不同Windows 常用Microsoft YaHeimacOS 可以用Arial Unicode MSLinux 可以用WenQuanYi Zen Hei。如果不设置图表里的中文会显示成方块。运行analysis.py后项目目录下会生成movie_analysis.png图片。从图表中可以直观看到豆瓣 Top250 的电影评分高度集中在 8.5 到 9.2 分之间高分电影分布并不均匀从年代来看1990 年代和 2010 年代产出的高分电影数量更多。这个结论虽然受样本选择影响但已经体现出完整的数据分析思路采集、清洗、统计、可视化。5.4 数据分析完整代码为了方便直接运行这里给出analysis.py的完整版本# 文件路径analysis.py import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Microsoft YaHei] plt.rcParams[axes.unicode_minus] False df pd.read_csv(douban_top250.csv) df[year] df[other].str.extract(r(\d{4})).astype(Int64) top10 df.nlargest(10, rating) print(评分最高的 10 部电影) print(top10[[rank, title, rating, year]]) df[decade] (df[year] // 10 * 10).astype(Int64) decade_count df.groupby(decade).size().reset_index(namecount) print(\n各年代电影数量) print(decade_count) fig, axes plt.subplots(1, 2, figsize(12, 4)) axes[0].hist(df[rating].dropna(), bins20, edgecolorblack, alpha0.7) axes[0].set_title(评分分布) axes[0].set_xlabel(评分) axes[0].set_ylabel(电影数量) decade_count_sorted decade_count.dropna().sort_values(decade) axes[1].bar(decade_count_sorted[decade].astype(str), decade_count_sorted[count]) axes[1].set_title(各年代电影数量) axes[1].set_xlabel(年代) axes[1].set_ylabel(数量) plt.tight_layout() plt.savefig(movie_analysis.png, dpi150) plt.show()6. 常见报错与排查思路初学者做爬虫和数据分析时几乎一定会遇到各种报错。下面整理高频问题按“现象 → 原因 → 解决”的思路说明。问题现象常见原因解决思路提示pip 不是内部或外部命令Python 未加入 PATH 或未正确安装重新安装并勾选 Add Python to PATH或手动配置环境变量使用python进入的不是自己安装的版本多个 Python 解释器并存用where python或which python检查路径在 VSCode 中指定解释器ModuleNotFoundError: No module named requests包未安装或虚拟环境未激活激活虚拟环境后执行pip install requests爬虫返回 403 或 418请求头缺少 User-Agent 或被服务器拦截添加浏览器 User-Agent降低请求频率必要时添加 CookieCSV 文件用 Excel 打开中文乱码写入时编码不是 utf-8-sig使用encodingutf-8-sig写入图表中文显示为方块系统缺少对应中文字体或未设置字体设置plt.rcParams[font.sans-serif]为系统中文字体pandas读取 CSV 时某些列变成NaN原始数据本身有空值使用dropna()或fillna()处理缺失值安装 pandas 速度慢或超时默认 PyPI 源在国外使用国内镜像源安装如果请求被反爬拦截不要一开始就想着伪装成高级浏览器。先检查自己的User-Agent是否正确请求间隔是否足够。大多数个人学习场景下只要代码写规范服务器不会过于严格。学习爬虫的目的是理解 HTTP 请求和数据解析原理不是暴力抓取更不是攻击目标网站这一点务必清楚。7. 工程化建议与新手避坑指南很多教程只会教你写出能运行的代码但实际工作中的 Python 项目还需要考虑可维护性和可靠性。下面这些建议来自真实项目经验对你后续进步很有帮助。7.1 项目结构规划不要把所有代码写在一个文件里。即使是一个小项目也建议按功能拆分python-learning/ ├── crawler.py # 爬虫模块 ├── analysis.py # 数据分析模块 ├── requirements.txt # 依赖清单 ├── venv/ # 虚拟环境 └── douban_top250.csv # 爬取结果requirements.txt可以通过pip freeze requirements.txt自动生成别人拿到项目后执行pip install -r requirements.txt就能复现环境。这是团队协作的基本要求。7.2 依赖与版本管理第三方库安装要克制不要一次性安装一堆用不到的包。每个包都会引入新的依赖和潜在的不兼容问题。写 requirements.txt 时建议锁定大版本例如requests2.31.0 beautifulsoup44.12.3 pandas2.1.4 matplotlib3.8.2 openpyxl3.1.2注意不同 Python 版本支持的 pandas 版本不同。如果安装失败可以降低 pandas 版本或者升级 Python 解释器。7.3 编码与中文处理Python 2 时代最头疼的就是编码问题Python 3 后字符串默认 UTF-8 编码情况好了很多。但写文件时仍然要明确指定编码读取网页时设置resp.encoding utf-8写 CSV 时设置encodingutf-8-sig写 JSON 时建议设置ensure_asciiFalse。这些细节能避免 90% 的中文乱码问题。7.4 异常处理与日志爬虫代码中的异常处理不能只是打印一下就完事。生产环境中更推荐记录日志。Python 自带的logging模块就够用import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) logger logging.getLogger(__name__)用logger.info()代替print()日志会带上时间和级别排查问题时能快速定位是哪个环节出错。7.5 数据质量验证数据分析结果是否可靠取决于数据质量。拿到 CSV 后第一件事不是画图而是检查数据总行数是否符合预期。关键列是否有缺失值。是否有重复行。数值列的类型是否正确。文本列是否包含异常字符。在真实项目中数据清洗往往占整个分析流程的一半以上时间。不要小看这一步。7.6 爬虫开发的安全边界爬虫是 Python 的重要应用方向但使用边界必须清晰。采集公开数据时注意以下红线只采集公开、合法、允许访问的数据。遵守目标网站的 robots.txt 协议和用户协议。控制请求频率和并发数。不采集个人隐私、商业机密、未公开数据。学习项目不用于商业用途。本文的豆瓣示例仅用于技术学习读者在实际开发中请务必保持理性克制。8. 七天学习节奏规划很多人问零基础七天能不能学会 Python。这个问题很难给出绝对答案因为“学会”的定义因人而异。如果你能每天投入 3 到 4 小时按照下面的节奏走七天足够完成一个能写在简历上的完整实战项目。第 1 天完成环境搭建学习变量、数据类型、运算符、字符串操作。目标能用 Python 写小计算器。第 2 天学习列表、字典、条件判断、循环完成一个简单的成绩统计程序。第 3 天学习函数、文件读写、异常处理完成一个读取文本文件并统计词频的小工具。第 4 天学习 requests 和 BeautifulSoup 的基本用法抓取单页网页数据。第 5 天完成 Top250 爬虫项目加入翻页、请求间隔、CSV 存储。第 6 天学习 pandas 的 DataFrame 操作完成数据读取、清洗、分组统计。第 7 天学习 matplotlib 可视化完成数据分析报告和图表输出。按照这个节奏最后一天结束时你手里会有两个完整的项目一个能自动抓取网页数据的爬虫一个能对数据进行统计分析的脚本。之后可以根据兴趣选择继续深入的方向如果想做 Web 开发可以学习 Flask 或 FastAPI如果想做数据科学可以继续学习 NumPy、scikit-learn如果想做复杂爬虫可以研究 Scrapy 框架和请求代理池。学习编程最重要的不是看多少视频、收藏多少教程而是亲手写出代码、亲手解决报错。这篇文章里的代码你可以直接复制运行但更建议你逐行敲一遍。遇到问题时先尝试自己阅读报错信息再搜索解决方案这个排查过程本身就是编程能力提升最快的时候。如果这篇文章对你有所帮助建议收藏备用。后续遇到环境问题、爬虫解析问题、pandas 用法问题都可以回来翻阅对应章节。祝你在 Python 学习的路上少走弯路早日写出属于自己的第一个完整项目。
返回列表