首页/新闻资讯/正文详情

Python爬虫实战:链家广州二手房数据抓取与可视化分析

发布时间:2026/11/13 19:00:54 来源:云帆数科 栏目:资讯中心
Python爬虫实战:链家广州二手房数据抓取与可视化分析
简介这是一套面向Python爬虫与数据分析学习者的实战项目源码包聚焦链家广州二手房市场帮助读者掌握从网页数据采集到可视化呈现的完整流程。项目以requests、BeautifulSoup、lxml、pandas等库为核心覆盖房源地址、面积、价格、楼层、朝向等字段的抓取与清洗并针对请求头、代理IP、Cookies等反爬策略给出应对思路。资源包共13个文件包含9个Python脚本、2个Markdown说明文档、1个gitignore及1份CSV数据文件压缩后约146KB脚本按功能拆分为数据获取、清洗、统计与多类图表绘制模块目录结构清晰。数据可视化部分涵盖总价与面积散点关系、朝向饼图、装修类型分布、各小区在售数量及均值中位数统计等分析维度可直观呈现区域差异与价格波动规律。目前已有187人学习下载适合希望积累爬虫与可视化项目经验、需要完整可运行案例的初中级开发者参考。1. 从一份广州二手房 CSV 说起这套源码到底能跑出什么很多人第一次做房价分析卡住的不是画图而是拿不到干净数据。这份guangzhou-second-hand-room-crawl-master.zip解决的就是这个前置问题它把链家广州二手房列表页的抓取、字段抽取、落盘 CSV、再到多张可视化图表的脚本打包在一起解压后直接能看到获取网页内容.py、数据清洗.py、广州房价信息.csv以及一批按分析维度拆分的绘图脚本。适合两类人一类是想跑通「爬取—清洗—可视化」完整链路的 Python 入门者另一类是需要一份可改字段、可换城市的二手房分析脚手架的数据从业者。它不追求分布式调度也不做实时增量胜在结构清晰、脚本粒度细每个分析点单独成文件改起来不用翻几百行。下面按「资源是什么 → 怎么用 → 坑在哪」的顺序拆开讲。2. 拆包看结构requests BeautifulSoup pandas 三段式怎么落地2.1 目录里每个脚本对应哪一步解压后先别急着运行把文件按职责分一下类后面排错会快很多。核心文件大致是这么分工的文件职责依赖获取网页内容.py发请求、翻页、解析列表页、写 CSVrequests、BeautifulSoup、lxml数据清洗.py去重、单位换算、缺失值处理pandas广州房价信息.csv已抓好的样本数据无各类数据项的平均值及其中位数.py描述性统计pandas总价与面积散点关系.py面积与总价相关性matplotlib朝向饼图.py/装修类型.py分类占比matplotlib查看各小区现存出售数目.py分组计数pandas多图.py多子图汇总matplotlib这套结构的好处是「一个分析问题一个文件」坏处是没有统一入口得手动按顺序跑。常见做法是先跑抓取再跑清洗最后跑各分析脚本。2.2 抓取脚本的核心逻辑与参数获取网页内容.py走的是最经典的 requests BeautifulSoup 路线。链家列表页是服务端渲染房源信息直接在 HTML 里所以不需要浏览器自动化这也是它比 Playwright 方案轻的原因。核心骨架大概是这样import requests from bs4 import BeautifulSoup import csv, time, random HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36, Referer: https://gz.lianjia.com/ershoufang/, } def fetch_page(url): # timeout 必设否则网络抖动时脚本会一直挂着 resp requests.get(url, headersHEADERS, timeout10) resp.encoding utf-8 # 链家页面是 utf-8不设会乱码 if resp.status_code ! 200: print(状态码异常:, resp.status_code) return None return resp.text def parse_list(html): soup BeautifulSoup(html, lxml) rows [] for li in soup.select(ul.sellListContent li): title li.select_one(div.title a) total li.select_one(div.totalPrice span) unit li.select_one(div.unitPrice span) rows.append({ 标题: title.get_text(stripTrue) if title else , 总价(万): total.get_text(stripTrue) if total else , 单价(元/平): unit.get_text(stripTrue) if unit else , }) return rows if __name__ __main__: all_rows [] for pg in range(1, 101): # 链家列表页最多到 100 页 url fhttps://gz.lianjia.com/ershoufang/pg{pg}/ html fetch_page(url) if not html: continue all_rows.extend(parse_list(html)) time.sleep(random.uniform(1, 3)) # 随机间隔别用固定 sleep with open(广州房价信息.csv, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[标题, 总价(万), 单价(元/平)]) writer.writeheader() writer.writerows(all_rows)逻辑说明fetch_page负责请求和编码parse_list用 CSS 选择器定位每个房源卡片。参数上timeout10是防止单页卡死拖垮整轮encodingutf-8必须显式设requests 有时会猜成 ISO-8859-1 导致中文乱码range(1, 101)是链家列表页的硬上限超过 100 页会返回空列表不是报错容易被误判成「抓完了」。sleep用random.uniform而不是固定值是因为固定间隔的请求节奏太规律容易被识别。2.3 清洗脚本要处理的四类脏数据抓下来的 CSV 不能直接进分析数据清洗.py主要干四件事。第一是单位统一总价字段带「万」单价带「元/平米」得用正则把数字抠出来转 float。第二是面积字段有的写「89.5平米」有的写「89.5㎡」符号不统一。第三是缺失值楼层、朝向、装修这些字段经常为空要决定是填充还是丢弃。第四是异常值比如单价个位数或上百万的基本是解析错位。import pandas as pd import re df pd.read_csv(广州房价信息.csv, encodingutf-8-sig) def to_num(x): # 抠出数字部分兼容 89.5平米 1200万 这类混合字符串 if pd.isna(x): return None m re.search(r[\d.], str(x)) return float(m.group()) if m else None df[总价] df[总价(万)].apply(to_num) df[单价] df[单价(元/平)].apply(to_num) # 面积字段若单独抓取同样处理 if 面积 in df.columns: df[面积] df[面积].apply(to_num) # 丢弃关键字段缺失的行而不是无脑 fillna(0) df df.dropna(subset[总价, 单价]) # 用分位数卡异常值比 3σ 更抗偏态分布 q1, q99 df[单价].quantile([0.01, 0.99]) df df[(df[单价] q1) (df[单价] q99)] df.to_csv(广州房价信息_clean.csv, indexFalse, encodingutf-8-sig)参数说明quantile([0.01, 0.99])卡掉首尾各 1% 的极端值比均值±3 倍标准差稳因为房价分布本身右偏标准差会被高价房源拉大。dropna(subset...)只对关键列去空避免把朝向为空但价格正常的房源一起删掉。encodingutf-8-sig是为了 Excel 打开不乱码纯 utf-8 在 Windows 上会显示 BOM 头。3. 可视化脚本逐个跑从散点图到朝向饼图的参数调法3.1 总价与面积散点图怎么看出相关性总价与面积散点关系.py是最能说明问题的一张图。二手房总价和面积理论上强正相关但实际数据里会因为地段、楼层、装修出现大量离群点。画的时候有两个参数值得调alpha控制点的透明度样本量大时不设会糊成一团黑s控制点大小默认偏大。import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 中文标签必须设否则方块 plt.rcParams[axes.unicode_minus] False df pd.read_csv(广州房价信息_clean.csv, encodingutf-8-sig) plt.figure(figsize(10, 6)) plt.scatter(df[面积], df[总价], alpha0.4, s15, csteelblue) plt.xlabel(建筑面积(平米)) plt.ylabel(总价(万)) plt.title(广州二手房总价与面积散点关系) # 顺手算个皮尔逊系数判断线性相关强度 corr df[面积].corr(df[总价]) plt.text(df[面积].min(), df[总价].max(), f相关系数 r {corr:.2f}, fontsize12) plt.tight_layout() plt.savefig(scatter.png, dpi150) plt.show()逻辑说明alpha0.4让重叠点颜色叠加密度高的区域自然变深比单纯计数更直观。corr()默认算皮尔逊系数如果数据里有极端值可以换成methodspearman看秩相关。dpi150是保存清晰度屏幕显示用默认 100 就够写进报告建议 150 以上。3.2 朝向饼图与装修类型分类字段的清洗前提朝向饼图.py和装修类型.py逻辑类似都是对分类字段做value_counts()再画饼图。但这两个脚本能不能跑出合理结果取决于清洗阶段有没有把分类字段归一化。原始数据里朝向可能是「南」「南北」「东南」混着装修可能是「精装」「精装修」「简装」多种写法。import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False df pd.read_csv(广州房价信息_clean.csv, encodingutf-8-sig) # 归一化把同义写法合并否则饼图会碎成十几块 df[朝向] df[朝向].str.replace(南北, 南北通透) counts df[朝向].value_counts().head(8) # 只取前 8 类长尾合并 plt.figure(figsize(8, 8)) plt.pie(counts, labelscounts.index, autopct%1.1f%%, startangle90) plt.title(广州二手房朝向分布) plt.savefig(orientation.png, dpi150) plt.show()参数说明head(8)是控制饼图可读性分类超过 8 个饼图就没法看了长尾可以合并成「其他」。autopct%1.1f%%显示一位小数百分比。startangle90让第一块从正上方开始视觉上更符合阅读习惯。如果value_counts()结果里出现大量空字符串说明清洗阶段没处理缺失得回去补。3.3 小区在售数量分组计数的排序陷阱查看各小区现存出售数目.py用的是groupby().size()但直接画出来往往很难看因为小区名长短不一横坐标会挤成一团。常见做法是取 Top 15 并横向画条形图。import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False df pd.read_csv(广州房价信息_clean.csv, encodingutf-8-sig) top df[小区].value_counts().head(15).sort_values() plt.figure(figsize(10, 8)) plt.barh(top.index, top.values, colorcoral) plt.xlabel(在售房源数) plt.title(广州在售房源数量 Top 15 小区) plt.tight_layout() plt.savefig(community.png, dpi150) plt.show()逻辑说明sort_values()升序是为了横向条形图从上到下递减barh比bar更适合长标签。tight_layout()防止小区名被裁掉。如果小区字段在原始数据里是空的说明抓取时没定位到对应节点得回抓取脚本补选择器。4. 避坑与排查跑这套源码最容易翻车的五个地方4.1 抓回来是空列表但状态码是 200现象脚本不报错CSV 里一行数据都没有。原因链家对高频请求会返回一个结构相同但列表为空的页面状态码仍是 200不是 403。解决在parse_list里加一行判断如果rows为空就打印页码并sleep更长时间同时检查HEADERS里的User-Agent是不是太旧。4.2 中文全部变成乱码现象CSV 打开是「ä½ å¥½」这种。原因requests 默认按响应头猜编码链家有时不返回 charset就猜成 ISO-8859-1。解决请求后手动resp.encoding utf-8写 CSV 时用utf-8-sig。这两个地方要同时改只改一个还是会乱。4.3 单价字段抠出来是空现象清洗后单价列大量 NaN。原因列表页的单价和详情页的单价 DOM 结构不同选择器div.unitPrice span在列表页可能取到的是「单价」两个字而不是数字。解决打印一条li的 HTML 看实际结构把选择器改成div.unitPrice span下的具体文本节点或者改用li.select_one(div.unitPrice).get_text()再正则抠数字。4.4 饼图中文显示成方块现象标题和标签全是方框。原因matplotlib 默认字体不含中文。解决plt.rcParams[font.sans-serif] [SimHei]Mac 上换成[Arial Unicode MS]Linux 上如果没有 SimHei 要装中文字体或换WenQuanYi。另外axes.unicode_minus False要一起设否则负号也会出问题。4.5 翻页到后面返回重复数据现象CSV 里同一房源出现多次。原因链家列表页在筛选条件变化或请求被限时可能返回缓存页导致相邻页内容重复。解决抓完后按「标题 总价」去重df.drop_duplicates(subset[标题, 总价], keepfirst)。更稳的做法是每抓一页就把 URL 记下来重复 URL 直接跳过。5. 进阶玩法把这份脚手架改成可复用分析模板跑通默认流程后这套源码真正的价值在于它的可扩展性。我一般会做三件事把它变成自己的模板。第一把抓取脚本里的城市前缀抽成变量gz.lianjia.com换成sz、sh就能抓其他城市但要注意不同城市的列表页 DOM 可能有细微差异选择器得重新验证。第二把清洗逻辑封装成函数输入原始 CSV 输出干净 DataFrame这样换数据源时只改解析部分。第三给可视化脚本加一个统一的config.py把字体、配色、图片尺寸、dpi 集中管理避免每个文件重复设rcParams。验证数据质量有个简单办法清洗后打印df.describe()看单价的均值和分位数是否落在合理区间。广州二手房单价大致在 2 万到 8 万之间如果均值只有几千或者几十万基本可以确定是解析错位或单位没换算。另一个检查点是df[面积].between(20, 500).mean()正常应该在 0.95 以上低于这个值说明面积字段脏得厉害。还有一个容易被忽略的技巧抓取时把原始 HTML 也存一份到本地用页码.html命名。这样调试选择器时不用反复请求直接读本地文件解析既快又不会触发限流。等选择器调稳了再开真实抓取。我早期做这类项目时因为没存原始页面选择器一改就得重抓白白浪费了一下午。从那以后我每次抓取都强制先落一份 HTML 快照再跑解析。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

