当前位置: 首页 > article >正文

Python安居客二手小区数据爬取(2025年)

目录

  • 2025年安居客二手小区数据爬取
    • 观察目标网页
    • 观察详情页数据
    • 准备工作:安装装备就像打游戏
    • 代码详解:每行代码都是你的小兵
    • 完整代码大放送
    • 爬取结果

2025年安居客二手小区数据爬取

这段时间需要爬取安居客二手小区数据,看了一下相关教程基本也都有点久远,趁着新年期间我也把自己爬取的思路跟流程记录一下(适合有一点爬虫基础的宝宝食用),如有不对,欢迎私信交流~

观察目标网页

我们这里爬取的是安居客二手小区数据,从官网进去
在这里插入图片描述
这里看到小区的总数量,以及相关的小区的名字等信息,红框框起来的数据一般是我们所关心的
在这里插入图片描述
当然,点击小区可以进入详情页,这里列出了关于该小区更加具体的信息,我们这里尝试把框起来的数据都爬取下来!
在这里插入图片描述
知道了我们需要爬取的数据之后,下一步我们需要进一步分析这些数据的来源——数据是写在静态网页中还是从服务器异步加载过来的,让我们分析一下网页结构:
在这里插入图片描述
从上面这张图里我们可以发现数据是写在了html的源码里的,每个小区的数据都包裹在一个li-row的a标签里面,因此我们只需要把list-cell里面的所有li-row都遍历一遍,就可以获取一页的小区相关数据,当然这里还没包含详情页数据~
在这里插入图片描述

观察详情页数据

在这里插入图片描述
我们可以发现这个小区详情页的数据会存放在maininfo的div大盒子里面,然后这个大盒子里由house-price跟info两个div小盒子组成,因此我们只需要从这两个小盒子里取数据即可~下面开始搓我们的代码!

准备工作:安装装备就像打游戏

1️⃣ 装Python环境(不会的看这里)
👉 去Python官网下载最新版,安装时记得勾选"Add Python to PATH"
2️⃣ 安装必备武器库(打开cmd / powershell)

pip install requests beautifulsoup4

💡 这俩库相当于你的"爬虫工具箱",一个负责上网,一个负责解析网页
3️⃣ 准备VIP通行证 (Cookie获取)
cookie的作用可以让我们在模拟登陆的时候维持一下会话,因为安居客这个网站每隔一段时间就需要输入一下验证码或者重新登陆,设置一下cookie方便很多!!!
具体自己浏览器的cookie在登陆之后,按F12打开开发者工具,找到Network标签 → 刷新页面 → 随便选个请求 → 复制一下响应标头里的set-cookie里的内容即可~
在这里插入图片描述

代码详解:每行代码都是你的小兵

🛠️ 先看整体作战计划:

"""
作战目标:自动抓取指定数量的小区信息
作战路线:列表页 → 详情页 → 数据保存
武器配置:requests发请求,BeautifulSoup解析
特殊装备:自动重试机制防掉线
"""

🎯 核心代码拆解(重点!)

  1. 配置侦察兵参数
# 伪装成浏览器(重要!)
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'  # 完整UA太长省略
}# 你的VIP通行证(定期更新!)
COOKIES = {'ajkAuthTicket': 'TT=3f67c23d85c369b7018fcb4e...',  # 填你复制的Cookie'ctid': '24'
}
  1. 创建不死鸟连接器
def create_session():session = requests.Session()# 配置自动重试(网络不好也不怕)adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1,status_forcelist=[500, 502, 503, 504]))session.mount('https://', adapter)return session

💡 这个相当于你的"网络保镖",遇到问题自动重试三次
3. 万能数据提取器

def safe_get_text(element, selector, default='N/A'):""" 安全提取文本,找不到元素也不报错 """target = element.select_one(selector)return target.text.strip() if target else default

🌟 使用场景:就像用镊子精准夹取页面数据,夹不到就返回默认值
4. 主力作战部队(main函数)

