影刀RPA 房地产数据采集:安居客链家房源信息批量获取

📅 2026/7/16 2:40:54
影刀RPA 房地产数据采集:安居客链家房源信息批量获取
影刀RPA 房地产数据采集安居客链家房源信息批量获取什么情况用什么 → 怎么做 → 有什么坑作者林焱 | 飞行社出品什么情况用什么做房地产数据分析、房价监控、投资研判需要大量房源数据。手动一个个复制粘贴一小时搞不定50套房源。这套方案适合房产中介/投资机构采集竞品房源数据房价监测系统定期抓取数据房源比对分析同小区不同平台报价差异核心工具影刀RPA网页自动化 Requests直接调用API如果平台有 反爬策略应对怎么做第一步分析目标网站的页面结构以链家为例房源列表页URL规律拼多多店群自动化上架方案https://sh.lianjia.com/ershoufang/pg1/ # 上海二手房第1页 https://sh.lianjia.com/ershoufang/pg2/ # 第2页 https://sh.lianjia.com/ershoufang/107001838625.html # 详情页 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/be7dcedc677847b6a0e4693f50ef3486.png#pic_center)用浏览器F12打开网络面板翻页时观察是否有API接口返回JSON数据比解析HTML高效得多importrequestsimportjsondeftry_find_api(url):检查页面是否有JSON API接口headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Referer:https://sh.lianjia.com/}resprequests.get(url,headersheaders,timeout10)# 尝试解析为JSONtry:dataresp.json()print(找到API接口返回JSON数据)returndataexcept:# 不是JSON需要解析HTMLprint(页面是HTML需要用XPath/CSS解析)returnNone# 测试链家是否有隐藏APIdatatry_find_api(https://sh.lianjia.com/ershoufang/pg1/)实际情况链家/安居客等主要房产平台没有公开JSON API必须解析HTML。第二步用影刀采集列表页数据在影刀里创建「链家房源采集」流程【循环】页码从1到50采集50页 ↓ 【打开网页】https://sh.lianjia.com/ershoufang/pg{页码}/ ↓ 【等待元素出现】CSS选择器 .sellListContent li ↓ 【读取表格/列表】提取每个房源的 - 标题.title a 的文本 - 价格.total 的文本 - 单价.unitPrice 的文本 - ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d1510cb1963149c3b559937ef3492411.png#pic_center) - 面积户型.houseInfo 的文本 - 小区名.positionInfo a 的文本 - 详情页链接.title a 的 href ↓ 【写入Excel】将列表数据保存到临时表 ↓ 【翻页】点击下一页按钮或直接计算下一页URL关键Python代码用requestsBS4高效采集importrequestsfrombs4importBeautifulSoupimportpandasaspdimporttimeimportrandomdeffetch_lianjia_list(city,max_pages10):采集链家房源列表页headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Cookie:你的Cookie# 登录后的Cookie避免被拦截}results[]forpageinrange(1,max_pages1):urlfhttps://{city}.lianjia.com/ershoufang/pg{page}/print(f正在采集第{page}页:{url})resprequests.get(url,headersheaders,timeout10)soupBeautifulSoup(resp.text,html.parser)# 解析房源列表house_listsoup.select(ul.sellListContent li)ifnothouse_list:print(没有找到房源可能被反爬)breakforhouseinhouse_list:try:titlehouse.select_one(.title a).text.strip()pricehouse.select_one(.total).text.strip()万unit_pricehouse.select_one(.unitPrice).text.strip()house_infohouse.select_one(.houseInfo).text.strip()positionhouse.select_one(.positionInfo).text.strip()detail_urlhttps://sh.lianjia.comhouse.select_one(.title a)[href]results.append({标题:title,总价:price,单价:unit_price,户型面积:house_info,位置:position,详情页:detail_url})exceptExceptionase:print(f解析单个房源失败:{e})continue# 随机延迟避免被限流time.sleep(random.uniform(1,3))returnpd.DataFrame(results)第三步采集详情页数据列表页信息有限需要进入详情页采集更多信息楼层、朝向、装修、电梯、车位等deffetch_house_detail(detail_url,headers):采集房源详情页resprequests.get(detail_url,headersheaders,timeout10)soupBeautifulSoup(resp.text,html.parser)detail{详情页:detail_url}# 提取基本属性链家的页面结构info_itemssoup.select(.base .content li)foritemininfo_items:textitem.get_text(stripTrue)ifintext:key,valuetext.split(,1)detail[key]value# 提取小区信息community_infosoup.select(.communityName a)ifcommunity_info:detail[小区名称]community_info[0].text.strip()# 提取标签满五唯一、近地铁等tagssoup.select(.taxfree .content span)detail[标签],.join([tag.text.strip()fortagintags])returndetaildefbatch_fetch_details(house_list_df,max_workers5):批量采集详情页多线程加速fromconcurrent.futuresimportThreadPoolExecutor headers{User-Agent:Mozilla/5.0 ...}detail_results[]withThreadPoolExecutor(max_workersmax_workers)asexecutor:futures[]forurlinhouse_list_df[详情页].tolist():futureexecutor.submit(fetch_house_detail,url,headers)futures.append(future)forfutureinfutures:try:detailfuture.result(timeout30)detail_results.append(detail)exceptExceptionase:print(f采集详情页失败:{e})returnpd.DataFrame(detail_results)第四步数据清洗与分析defclean_house_data(df):清洗房源数据# 1. 总价转数字去掉万df[总价_万]df[总价].str.replace(万,).astype(float)# 2. 单价转数字去掉元/平df[单价_元]df[单价].str.replace(元/平,).astype(float)# 3. 提取户型如3室2厅 → 3室df[室数]df[户型面积].str.extract(r(\d)室).astype(float)# 4. 提取面积如89.5平米df[面积_平]df[户型面积].str.extract(r(\d\.?\d*)平米?).astype(float)# 5. 计算单价验证总价*10000/面积df[单价计算](df[总价_万]*10000/df[面积_平]).round(0)df[单价异常]abs(df[单价_元]-df[单价计算])1000# 差异超过1000元/平数据可疑returndf# 分析哪个小区最贵defanalyze_by_community(df):按小区汇总分析resultdf.groupby(小区名称).agg({总价_万:[count,mean,min,max],单价_元:mean,面积_平:mean}).reset_index()result.columns[小区名称,房源数,平均总价,最低总价,最高总价,平均单价,平均面积]resultresult.sort_values(平均单价,ascendingFalse)returnresult第五步影刀RPA完整流程编排【启动】每日凌晨2点自动运行 ↓ 【Python节点】fetch_lianjia_list() → 采集列表页50页 ↓ 【Python节点】batch_fetch_details() → 采集详情页多线程 ↓ 【Python节点】clean_house_data() → 清洗数据 ↓ 【Python节点】analyze_by_community() → 生成小区分析报告 ↓ 【对比历史数据】与新房/历史价格对比标记异常波动 ↓ 【写入数据库】将新数据存入MySQL用于长期趋势分析 ↓ 【生成报告】上海二手房日报.xlsx ↓ 【发送邮件】将报告发送给分析师团队有什么坑坑1反爬虫——IP被封链家/安居客有严格的反爬策略同一IP短时间大量请求 → 封IP 24小时不携带Cookie → 返回验证码页面User-Agent为空或不常见 → 直接拒绝解决方案# 1. IP代理池importrandom PROXY_POOL[http://proxy1:8080,http://proxy2:8080,# ...]deffetch_with_proxy(url):proxyrandom.choice(PROXY_POOL)proxies{http:proxy,https:proxy}resprequests.get(url,proxiesproxies,timeout10)returnresp[video(video-Ip5A8myp-1784131405859)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6d17728a23544f60b1d3339c894ac208.png#pic_center)blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]# 2. 随机User-AgentUSER_AGENTS[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...,Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...,# 准备10个以上]headers{User-Agent:random.choice(USER_AGENTS)}# 3. 使用Cookie登录后的Cookie# 在浏览器登录链家F12→Network→复制Request Headers里的Cookie坑2页面结构变化XPath/CSS选择器失效房产平台会不定期改版原来能用的选择器突然失效。解决方案同时准备多套解析规则并在解析失败时告警defrobust_extract(soup,selectors_dict,field_name):多选择器备选提取forselectorinselectors_dict[field_name]:elementsoup.select_one(selector)ifelement:returnelement.text.strip()# 所有选择器都失败print(f⚠️ 提取{field_name}失败页面可能已改版)send_alert_to_feishim(链家采集失效,f字段{field_name}无法提取请检查页面结构)return坑3数据量太大Excel存不下Excel最多104万行采集一个城市全量房源可能几十万套会超出限制。解决方案存到SQLite或MySQLdefsave_to_sqlite(df,db_pathhouse_data.db):保存到SQLite数据库importsqlite3 connsqlite3.connect(db_path)# 如果表存在追加数据去重根据详情页URLdf.to_sql(houses,conn,if_existsappend,indexFalse)# 去重保留最新的conn.execute( DELETE FROM houses WHERE rowid NOT IN ( SELECT MAX(rowid) FROM houses GROUP BY 详情页 ) )conn.commit()conn.close()print(f数据已保存到{db_path})坑4法律风险批量采集房产平台数据可能违反平台的《用户协议》和《Robots协议》。建议采集频率不要过高每次请求间隔≥2秒只用于内部分析不对外出售数据关注平台的Robots.txt如https://sh.lianjia.com/robots.txt总结平台反爬难度数据质量推荐指数链家⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐安居客⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐贝壳⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐58同城⭐⭐⭐⭐⭐⭐⭐链家的数据质量最高真实成交价但反爬最严。建议用影刀RPA模拟真人操作慢速、随机滚动、随机点击比纯Python请求更难被检测。