粒子群算法在IEEE30节点最优潮流计算中的应用与优化
粒子群算法在IEEE30节点最优潮流计算中的应用与优化

1. 项目背景与核心价值在电力系统运行中,最优潮流(Optimal Power Flow, OPF)问题一直是核心挑战。简单来说,就是在满足各种物理约束条件下,找到使发电成本最低、网损最小或其他目标最优的机组出力方案。IEEE30节点系统… · 2026/11/13 19:00:53

英伟达AI智能体安全平台:实时隔离机制与工程落地解析
英伟达AI智能体安全平台:实时隔离机制与工程落地解析

最近 AI 圈最热闹的话题,除了各家模型打架,就是英伟达这边扔出的 AI 智能体安全平台了。做智能体开发的朋友应该都有感受:现在 Chatbot 已经不够看了,圈里聊的全是 Agent,是让 AI 自己调工具、自己决策、自己干活。但问… · 2026/11/12 3:15:53

FINS协议与框架实战:欧姆龙PLC数据采集与避坑指南
FINS协议与框架实战:欧姆龙PLC数据采集与避坑指南

简介:FINS-Framework.zip 是一套面向工业自动化开发者的欧姆龙PLC通信协议实现资源,基于C语言构建,适用于需要远程监控、数据采集及程序上传下载的工控项目。FINS协议支持TCP/IP与RS-485串行通信,框架涵盖控制报文、命令报文与响应… · 2026/11/3 6:17:23