def main():# 输入要抓多少小区community_count = int(input("想抓多少小区?输入数字:"))# 创建侦察兵小队with open('小区数据.csv', 'w', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['小区名称', '价格', '地址', ...])  # 完整表头# 开始翻页抓取for page in range(1, 总页数+1):# 获取当前页所有小区链接# 逐个访问详情页提取数据# 保存到CSV# 休息0.5秒防止被封

💡 这里用了with open自动管理文件,就像有个小秘书帮你保存数据

完整代码大放送

"""
安居客小区信息爬虫 
"""
import csv
import time
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from bs4 import BeautifulSoup# ========================== 全局配置 ==========================
# 请求头配置(模拟浏览器访问)
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0','Referer': 'https://member.anjuke.com/','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
}# Cookies配置(需要定期更新)
COOKIES = {'ajkAuthTicket': 'TT=3f67c23d85c369b7018fcb4e1418466f&TS=1738219179437&PBODY=IotzzfNhkTJKGH_LuUrSfcNHUGin1wBsHjAQYBL3k0USZDHrUxL6RQUv1ZsFPDHjxvQl0uvU2zSgIEdSFCHUc7wYEf4slKV2U2F9rwNnp6xHgufTxMgdYWZEob_Tep-poDqBMbQQgayOQhsaRgVjw8K8ut3QqqMfPgYGpKJJBHw&VER=2&CUID=fzgJGetduRhII81NXadF-HKyO1Hvr8W-','ctid': '24',
}# 重试策略配置
RETRY_STRATEGY = Retry(total=3,  # 最大重试次数backoff_factor=1,  # 重试等待时间因子status_forcelist=[500, 502, 503, 504],  # 需要重试的状态码allowed_methods=frozenset(['GET', 'POST'])  # 允许重试的HTTP方法
)# 其他配置
BASE_URL = 'https://foshan.anjuke.com/community/p{page}/'  # 分页URL模板
REQUEST_DELAY = 0.5  # 请求间隔时间(秒),防止被封禁
CSV_HEADERS = [  # CSV文件表头'小区名称', '价格', '地址', '小区链接','物业类型', '权属类别', '竣工时间', '产权年限', '总户数', '总建筑面积', '容积率', '绿化率', '建筑类型', '所属商圈', '统一供暖', '供水供电', '停车位', '物业费','停车费', '车位管理费', '物业公司', '小区地址', '开发商', '在售房源', '在租房源'
]# ========================== 工具函数 ==========================
def create_session():"""创建带有重试策略的请求会话返回:requests.Session - 配置好的会话对象"""session = requests.Session()adapter = HTTPAdapter(max_retries=RETRY_STRATEGY)session.mount('https://', adapter)session.mount('http://', adapter)return sessiondef safe_get_text(element, selector, default='N/A'):"""安全获取元素文本内容参数:element: BeautifulSoup对象 - 父元素selector: str - CSS选择器default: str - 默认返回值返回:str - 元素的文本内容或默认值"""target = element.select_one(selector)return target.get_text(strip=True) if target else default# ========================== 主程序 ==========================
def main():# 用户输入community_count = int(input("请输入需要抓取的小区数量:"))# 初始化会话session = create_session()# 准备CSV文件with open('communities.csv', mode='w', newline='', encoding='utf-8') as csv_file:writer = csv.writer(csv_file)writer.writerow(CSV_HEADERS)page_count = (community_count // 25) + (1 if community_count % 25 else 0)collected = 0  # 已收集数量# 分页抓取for current_page in range(1, page_count + 1):print(f"\n➤ 正在处理第 {current_page}/{page_count} 页...")# 获取列表页try:list_url = BASE_URL.format(page=current_page)response = session.get(list_url,headers=HEADERS,cookies=COOKIES,timeout=10)response.raise_for_status()except Exception as e:print(f"⚠️ 列表页请求失败: {e}")continue# 解析小区列表list_soup = BeautifulSoup(response.text, 'html.parser')communities = list_soup.find_all('a', class_='li-row')# 遍历每个小区for community in communities:if collected >= community_count:break# 提取基本信息name = safe_get_text(community, 'div.li-title')price = safe_get_text(community, 'div.community-price')address = safe_get_text(community, 'div.props')link = community.get('href', '')print(f"\n▌ 正在处理小区:{name}")# 获取详情页try:detail_response = session.get(link,headers=HEADERS,cookies=COOKIES,timeout=15)detail_response.raise_for_status()except Exception as e:print(f"  ⚠️ 详情页请求失败: {e}")continue# 解析详情页detail_soup = BeautifulSoup(detail_response.text, 'html.parser')details = []# 提取主要信息for index in range(14):  # 0-13对应预设的标签value = safe_get_text(detail_soup, f'div.value.value_{index}')details.append(value)# 提取额外信息extra_info = {'停车费': 'N/A','车位管理费': 'N/A','物业公司': 'N/A','小区地址': 'N/A','开发商': 'N/A'}for column in detail_soup.find_all('div', class_='column-1'):label = safe_get_text(column, 'div.label')value = safe_get_text(column, 'div.value')for key in extra_info:if key in label:extra_info[key] = value# 提取房源信息sale = detail_soup.find('div', class_='sale')rent = detail_soup.find('div', class_='rent')sale_info = f"{safe_get_text(sale, 'i.source-number')} {safe_get_text(sale, 'i.source-unit')}" if sale else 'N/A'rent_info = f"{safe_get_text(rent, 'i.source-number')} {safe_get_text(rent, 'i.source-unit')}" if rent else 'N/A'# 构建完整数据行row = [name, price, address, link,*details,*extra_info.values(),sale_info, rent_info]# 写入CSVwriter.writerow(row)collected += 1print(f"  ✅ 已保存 {collected}/{community_count} - {name}")# 请求间隔time.sleep(REQUEST_DELAY)print("\n🎉 数据抓取完成!结果已保存到 communities.csv")if __name__ == '__main__':main()

