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]:【爬蟲】安居客二手房數據爬取

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894403.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894403.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894403.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV:開運算

目錄 1. 簡述 2. 用腐蝕和膨脹實現開運算 2.1 代碼示例 2.2 運行結果 3. 開運算接口 3.1 參數詳解 3.2 代碼示例 3.3 運行結果 4. 開運算應用場景 5. 注意事項 6. 總結 相關閱讀 OpenCV:圖像的腐蝕與膨脹-CSDN博客 OpenCV:閉運算-CSDN博客 …

JavaWeb入門-請求響應(Day3)

(一)請求響應概述 請求(HttpServletRequest):獲取請求數據 響應(HttpServletResponse):設置響應數據 BS架構:Browser/Server,瀏覽器/服務器架構模式。客戶端只需要瀏覽器就可訪問,應用程序的邏輯和數據都存儲在服務端(維護方便,響應速度一般) CS架構:Client/ser…

【SLAM】于AutoDL云上GPU運行GCNv2_SLAM的記錄

配置GCNv2_SLAM所需環境并實現AutoDL云端運行項目的全過程記錄。 本文首發于?慕雪的寒舍 1. 引子 前幾天寫了一篇在本地虛擬機里面CPU運行GCNv2_SLAM項目的博客:鏈接,關于GCNv2_SLAM項目相關的介紹請移步此文章,本文不再重復說明。 GCNv2:…

羅格斯大學:通過輸入嵌入對齊選擇agent

📖標題:AgentRec: Agent Recommendation Using Sentence Embeddings Aligned to Human Feedback 🌐來源:arXiv, 2501.13333 🌟摘要 🔸多代理系統必須決定哪個代理最適合給定的任務。我們提出了一種新的架…

【實戰篇】Android安卓本地離線實現視頻檢測人臉

實戰篇Android安卓本地離線實現視頻檢測人臉 引言項目概述核心代碼類介紹人臉檢測流程項目地址總結 引言 在當今數字化時代,人臉識別技術已經廣泛應用于各個領域,如安防監控、門禁系統、移動支付等。本文將以第三視角詳細講解如何基于bifan-wei-Face/De…

團體程序設計天梯賽-練習集——L1-025 正整數A+B

一年之際在于春,新年的第一天,大家敲代碼了嗎?哈哈 前言 這道題分值是15分,值這個分,有一小點運算,難度不大,雖然說做出來了,但是有兩個小疑點。 L1-025 正整數AB 題的目標很簡單…

Leetcode:598

1,題目 2,思路 腦筋急轉彎,看題目一時半會還沒搞懂意思。 其實不然就是說ops是個矩陣集合,集合的每個矩陣有倆個元素理解為行列邊距 m和n是理解為一個主矩陣,計算ops的每個小矩陣還有這個主矩陣的交集返回面積 3&…

web前端12--表單和表格

1、表格標簽 使用<table>標簽來定義表格 HTML 中的表格和Excel中的表格是類似的&#xff0c;都包括行、列、單元格、表頭等元素。 區別&#xff1a;HTML表格在功能方面遠沒有Excel表格強大&#xff0c;HTML表格不支持排序、求和、方差等數學計算&#xff0c;主要用于布…

為何 git 默認是 master分支,而github默認是main分支(DeepSeek問答)

為何 git 默認是 master分支&#xff0c;而github默認是main分支 Git 和 GitHub 在默認分支名稱上的差異源于歷史背景和社會因素的變化。 Git 的 master 分支 歷史原因&#xff1a;Git 由 Linus Torvalds 于 2005 年創建&#xff0c;最初使用 master 作為默認分支名稱&#x…

【AI】探索自然語言處理(NLP):從基礎到前沿技術及代碼實踐

Hi &#xff01; 云邊有個稻草人-CSDN博客 必須有為成功付出代價的決心&#xff0c;然后想辦法付出這個代價。 目錄 引言 1. 什么是自然語言處理&#xff08;NLP&#xff09;&#xff1f; 2. NLP的基礎技術 2.1 詞袋模型&#xff08;Bag-of-Words&#xff0c;BoW&#xff…

Java集合+并發(部分)