帮助电工证年审有效期多久
帮助电工证年审有效期多久

电工证年审心里没底怕挂科?郑州报考避坑指南全在这了 实操考试心里没底怕挂科?你不是一个人。很多电工在年审时,尤其是第一次参加或久未报考的,都担心实操考试不过关、理论知识记不牢、流程不熟悉。尤其在郑州,报考流程复杂,各种培训机构鱼龙混杂,一不… · 2026/11/13 19:00:02

低级电工证能考技师吗?全国通用证书怎么考?南阳电工太忙也能解决!
低级电工证能考技师吗?全国通用证书怎么考?南阳电工太忙也能解决!

低级电工证能考技师吗?全国通用证书怎么考?南阳电工太忙也能解决! 工地太忙根本没时间复习考试,这几乎是所有一线电工的共同痛点。尤其是南阳的水利工程施工人员,每天在工地上跑来跑去,哪还有精力去准备电工证考试?但问题来了,… · 2026/11/13 19:00:02

乾县哪里可以考电工证怎么报名?外省证能转过来吗?
乾县哪里可以考电工证怎么报名?外省证能转过来吗?

乾县哪里可以考电工证怎么报名?外省证能转过来吗? 之前考的证在外省能不能转过来?这几乎是每个打算在乾县从事电工工作的人都会问的问题。尤其是像你这样从新乡过来转岗的,更想知道在乾县哪里可以考电工证,怎么报名,还能不能把之前在别处考的证“转过来… · 2026/11/13 19:00:02

