Python爬虫数据可视化大作业避坑指南:从requests到pyecharts全链路

发布时间:2026/10/30 5:06:00
Python爬虫数据可视化大作业避坑指南:从requests到pyecharts全链路 简介这是一份面向Python初学者与数据分析入门者的综合实战资料围绕招聘网站职位信息爬取、清洗与可视化展开帮助读者打通从网络请求到图表呈现的完整链路。压缩包共22个文件约330KB以12张png可视化图表、8个csv数据文件为主另含1个py爬虫脚本与1份md说明文档覆盖公司分布、学历要求、薪资水平等分析维度。已有5226人学习下载热度较高。内容涉及requests请求、BeautifulSoup解析、Pandas数据清洗、Matplotlib与Seaborn绘图并延伸至Scrapy框架、延迟加载处理与反爬策略等进阶话题。读者可参照脚本与数据文件复现完整分析流程理解异常处理与文件保存方法并借助现成图表快速完成课程大作业或简历项目。1. 从一份大作业压缩包说起爬虫抓数到可视化出图中间到底要补多少坑很多人拿到「Python爬虫数据可视化分析大作业.zip」这类压缩包第一反应是解压、装依赖、跑 main.py然后发现要么目标网站改版了要么图表中文乱码要么 Excel 里全是空值。这个标题背后其实是一条完整链路用 requests 或 xpath 爬虫把网页数据抓下来清洗成结构化数据再用 pandas 做统计分析最后用 pyecharts 或 matplotlib 出图。它适合两类人一是正在赶课程大作业的学生需要一套能跑通的模板二是刚转行做数据分析的从业者想拿一个真实场景练手。但我要先说清楚压缩包里的代码大概率只能跑通作者当时的环境你直接复现大概率翻车。真正值钱的是理解这条链路上每个环节的选型理由和参数边界而不是那个 zip 本身。2. 拆解大作业的四个技术层从 requests 到 pyecharts 的选型逻辑2.1 爬虫层requests xpath 为什么比 scrapy 更适合大作业大作业场景的核心约束是「代码量少、依赖少、老师能看懂」。scrapy 虽然工程化程度高但它需要理解 Twisted 异步模型、settings.py 配置、middlewares 中间件对于一个两周交活的作业来说学习成本远大于收益。requests lxml 的组合则足够直白一个 get 请求拿 HTML一个 etree.HTML 解析xpath 定位节点循环提取字段。我一般会这样组织爬虫代码import requests from lxml import etree import time import random def fetch_page(url, retry3): 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 i in range(retry): try: resp requests.get(url, headersheaders, timeout10) resp.encoding resp.apparent_encoding # 自动识别编码避免中文乱码 if resp.status_code 200: return resp.text except requests.RequestException as e: print(f第{i1}次请求失败: {e}) time.sleep(random.uniform(1, 3)) # 随机延时降低被封风险 return None def parse_list(html): tree etree.HTML(html) items tree.xpath(//div[classitem]) results [] for item in items: title item.xpath(.//h3/text()) price item.xpath(.//span[classprice]/text()) results.append({ title: title[0].strip() if title else , price: price[0].strip() if price else }) return results这段代码里三个参数最关键timeout10防止请求挂死apparent_encoding解决中文乱码random.uniform(1,3)控制请求频率。很多人写爬虫不加延时跑几十条就被目标站限流这是血泪经验。xpath 的text()函数只取直接文本节点如果目标节点下还有子标签需要用//text()或string()这是新手最容易踩的坑。2.2 数据层pandas 清洗比爬取更耗时间爬下来的原始数据通常有三类问题字段缺失、类型不对、重复记录。大作业里最常见的场景是价格字段带「¥」符号或「元」后缀直接做统计会报错。清洗逻辑要单独写一个函数import pandas as pd import re def clean_data(raw_list): df pd.DataFrame(raw_list) # 去掉价格中的非数字字符 df[price_clean] df[price].apply( lambda x: float(re.sub(r[^\d.], , x)) if x else None ) # 删除价格为空的记录 df df.dropna(subset[price_clean]) # 去重 df df.drop_duplicates(subset[title]) # 重置索引 df df.reset_index(dropTrue) return dfre.sub(r[^\d.], , x)这个正则的意思是保留数字和小数点其余全部删掉。注意如果价格里有「1,299」这种千分位逗号要先替换逗号再转 float否则会变成 1299 还是 1.299 取决于你的处理顺序。drop_duplicates的 subset 参数指定按哪些列判重不指定就是全列比较。清洗完的数据建议存一份 CSV 做备份方便后面反复调试可视化代码时不用重新爬。2.3 可视化层pyecharts 和 matplotlib 的分工大作业的图表通常分两类一类是给报告用的静态图一类是演示用的交互图。matplotlib 适合前者pyecharts 适合后者。如果你的作业需要截图放进 Wordmatplotlib 出图更快如果需要网页展示或答辩时动态交互pyecharts 的 HTML 输出更合适。pyecharts 画柱状图的最小示例from pyecharts.charts import Bar from pyecharts import options as opts def draw_bar(df, top_n10): top df.nlargest(top_n, price_clean) bar ( Bar() .add_xaxis(top[title].tolist()) .add_yaxis(价格, top[price_clean].tolist()) .set_global_opts( title_optsopts.TitleOpts(title价格 Top10), xaxis_optsopts.AxisOpts(axislabel_optsopts.LabelOpts(rotate30)), yaxis_optsopts.AxisOpts(name价格元) ) ) bar.render(bar_top10.html)rotate30解决横坐标标签太密集重叠的问题这是热词里「python画图横坐标太密集」的典型解法。nlargest比先 sort 再 head 更直观。pyecharts 默认输出 HTML如果要嵌入 Flask 项目用bar.dump_options_with_quotes()返回 JSON 给前端 ECharts 渲染。2.4 分析层从描述统计到简单建模大作业如果只出图分数通常中等。加一段描述统计或简单分组分析能拉开差距。比如按价格区间分组统计数量bins [0, 50, 100, 200, 500, float(inf)] labels [0-50, 50-100, 100-200, 200-500, 500] df[price_range] pd.cut(df[price_clean], binsbins, labelslabels) grouped df.groupby(price_range).agg( 数量(title, count), 均价(price_clean, mean) ).reset_index()pd.cut做分箱agg同时算多个统计量。这段结果可以直接喂给 pyecharts 画饼图或堆叠柱状图。如果时间充裕可以加一个简单的线性回归看价格和某个数值字段的关系但大作业不建议上复杂模型解释成本太高。3. 环境配置与依赖安装python安装、numpy和cv2这些坑怎么绕3.1 python安装与版本选择热词里「python安装」「python安装教程」「python官网下载」出现频率极高说明很多人卡在第一步。我建议直接装 Python 3.8 到 3.10 之间的版本不要追最新版。原因很简单pyecharts、lxml、pandas 这些库对新版 Python 的适配往往滞后几个月你装个 3.13 然后发现 lxml 编译失败纯属给自己找麻烦。Windows 安装时勾选「Add Python to PATH」这一步漏了后面 cmd 里敲 python 没反应又得重新配环境变量。验证安装是否成功python --version pip --version如果 pip 版本太旧先升级python -m pip install --upgrade pip3.2 依赖清单与安装顺序大作业压缩包里通常有个 requirements.txt但作者可能没写版本号。我一般按这个顺序装pip install requests lxml pandas matplotlib pyecharts openpyxlopenpyxl 是 pandas 读写 Excel 的引擎不装的话df.to_excel()会报错。如果要用 Flask 做网页展示再加pip install flasknumpy 通常作为 pandas 的依赖自动装上不用单独指定。cv2 是 opencv-python大作业里一般用不到除非你要做图像识别方向别被热词带偏。3.3 虚拟环境后悔药级别的操作我强烈建议用 venv 建虚拟环境而不是全局装python -m venv venv # Windows venv\Scripts\activate # macOS/Linux source venv/bin/activate虚拟环境的好处是装崩了直接删文件夹重来不影响系统 Python。很多人全局装了几十个库最后版本冲突到无法收拾只能重装系统这就是没有后悔药的后果。4. 避坑与排查爬虫被封、中文乱码、图表空白这些翻车现场4.1 请求返回 403 或验证码页面现象requests.get 返回状态码 403或者返回的 HTML 里是验证码页面而不是数据。原因目标站识别出你是脚本请求。常见触发条件是缺少 User-Agent、请求频率过高、IP 被标记。解决补全 headers 里的 User-Agent 和 Referer加随机延时如果还不行考虑用 session 保持 cookie或者换目标数据源。大作业不建议硬刚反爬换个结构简单的网站更省时间。4.2 中文乱码apparent_encoding 也不是万能的现象爬下来的标题全是「测试」这种乱码。原因目标站声明编码和实际编码不一致或者 requests 猜错了。解决先手动指定resp.encoding utf-8或gbk试一下。如果还乱用resp.content.decode(utf-8, errorsignore)强制解码。apparent_encoding 基于 chardet 库对短文本判断不准长页面才靠谱。4.3 pyecharts 图表空白或中文显示为方框现象打开生成的 HTML 文件图表区域一片空白或者中文变成方块。原因pyecharts 依赖的 ECharts JS 文件默认从 CDN 加载断网或 CDN 被墙时加载失败中文方框通常是 matplotlib 的字体问题不是 pyecharts 的。解决pyecharts 可以指定本地 JS 资源或者用CurrentConfig.ONLINE_HOST改成国内可访问的地址。matplotlib 中文问题需要设置import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] FalseSimHei 是 Windows 自带黑体macOS 换成「Arial Unicode MS」或「PingFang SC」。4.4 pandas 读取 CSV 后列名多了一列 Unnamed: 0现象pd.read_csv(data.csv)之后发现多了一列叫 Unnamed: 0。原因之前用df.to_csv(data.csv)保存时没加indexFalse把索引也写进去了。解决读取时加index_col0或者保存时养成习惯写df.to_csv(data.csv, indexFalse)。这个坑几乎每个人都会踩一次。4.5 Flask 项目里 pyecharts 图表不显示现象Flask 模板里嵌入 pyecharts 生成的 HTML页面只显示空白或 JS 报错。原因pyecharts 的 render 方法生成的是完整 HTML 文件不能直接塞进 Jinja2 模板。需要用dump_options_with_quotes()拿到图表配置 JSON在前端用 ECharts 初始化。解决后端返回 JSON前端这样写var chart echarts.init(document.getElementById(main)); var option {{ chart_option | safe }}; chart.setOption(option);| safe是 Jinja2 的过滤器告诉模板不要转义 JSON 字符串。5. 从能跑到能交大作业的加分项与代码组织技巧5.1 把爬虫、清洗、可视化拆成三个模块压缩包里常见的写法是一个 main.py 从头写到尾几百行堆在一起。这种代码老师看着累你自己调试也痛苦。我一般拆成三个文件spider.py负责抓取和解析cleaner.py负责清洗和存储visualize.py负责出图。每个文件都有if __name__ __main__:入口可以单独运行测试。这样答辩时老师问「数据从哪来」你直接打开 spider.py 讲逻辑清晰。5.2 加一个配置文件管理参数把 URL、请求头、输出路径、图表数量这些可变参数抽到一个config.py里BASE_URL https://example.com/list?page{} MAX_PAGES 10 OUTPUT_CSV data/result.csv TOP_N 10 REQUEST_DELAY (1, 3)这样换目标网站时只改配置不动业务代码。老师看到这种组织方式印象分直接上去。5.3 日志比 print 更专业用 logging 替代 print输出到文件和控制台import logging logging.basicConfig( levellogging.INFO, format%(asctime)s [%(levelname)s] %(message)s, handlers[ logging.FileHandler(spider.log, encodingutf-8), logging.StreamHandler() ] ) logging.info(开始抓取第 %d 页, page)出问题时看日志文件比在终端翻几百行 print 快得多。这也是企业级数据可视化和课程作业的区别之一有没有可追溯的运行记录。5.4 验证数据完整性的三个检查点交作业前跑一遍这三个检查能避免大部分尴尬检查项方法预期结果记录数len(df)与目标页数×每页条数接近空值率df.isnull().sum()关键字段空值率低于 5%数值范围df[price_clean].describe()min/max 在合理区间如果记录数远小于预期说明爬虫漏抓了回去检查 xpath 是否匹配到所有条目。如果空值率过高检查解析逻辑是不是只取了第一个匹配节点。5.5 图表选择的经验法则最后说一个我自己的习惯先看数据关系再选图表类型。比较大小用柱状图看趋势用折线图看占比用饼图看分布用直方图或箱线图看两个变量的关系用散点图。不要为了炫技堆一堆图表大作业里三到五张图讲清楚一个结论比十张图堆在一起更有说服力。我见过太多作业把能画的图全画一遍结果每张图都说不出来在证明什么反而扣分。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询