爬取结果

这是爬取的结果,如果只要其中的部分列,我建议直接删除最终的csv表格,而不是修改代码,代码能运行就尽量别动 -_-!!!
在这里插入图片描述

在这里插入图片描述
完结撒花~

参考文章:
[1]: 菜鸟爬虫——获取安居客二手房信息
[2]:Python爬虫之路(9)–an居客数据获取
[3]:Python之爬取安居客网二手房小区详情页数据
[4]:python使用代理爬取安居客二手房数据(一)
[5]:(项目)爬取安居客二手房房屋信息
[6]:【爬虫】安居客二手房数据爬取

相关文章:

Python安居客二手小区数据爬取(2025年)

目录 2025年安居客二手小区数据爬取观察目标网页观察详情页数据准备工作:安装装备就像打游戏代码详解:每行代码都是你的小兵完整代码大放送爬取结果 2025年安居客二手小区数据爬取 这段时间需要爬取安居客二手小区数据,看了一下相关教程基本…...

happytime

happytime 一、查壳 无壳,64位 二、IDA分析 1.main 2.cry函数 总体:是魔改的XXTEA加密 在main中可以看到被加密且分段的flag在最后的循环中与V6进行比较,刚好和上面v6数组相同。 所以毫无疑问密文是v6. 而与flag一起进入加密函数的v5就…...

深度学习 DAY3:NLP发展史

NLP发展史 NLP发展脉络简要梳理如下: (远古模型,上图没有但也可以算NLP) 1940 - BOW(无序统计模型) 1950 - n-gram(基于词序的模型) (近代模型) 2001 - Neural language models&am…...

前端知识速记:节流与防抖

前端知识速记:节流与防抖 什么是防抖? 防抖是一种控制事件触发频率的方法,通常用于处理用户频繁触发事件的场景。防抖的核心思想是将多个连续触发事件合并为一个事件,以减少执行次数。它在以下场景中特别有效: 输入…...

家居EDI:Hom Furniture EDI需求分析

HOM Furniture 是一家成立于1977年的美国家具零售商,总部位于明尼苏达州。公司致力于提供高品质、时尚的家具和家居用品,满足各种家庭和办公需求。HOM Furniture 以广泛的产品线和优质的客户服务在市场上赢得了良好的口碑。公司经营的产品包括卧室、客厅…...