Java集合 Java集合類的繼承結構和各自的適用情況 Collection ? — List ? — ArrayList&#xff1a;動態數組 ? — LinkedList&#xff1a;底層是雙向鏈表&#xff0c;應用于Queue接口可以用于實現隊列&#xff0c;應用于Deque接口可以用于實現棧 ? — Vector&#x…

第1章 量子暗網中的血色黎明

月球暗面的危機與陰謀 量子隧穿效應催生的幽藍電弧&#xff0c;于環形山表面肆意跳躍&#xff0c;仿若無數奮力掙扎的機械蠕蟲&#xff0c;將月球暗面的死寂打破&#xff0c;徒增幾分詭異。艾麗佇立在被遺棄的“廣寒宮”量子基站頂端&#xff0c;機械義眼之中&#xff0c;倒映著…

AI-ISP論文Learning to See in the Dark解讀

論文地址&#xff1a;Learning to See in the Dark 圖1. 利用卷積網絡進行極微光成像。黑暗的室內環境。相機處的照度小于0.1勒克斯。索尼α7S II傳感器曝光時間為1/30秒。(a) 相機在ISO 8000下拍攝的圖像。(b) 相機在ISO 409600下拍攝的圖像。該圖像存在噪點和色彩偏差。©…

Python3 【高階函數】項目實戰:5 個學習案例

Python3 【高階函數】項目實戰&#xff1a;5 個學習案例 本文包含 5 個關于“高階函數”的綜合應用項目&#xff0c;每個項目都包含完整的程序代碼、測試案例和執行結果。具體項目是&#xff1a; 成績統計分析單詞統計工具簡易計算器工廠任務調度器數據管道處理 項目 1&#…

【Git】初識Git Git基本操作詳解

文章目錄 學習目標Ⅰ. 初始 Git&#x1f4a5;注意事項 Ⅱ. Git 安裝Linux-centos安裝Git Ⅲ. Git基本操作一、創建git本地倉庫 -- git init二、配置 Git -- git config三、認識工作區、暫存區、版本庫① 工作區② 暫存區③ 版本庫④ 三者的關系 四、添加、提交更改、查看提交日…

RK3568使用QT操作LED燈

文章目錄 一、QT中操作硬件設備思路Linux 中的設備文件操作硬件設備的思路1. 打開設備文件2. 寫入數據到設備3. 從設備讀取數據4. 設備控制5. 異常處理在 Qt 中操作設備的典型步驟實際應用中的例子:控制 LED總結二、QT實戰操作LED燈設備1. `mainwindow.h` 頭文件2. `mainwindo…

分布式微服務系統架構第90集:現代化金融核心系統

#1.1 深化數字化轉型&#xff0c;核心面臨新挑戰 1、架構側&#xff1a;無法敏捷協同數字金融經營模式轉型。 2、需求側&#xff1a;業務需求傳導低效始終困擾金融機構。 3、開發側&#xff1a;創新產品上市速度低于期望。 4、運維側&#xff1a;傳統面向資源型監控體系難以支撐…

使用 Spring JDBC 進行數據庫操作:深入解析 JdbcTemplate

目錄 1. Spring JDBC 簡介 2. JdbcTemplate 介紹 3. 創建數據庫和表 4. 配置 Spring JDBC 5. 創建實體類 6. 使用 JdbcTemplate 實現增、刪、改、查操作 7. Spring JDBC 優點 8. 小結 1. Spring JDBC 簡介 Spring JDBC 是 Spring 框架中的一個模塊&#xff0c;旨在簡化…

BUUCTF [Black Watch 入群題]PWN1 題解

1.下載文件 exeinfo checksec 32位 IDA32 看到關鍵函數 read兩次 第一次read的變量s在bss段&#xff1b;第二次的buf到ebp距離為 24 但是第二次的read字節只能剛好填滿返回地址 傳不進去變量 所以想到棧遷移 將棧移動到變量s所在位置上來 同時 這題開了NX 無直接的binsh和s…

CentOS 上安裝 Go (Golang)

1. 檢查系統環境 確保系統為 CentOS 7 或 CentOS 8&#xff0c;或者其他兼容的 Linux 發行版。 cat /etc/os-release2. 安裝依賴 安裝一些必要的工具&#xff1a; sudo yum update -y sudo yum install -y wget tar3. 下載 Go 從 Go 官方下載頁面獲取適用于 Linux 的最新版…