电工证要考那些科目考前押题怎么找?南阳卧龙区中小施工企业负责人必看
电工证要考那些科目考前押题怎么找?南阳卧龙区中小施工企业负责人必看

电工证要考那些科目考前押题怎么找?南阳卧龙区中小施工企业负责人必看 急需特种作业证才能上岗找工作,这句话在南阳卧龙区的建筑工地上听得太多了。电工证是特种作业操作证的重要一环,不少工人因为没有证书被拒之门外,还有企业因为员工证书不齐而面临停工… · 2026/11/13 19:00:02

电力电缆电工证是什么 你知道多久拿证才能上岗吗
电力电缆电工证是什么 你知道多久拿证才能上岗吗

电力电缆电工证是什么 你知道多久拿证才能上岗吗 怕考不过白交培训费?你不是一个人。很多郑州金水区的房建工程从业者在报考电力电缆电工证前,最担心的就是交了钱考不过,白白浪费时间和金钱。其实,只要选对培训机构,明确报考流程,拿证并不是难事。本文… · 2026/11/13 19:00:02

深圳如何考电工证良心建议:怕考不过白交培训费?一文说清
深圳如何考电工证良心建议:怕考不过白交培训费?一文说清

深圳如何考电工证良心建议:怕考不过白交培训费?一文说清 怕考不过白交培训费?深圳如何考电工证?这可能是很多刚入行或者想转行的朋友最担心的问题。别急,今天就从一个从业多年的老手角度, 良心建议 你怎么做才能既省钱又顺利拿到证。我们先说重点:… · 2026/11/13 18:59:01

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/12 14:09:01

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/13 5:40:45

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43