【3】阿里面试题整理

[1]. ES架构,如何进行路由以及选主 路由:在Elasticsearch(ES)中,默认的路由算法是基于文档的_id。具体来说,Elasticsearch会对文档的_id进行哈希计算,然后对分片数量取模,以确定该文…...

【08-飞线和布线与输出文件】

导入网表后 1.复制结构图(带板宽的) 在机械一层画好外围线 2.重新定义板子形状(根据选则对象取定义) 选中对象生成板子线条形状 3.PCB和原理图交叉选择模式 过滤器选择原理图里的元器件 过滤器"OFF",只开启Componnets,只是显示元器件 4. 模块化布局 PCB高亮元…...

python 从知网的期刊导航页面抓取与农业科技相关的数据

要从知网的期刊导航页面抓取与农业科技相关的数据,并提取《土壤学报》2016年06期的结果,可以使用requests库来获取网页内容,BeautifulSoup库来解析HTML。由于知网页面结构可能会发生变化,在实际使用中,需要根据页面结构…...

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…...

机器学习优化算法:从梯度下降到Adam及其变种

机器学习优化算法:从梯度下降到Adam及其变种 引言 最近deepseek的爆火已然说明,在机器学习领域,优化算法是模型训练的核心驱动力。无论是简单的线性回归还是复杂的深度神经网络,优化算法的选择直接影响模型的收敛速度、泛化性能…...

.NET Core 中依赖注入的使用

ASP.NET Core中服务注入的地方 在ASP.NET Core项目中一般不需要自己创建ServiceCollection、IServiceProvider。在Program.cs的builder.Build()之前向builder.Services中注入。在Controller中可以通过构造方法注入服务。 低使用频率的服务 把Action用到的服务通过Action的参…...

XML Schema 数值数据类型

XML Schema 数值数据类型 引言 XML Schema 是一种用于描述 XML 文档结构的语言。它定义了 XML 文档中数据的有效性和结构。在 XML Schema 中,数值数据类型是非常重要的一部分,它定义了 XML 文档中可以包含的数值类型。本文将详细介绍 XML Schema 中常用的数值数据类型,以及…...

【机器学习理论】生成模型和判别模型

生成模型和判别模型是机器学习中两种不同的建模方式。生成模型关注的是联合概率分布 P ( X , Y ) P(X, Y) P(X,Y),即同时考虑数据 X X X和标签 Y Y Y的关系;判别模型则直接学习条件概率 P ( Y ∣ X ) P(Y|X) P(Y∣X)或决策边界。 生成模型 生成模型的目…...

ZZNUOJ(C/C++)基础练习1031——1040(详解版)

1031 : 判断点在第几象限 题目描述 从键盘输入2个整数x、y值,表示平面上一个坐标点,判断该坐标点处于第几象限,并输出相应的结果。 输入 输入x,y值表示一个坐标点。坐标点不会处于x轴和y轴上,也不会在原点。 输出 输出…...

使用PyTorch实现逻辑回归:从训练到模型保存与性能评估

1. 引入必要的库 首先,需要引入必要的库。PyTorch用于构建和训练模型,pandas和numpy用于数据处理,scikit-learn用于计算性能指标。 import torch import torch.nn as nn import torch.optim as optim import pandas as pd import numpy as …...

【C语言】main函数解析

文章目录 一、前言二、main函数解析三、代码示例四、应用场景 一、前言 在学习编程的过程中,我们很早就接触到了main函数。在Linux系统中,当你运行一个可执行文件(例如 ./a.out)时,如果需要传入参数,就需要…...

本地部署 DeepSeek 模型并使用 WebUI 调用

概述 本文将详细介绍如何在本地部署 DeepSeek 模型,并通过 WebUI 调用该模型。我们将使用 open-webui 作为 Web 界面工具,展示如何将 DeepSeek 模型集成到 WebUI 中,并提供一个用户友好的交互界面。 环境准备 在开始之前,请确保你的系统满足以下要求: Python 3.11 或更高…...

