1. 项目背景与核心价值
最近在帮朋友优化他的房产中介业务时,发现手工整理房源信息效率极低。于是用Django+爬虫做了个自动化分析系统,上线后房源匹配效率提升了300%。这个系统核心解决三个痛点:
- 多平台房源数据分散难整合
- 人工比价耗时易出错
- 历史价格趋势无法可视化
典型应用场景:
- 中介公司房源库建设
- 个人租房比价决策
- 区域租金水平监控
注意:爬取数据需遵守各平台robots协议,建议设置合理的请求间隔(实测2秒/次可稳定运行)
2. 系统架构设计
2.1 技术栈选型
mermaid复制graph TD
A[前端] -->|Vue.js| B(Django REST)
B -->|PostgreSQL| C[爬虫集群]
C -->|Redis| D[数据分析]
D -->|Matplotlib| E[可视化]
主要组件说明:
- Django:选用3.2 LTS版本,内置Admin完美适配数据管理需求
- Scrapy:比Requests+BS4更稳定,支持自动重试和代理池
- PostgreSQL:JSON字段原生支持非结构化房源数据存储
- Redis:布隆过滤器去重+任务队列控制爬取频率
2.2 数据库设计
核心表结构示例:
python复制class House(models.Model):
platform = models.CharField(max_length=20) # 来源平台
title = models.TextField()
price = models.DecimalField(max_digits=8, decimal_places=2)
area = models.FloatField() # 面积
location = models.JSONField() # 经纬度+行政区
crawl_time = models.DateTimeField(auto_now_add=True)
class Meta:
indexes = [
models.Index(fields=['platform', 'location']),
]
经验:JSONField存储非标准字段(如装修情况、朝向),避免频繁修改表结构
3. 爬虫实现细节
3.1 反爬应对策略
实战中遇到的防护手段及破解方案:
| 防护类型 | 解决方案 | 实现代码示例 |
|---|---|---|
| 频率限制 | 动态代理+随机延时 | yield scrapy.Request(proxy=random.choice(proxy_pool)) |
| 指纹检测 | 随机UserAgent | DOWNLOADER_MIDDLEWARES配置RotateUA |
| 验证码 | 第三方打码平台 | 对接图鉴API自动识别 |
| 数据混淆 | 字体反爬解析 | fontTools.ttLib解析woff |
3.2 数据清洗管道
关键清洗步骤:
- 价格标准化(去除"面议"/"万"等字符)
- 面积单位统一(㎡/平/平方→㎡)
- 地址解析(高德API逆地理编码)
- 图片去重(MD5比对+相似度检测)
python复制def clean_price(value):
if '万' in value:
return float(value.replace('万',''))*10000
return float(re.sub(r'[^\d.]','',value))
4. 数据分析模块
4.1 核心指标计算
python复制# 同小区均价计算(Django ORM示例)
from django.db.models import Avg, Count
queryset = House.objects.filter(
location__district='浦东新区'
).values('community').annotate(
avg_price=Avg('price'),
house_count=Count('id')
).order_by('-avg_price')[:10]
4.2 可视化方案
使用Apache ECharts实现:
- 热力图展示区域价格分布
- 折线图追踪历史价格波动
- 散点图分析面积-价格关系
踩坑提醒:Matplotlib渲染静态图时,中文需额外配置字体
python复制plt.rcParams['font.sans-serif'] = ['SimHei']
5. 部署优化实践
5.1 性能调优
- 数据库:
django-postgres-extra启用HStore加速JSON查询 - 缓存:
django-redis缓存高频查询结果 - 异步任务:Celery处理耗时操作(如地址解析)
5.2 安全防护
必须配置项:
python复制# settings.py
SECURE_REFERRER_POLICY = "same-origin"
CSRF_COOKIE_HTTPONLY = True
SESSION_COOKIE_SECURE = True
6. 典型问题排查
-
爬虫被封IP:
- 现象:连续返回403状态码
- 解决:立即暂停任务,检查请求头是否完整,更换代理IP池
-
数据重复入库:
- 检查点:
scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware的代理生效情况 - 终极方案:使用
fingerprint回调函数自定义去重逻辑
- 检查点:
-
地理编码失败:
- 备用方案:调用百度地图API作为高德的fallback
- 本地缓存:对解析结果建立LRU缓存
这个系统经过3次迭代后,目前稳定管理着10万+房源数据。最大的收获是:对于动态渲染的页面,最终放弃了Selenium方案,改用scrapy-splash+Lua脚本,性能提升了8倍。建议新手先从单个平台入手,完成端到端流程后再扩展。
