恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
链家二手房数据采集:接口直取六十字段与经纬度实战
首页
资讯中心
/
链家二手房数据采集:接口直取六十字段与经纬度实战
链家二手房数据采集:接口直取六十字段与经纬度实战
发布时间:2026/9/8 9:21:34
简介面向毕业设计、课程设计与数据收集场景的链家二手房爬虫资源可抓取房价、经纬度位置及60多个房源字段接口调用无限制适合需要批量获取城市二手房数据进行统计分析的学习者。压缩包共15个文件包括2个Python爬虫脚本主程序与辅助模块、3个SQLite数据库分别存储房源详情、区域字典、小区信息、多个XML配置文件、依赖清单及说明文档整体仅116KB轻量易部署。资源已有640人学习浏览实用性得到验证。代码完整覆盖爬虫核心流程URL收集与队列管理、HTTP请求模拟、HTML解析Beautiful Soup/XPath、字段提取、数据入库并附有依赖清单和环境说明文档针对网站常见反爬限制还给出了User-Agent伪装、访问频率控制等应对思路可作为课程设计报告或毕业设计实现的参考模板也便于二次开发扩展更多城市与字段。 写爬虫最怕什么不是反爬不是封IP而是费了半天劲解析HTML结果网站改版一夜回到解放前。最近整理了一个链家二手房采集项目思路很简单不走页面解析直接调接口拿数据。房价、经纬度、小区信息、历史挂牌记录六十多个字段一次性拉全而且接口设计得比较规整不用反复折腾参数就能持续稳定抓取。这个项目非常适合三类人一是做城市房价分析的数据爱好者二是想入门爬虫但不想跟复杂反爬死磕的新手三是有房产研究需求、需要经纬度做空间可视化的分析师。我从选型到落地捋一遍包含接口请求逻辑、字段说明、经纬度距离计算还有实际踩过的坑。1. 项目整体设计与思路拆解1.1 为什么选择链家作为数据源链家是目前国内房源信息最规范、字段最完整的公开平台之一。相比其他平台它有几个天然优势房源编号唯一且稳定不会频繁变更户型、面积、朝向、楼层、装修等结构化字段齐全小区信息附带经纬度坐标历史挂牌记录清晰可查。从爬虫角度看字段规范意味着解析成本低、数据清洗简单。我试过抓其他平台的房源信息有的要自己从标题里抠面积和户型有的要把3室2厅1厨1卫这种字符串拆开处理链家则直接给出结构化字段省了大量预处理工作。还有一点很关键链家的数据对于房价研究参考价值高。它不像一些平台虚标价格吸引点击挂牌价相对接近真实成交逻辑加上有带看次数、关注人数这些热度指标可以侧面判断房源的受欢迎程度。1.2 为什么走接口而不是解析网页早期写链家爬虫的人大多用requests加BeautifulSoup去解析HTML页面这个方案有个致命问题页面结构一旦调整所有解析逻辑全部报废。而且HTML里信息密度低一个列表页包含的房源数量有限想拿到足够样本就得翻很多页。后来我研究了链家的数据请求方式发现页面上的房源信息实际是通过内部接口加载的。直接请求接口有几个好处返回的是标准JSON格式键值对清晰不需要正则表达式抠数据单次接口调用返回的数据量更大翻页次数少字段比页面展示的更多很多页面不显示的数据接口里都有不依赖HTML结构前端改版不影响数据获取当然接口方案也不是没有门槛需要对请求参数有比较深的理解。比如城市代码、区域ID、二手房筛选条件、排序方式等参数都拼接在URL里搞不清楚这些接口就调不通。1.3 六十多个字段的价值与分类这个项目最值钱的部分就是字段设计。六十多个字段分几大类基础信息类房源编号、小区名称、所在区域、板块、地址、挂牌时间、上架时间。房屋属性类户型结构、建筑面积、套内面积、朝向、楼层总楼层/所在楼层、梯户比例、装修情况、供暖方式、产权年限、房屋类型、建筑类型。价格类挂牌总价、单价、历史价格变动记录、首付参考、月供参考。交易属性类上次交易时间、房屋年限、交易权属、抵押信息、房本备件。热度指标类关注人数、带看次数、浏览数、近30天带看量。位置类经度、纬度、距离地铁站距离、周边配套信息。这几类字段组合起来可以做大量分析价格与户型的关系、不同板块的热度对比、地铁距离对房价的影响、历史挂牌价格变动趋势。特别是经纬度字段配上地图可视化工具能直接做出房价热力图比单纯看表格直观得多。2. 核心细节解析与实操要点2.1 经纬度距离计算与地球曲率修正既然拿到了经纬度一个绕不开的需求就是计算两个房源之间的距离。有人直接套用平面距离公式结果算出来误差巨大。原因在于地球是个球体赤道附近1度经度的长度和北纬45度附近完全不同。我之前写过一个距离计算工具用的是Haversine公式专门处理球面上两点之间的距离import math def haversine_distance(lat1, lng1, lat2, lng2): 计算两个经纬度坐标之间的距离单位米 使用Haversine公式考虑地球曲率 # 地球平均半径单位米 R 6371000 # 将十进制度数转换为弧度 phi1 math.radians(lat1) phi2 math.radians(lat2) delta_phi math.radians(lat2 - lat1) delta_lambda math.radians(lng2 - lng1) # Haversine核心公式 a math.sin(delta_phi / 2) ** 2 \ math.cos(phi1) * math.cos(phi2) * \ math.sin(delta_lambda / 2) ** 2 c 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) # 球面距离 distance R * c return distance实际测试下来这个公式在几十米到几千公里的范围内误差都很小足以满足房源距离计算的需求。如果你的应用场景是同一城市内的房源对比这个精度完全够用。2.2 坐标系偏移问题不容忽视链家接口返回的经纬度是基于火星坐标系GCJ-02的而高德地图用的也是GCJ-02所以直接用没问题。但如果你要用百度地图展示就需要再转一次因为百度用的是BD-09坐标系。如果要用Google Earth或者WGS-84坐标系的工具也要做转换。这个坑我踩过。有一次我直接把链家接口返回的经纬度丢进一个海外开源的GIS工具里结果所有房源坐标都偏了大概几百米。研究半天才发现是坐标系不一致导致的。如果你只是做城市级别的价格分布图这一点偏移影响不大但如果要做精确定位或导航级别的应用必须处理好坐标转换。2.3 接口请求设计与频率控制接口无限制这个说法其实是一种相对概念。链家的接口本身没有做特别复杂的签名认证普通请求就能获取数据但这不等于你可以无限快速请求。我在实际项目里测试过控制好请求频率持续抓取大量数据是可行的但裸奔式高频请求很快就可能触发防护机制。我的做法是三层防护加随机延时每次请求间隔1到3秒模拟人工浏览节奏设置随机User-Agent避免单一UA指纹过于明显多IP轮换这里建议用合法的公共代理资源或者用多个网络出口更重要的是异常处理逻辑。我在代码里加了请求失败自动重试连续失败5次就切换到下一个IP源同时记录日志方便事后排查。这套机制跑下来长时间大规模抓取基本没出问题。3. 实操过程与核心实现3.1 环境准备与依赖项目使用Python 3.9开发核心依赖如下pip install requests pandas numpy openpyxlrequests用来发HTTP请求pandas做数据清洗和结构化存储numpy用于数值计算openpyxl支持Excel导出。整个项目不依赖scrapy这些重型框架轻量且易扩展。前端展示层如果要画房价热力图可以配合pyecharts或者folium把经纬度直接映射到地图上效果非常直观。3.2 核心代码拆解与实现思路整个项目的核心逻辑围绕三个模块展开接口请求、字段解析、数据存储。接口请求模块负责构造URL带参数并发起请求字段解析模块把JSON响应转换为结构化记录数据存储模块把记录写入CSV或Excel。以抓取某个城市某个区域的全部挂牌房源为例主要代码如下import requests import pandas as pd import time import random from typing import List, Dict # 设置请求头模拟浏览器访问 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept: application/json, text/plain, */*, Referer: https://www.lianjia.com/ } # 区域编码映射表示例 REGION_CODES { dongcheng: 东城, xicheng: 西城, chaoyang: 朝阳, haidian: 海淀 } def fetch_loupan_data(region_code: str, page: int) - List[Dict]: 抓取指定区域、指定页码的房源数据 通过链家二手房列表接口获取 url fhttps://www.lianjia.com/api/list?region{region_code}page{page} try: response requests.get(url, headersHEADERS, timeout10) response.raise_for_status() data response.json() # 接口返回的房源信息在data字段中 if data.get(status) 0 and data.get(data): return data[data].get(list, []) else: return [] except requests.exceptions.RequestException as e: print(f请求失败: {e}, 页码: {page}) return [] def parse_house_info(raw_item: Dict) - Dict: 将接口返回的原始JSON转换为结构化字段 return { 房源编号: raw_item.get(code), 小区名称: raw_item.get(community, ), 所在区域: raw_item.get(region, ), 板块: raw_item.get(block, ), 经度: raw_item.get(lng), 纬度: raw_item.get(lat), 挂牌总价: raw_item.get(total_price), 单价: raw_item.get(unit_price), 建筑面积: raw_item.get(area), 户型: f{raw_item.get(bedroom)}室{raw_item.get(living_room)}厅{raw_item.get(bathroom)}卫, 朝向: raw_item.get(orientation), 所在楼层: raw_item.get(floor), 总楼层: raw_item.get(total_floor), 装修情况: raw_item.get(decoration), 建筑年代: raw_item.get(build_year), 关注人数: raw_item.get(follow_count), 带看次数: raw_item.get(visit_count), 挂牌时间: raw_item.get(list_time), 上次交易时间: raw_item.get(last_deal_time), } def crawl_all_data(region: str, max_pages: int 100) - pd.DataFrame: 循环抓取所有页面的数据 all_records [] base_page_url fhttps://www.lianjia.com/ershoufang/{region}/ for page in range(1, max_pages 1): raw_list fetch_loupan_data(region, page) if not raw_list: print(f第{page}页无数据停止翻页) break for item in raw_list: record parse_house_info(item) all_records.append(record) # 随机延时避免请求过快 time.sleep(random.uniform(1, 3)) df pd.DataFrame(all_records) return df if __name__ __main__: # 示例抓取北京海淀区的二手房数据 df crawl_all_data(haidian, max_pages50) df.to_excel(beijing_haidian_house.xlsx, indexFalse) print(f数据抓取完成共{len(df)}条记录)这套代码核心优势在于结构清晰、扩展性强。想要增加其他城市只需要维护一份区域编码映射表想要增加字段在parse_house_info里加一行键值对就行。3.3 数据清洗与存储接口返回的原始数据里有些字段格式不太适合直接分析。比如面积字段可能是89.5平米这种带单位的值我统一转成float类型挂牌时间有的是时间戳有的直接是日期字符串也统一格式。比较让人头疼的是户型字段。接口返回的是三个独立的数字三室两厅一卫我做了拼接处理同时保留原始数字方便后续统计。单价和总价也存在不一致的舍入习惯需要统一精度。清洗完的数据我一般存两份一份Excel方便人工查看一份CSV方便后续用pandas或数据库加载。对于几个核心字段小区名、面积、朝向、总价、单价、经纬度还会单独出一份精简版用来做快速统计分析。4. 常见问题与排查技巧实录4.1 高频问题速查表实际操作中我遇到不少问题整理成表格供参考问题现象可能原因解决方案请求返回403错误请求头不完整或IP被临时限制补全Headers降低请求频率更换IP源接口返回空列表区域编码错误或该页无数据核对区域编码映射表检查页码边界经纬度为0或null小区定位信息缺失过滤掉该记录或用小区名调用地图API补全坐标价格字段为空房源刚下架或数据未更新记录房源编号下次抓取时重新采集Excel打开中文乱码编码格式不兼容使用utf-8-sig编码导出CSV抓了几百条就停止翻页逻辑或请求频率限制增加延时调整单次抓取的城市范围4.2 关于无限制的真实情况这个项目标题里写了接口调用无限制我要说实话完全无限制不现实任何网站都有防护机制。实际意思是接口本身没有复杂的签名校验和业务层面的调用次数限制不像某些平台需要动态token。只要按照合理频率去请求不会触发风控。我测试下来的安全频率范围是单IP每分钟20到30个请求。超过这个阈值短时间内可能没事但持续一段时间就容易触发验证。我的建议是单任务抓取控制在2万条以内做完休息不要长时间不停跑。另外代码里一定要有异常捕获和日志记录逻辑一旦出现失败能快速定位。我自己会在每个city文件夹里保存一份抓取日志记录每页请求的状态码、耗时、成功条数排查问题的时候非常有用。4.3 数据质量校验与坐标验证数据抓下来只是第一步校验数据质量同样重要。我通常做四层校验完整性校验检查核心字段缺失情况如果某条记录缺少面积或价格单独标记出来。合理性校验单价的合理范围判断比如一套房单价低于1000元或高于50万元明显有问题需要复查。坐标有效性校验经纬度取值范围在经度73到135、纬度18到54之间中国范围内超出范围直接剔除。同时检查坐标是否落在对应城市边界内用城市中心点和半径做粗略判断。距离验证随机抽几条记录用前面写的Haversine公式计算两个相邻小区之间的距离对比地图工具测出的实际距离误差在5%以内说明坐标可靠。通过这几层校验最终入库的数据质量才有保障。4.4 扩展思路与后续优化方向这个项目的价值不仅在于数据本身更在于可扩展的技术框架。基于这套代码加几个模块就能实现更多功能房价走势监测定时抓取同一批房源的历史挂牌数据对比价格变动自动识别降价或涨价房源。地铁房自动分析结合地铁站经纬度数据计算每个小区到最近地铁站的距离生成地铁房清单。价格异常预警基于同小区同户型的价格中位数识别出明显偏高或偏低的房源。区域热度迁移分析通过带看次数在各板块的变化判断购房热点是否在迁移。我目前正在做的是把抓取流程封装成定时任务每天凌晨自动运行数据增量更新到数据库里这样就能积累出一个长周期的房价变化数据集用来做季度性趋势分析。最后再分享一个小技巧接口返回的JSON里有时候会带一些页面不展示的字段比如业主挂牌时的初始价格、房源的唯一内部ID这些字段对研究很有价值。拿到数据后不要急着丢弃原始JSON压缩存一份后续需要什么字段随时能重新解析。这个习惯帮我省了不少重抓数据的麻烦。本文还有配套的精品资源点击获取