深度学习练手小例子——cifar10数据集分类问题

CIFAR-10 是一个经典的计算机视觉数据集,广泛用于图像分类任务。它包含 10 个类别的 60,000 张彩色图像,每张图像的大小是 32x32 像素。数据集被分为 50,000 张训练图像和 10,000 张测试图像。每个类别包含 6,000 张图像,具体类别包括&#x…...

【Git】初识Git Git基本操作详解

文章目录 学习目标Ⅰ. 初始 Git💥注意事项 Ⅱ. Git 安装Linux-centos安装Git Ⅲ. Git基本操作一、创建git本地仓库 -- git init二、配置 Git -- git config三、认识工作区、暂存区、版本库① 工作区② 暂存区③ 版本库④ 三者的关系 四、添加、提交更改、查看提交日…...

【JavaEE进阶】应用分层

目录 🎋序言 🍃什么是应用分层 🎍为什么需要应用分层 🍀如何分层(三层架构) 🎄MVC和三层架构的区别和联系 🌳什么是高内聚低耦合 🎋序言 通过上⾯的练习,我们学习了SpringMVC简单功能的开…...

OpenAI推出o3-mini推理模型,首次免费开放,性能超越o1,AIME测试准确率高达87.3%

OpenAI在2025年初推出了一款新的推理模型o3-mini,这款模型标志着公司在提升性能的同时也降低了成本,并且首次向免费用户提供访问权限。o3-mini是OpenAI推理系列中最新、最具成本效益的模型,在科学、数学、编程等领域的性能显著超越了之前的o1…...

【数据结构篇】时间复杂度

一.数据结构前言 1.1 数据结构的概念 数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如&#xff1a…...

网站快速收录:如何优化网站头部与底部信息?

本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/46.html 为了加快网站的收录速度,优化网站头部与底部信息是关键一环。以下是一些具体的优化建议: 网站头部信息优化 标题标签(TitleTag)优化…...

【数据结构】_链表经典算法OJ(力扣/牛客第二弹)

目录 1. 题目1:返回倒数第k个节点 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 题目2:链表的回文结构 2.1 题目链接及描述 2.2 解题思路 2.3 程序 1. 题目1:返回倒数第k个节点 1.1 题目链接及描述 题目链接: 面试题 …...

深度学习之“缺失数据处理”

缺失值检测 缺失数据就是我们没有的数据。如果数据集是由向量表示的特征组成,那么缺失值可能表现为某些样本的一个或多个特征因为某些原因而没有测量的值。通常情况下,缺失值由特殊的编码方式。如果正常值都是正数,那么缺失值可能被标记为-1…...

C#面试常考随笔8:using关键字有哪些用法?

1. using 指令:引入命名空间 最常用的用法。通过using 命名空间名字,可以在程序中直接使用该命名空间中的类型,而无需指定类型的完整命名空间路径。例如: using System; using System.Collections.Generic; class Program {sta…...

Writing an Efficient Vulkan Renderer

本文出自GPU Zen 2。 Vulkan 是一个新的显式跨平台图形 API。它引入了许多新概念,即使是经验丰富的图形程序员也可能不熟悉。Vulkan 的主要目标是性能——然而,获得良好的性能需要深入了解这些概念及其高效应用方法,以及特定驱动程序实现的实…...

解决Django非ORM模型提示初始化request问题

提问 Django在DRF时候自定义显示一些非model的字段提示TypeError: Field.__init__() got an unexpected keyword argument request 解答1 错误提示 TypeError: Field.__init__() got an unexpected keyword argument request 显示在创建序列化器实例时,传递了一个…...

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么? 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…...

C++解决输入空格字符串的三种方法

一.gets和fgets char * gets ( char * str ); char * fgets ( char * str, int num, FILE * stream ); 1. gets 是从第⼀个字符开始读取,⼀直读取到 \n 停⽌,但是不会读取 \n ,也就是读取到的内容 中没有包含 \n ,但是会在读取到的内…...