维修电公用考电工证吗 在哪考最靠谱
维修电公用考电工证吗 在哪考最靠谱

维修电公用考电工证吗 在哪考最靠谱 工地太忙根本没时间复习考试,你是维修电工,天天在项目上跑,连抽个空背个题都难。那问题来了—— 维修电公用考电工证吗 ?答案是: 必须考 。尤其是在当前施工行业,没有电工证,连进场都可能被拦下。而且,… · 2026/11/13 0:00:08

电工证是不是可以登高?含金量和证书范围你必须知道的事
电工证是不是可以登高?含金量和证书范围你必须知道的事

电工证是不是可以登高?含金量和证书范围你必须知道的事 证书过期了不知道怎么复审延期,这事儿很多人遇到过,尤其是像你这样在郑州金水区做劳务班组负责人,手里握着几十个工人的证书,稍微一疏忽,就可能影响工程进度和公司信誉。特别是电工证是不是可以登… · 2026/11/13 0:00:08

鸡西电工证哪家下证快官方报名入口怎么找
鸡西电工证哪家下证快官方报名入口怎么找

鸡西电工证哪家下证快官方报名入口怎么找 你是不是也担心 学历不高怕报不上名 ?别急,今天我就来跟你说说, 鸡西电工证哪家下证快 ,还有 官方报名入口 到底怎么找,别让那些“代办”“代考”耽误了你的机会。… · 2026/11/13 0:00:08

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/12 21:15:21

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码