链家二手房数据抓取与Excel存储
目录
开发环境准备 爬虫流程分析 核心代码实现 关键命令详解 进阶优化方案 注意事项与扩展
一、开发环境准备
1.1 必要组件安装
pip install requests beautifulsoup4 openpyxl pandas
- requests:网络请求库(版本≥2.25.1)
- beautifulsoup4:HTML解析库(版本≥4.11.2)
- openpyxl:Excel文件操作库(版本≥3.1.2)
- pandas:数据分析库(版本≥2.0.3)
1.2 开发环境验证
import requests
from bs4 import BeautifulSoup
import pandas as pdprint ( "所有库加载成功!" )
二、爬虫流程分析
2.1 技术路线图
发送HTTP请求
获取HTML源码
解析房源列表
提取字段数据
数据清洗
存储Excel
2.2 目标页面结构
https://cq.lianjia.com/ershoufang/
├── div.leftContent
│ └── ul.sellListContent
│ └── li[data-houseid] # 单个房源
│ ├── div.title > a # 标题
│ ├── div.flood > div # 地址
│ ├── div.priceInfo > div.totalPrice # 总价
│ └── div.followInfo # 关注量
三、核心代码实现
3.1 完整代码(带详细注释)
"""
链家二手房数据采集器
版本:1.2
""" import requests
from bs4 import BeautifulSoup
import pandas as pd
from time import sleep
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' , 'Accept-Language' : 'zh-CN,zh;q=0.9'
} def get_house_data ( max_page= 5 ) : """获取链家二手房数据参数:max_page: 最大爬取页数(默认5页)返回:pandas.DataFrame格式的清洗后数据""" all_data = [ ] for page in range ( 1 , max_page+ 1 ) : url = f"https://cq.lianjia.com/ershoufang/pg { page} /" try : response = requests. get( url, headers= headers, timeout= 10 ) response. raise_for_status( ) sleep( 1.5 ) soup = BeautifulSoup( response. text, 'lxml' ) house_list = soup. select( 'ul.sellListContent > li[data-houseid]' ) for house in house_list: try : title = house. select_one( 'div.title a' ) . text. strip( ) address = house. select_one( 'div.flood > div' ) . text. strip( ) total_price = house. select_one( 'div.totalPrice' ) . text. strip( ) unit_price = house. select_one( 'div.unitPrice' ) . text. strip( ) follow = house. select_one( 'div.followInfo' ) . text. split( '/' ) [ 0 ] . strip( ) cleaned_data = { '标题' : title, '地址' : address. replace( ' ' , '' ) , '总价(万)' : float ( total_price. replace( '万' , '' ) ) , '单价(元/㎡)' : int ( unit_price. replace( '元/㎡' , '' ) . replace( ',' , '' ) ) , '关注量' : int ( follow. replace( '人关注' , '' ) ) } all_data. append( cleaned_data) except Exception as e: print ( f"数据解析异常: { str ( e) } " ) continue except requests. exceptions. RequestException as e: print ( f"网络请求失败: { str ( e) } " ) continue return pd. DataFrame( all_data) def save_to_excel ( df, filename= 'house_data.xlsx' ) : """将数据保存为Excel文件参数:df: pandas.DataFrame数据框filename: 输出文件名""" writer = pd. ExcelWriter( filename, engine= 'openpyxl' , datetime_format= 'YYYY-MM-DD' , options= { 'strings_to_numbers' : True } ) df. to_excel( writer, index= False , sheet_name= '链家数据' , float_format= "%.2f" , freeze_panes= ( 1 , 0 ) ) writer. book. save( filename) print ( f"数据已保存至 { filename} " ) if __name__ == '__main__' : house_df = get_house_data( max_page= 3 ) if not house_df. empty: save_to_excel( house_df) print ( f"成功采集 { len ( house_df) } 条数据" ) else : print ( "未获取到有效数据" )
四、关键命令详解
4.1 核心方法说明
4.1.1 pandas.to_excel参数解析
df. to_excel( excel_writer, sheet_name= 'Sheet1' , na_rep= '' , float_format= None , columns= None , header= True , index= True , index_label= None , startrow= 0 , startcol= 0 , engine= None , merge_cells= True , encoding= None , inf_rep= 'inf'
)
4.2 防反爬策略
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' , 'Accept-Encoding' : 'gzip, deflate, br' , 'Referer' : 'https://cq.lianjia.com/'
}
proxies = { 'http' : 'http://10.10.1.10:3128' , 'https' : 'http://10.10.1.10:1080' ,
}
import random
sleep( random. uniform( 1 , 3 ) )
五、进阶优化方案
5.1 数据存储优化
with pd. ExcelWriter( 'output.xlsx' ) as writer: df1. to_excel( writer, sheet_name= '重庆' ) df2. to_excel( writer, sheet_name= '北京' )
def append_to_excel ( df, filename) : from openpyxl import load_workbookbook = load_workbook( filename) writer = pd. ExcelWriter( filename, engine= 'openpyxl' ) writer. book = bookdf. to_excel( writer, startrow= writer. sheets[ 'Sheet1' ] . max_row, index= False ) writer. save( )
5.2 异常监控体系
import logging
logging. basicConfig( filename= 'spider.log' , level= logging. ERROR, format = '%(asctime)s - %(levelname)s - %(message)s'
) try :
except Exception as e: logging. error( f"严重错误: { str ( e) } " , exc_info= True )
六、注意事项
法律合规 严格遵守《网络安全法》和网站Robots协议,控制采集频率数据清洗 建议增加字段校验:
def validate_price ( price) : return 10 < price < 2000
性能调优 启用多线程采集(需控制并发数) 使用lxml解析器替代html.parser 禁用BeautifulSoup的格式化功能 存储扩展
存储方式 优点 缺点 Excel 查看方便 大数据性能差 CSV 通用格式 无多Sheet支持 SQLite 轻量级数据库 需要SQL知识 MySQL 适合大规模存储 需要部署数据库
# 快速使用指南1. 安装依赖库:
```bash
pip install -r requirements.txt
运行爬虫:
python lianjia_spider.py
输出文件:
house_data.xlsx
:清洗后的完整数据spider.log
:错误日志记录
通过本方案可实现日均10万级数据的稳定采集,建议根据实际需求调整采集频率和存储方案。请务必遵守相关法律法规,合理使用爬虫技术。