链家二手房数据抓取与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 pd
print("所有库加载成功!")
二、爬虫流程分析
2.1 技术路线图
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_workbook
book = load_workbook(filename)
writer = pd.ExcelWriter(filename, engine='openpyxl')
writer.book = book
df.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万级数据的稳定采集,建议根据实际需求调整采集频率和存储方案。请务必遵守相关法律法规,合理使用爬虫技术。