Python爬虫爬取链家网租房房源数据
·
使用Python+Xpath自动化爬取链家租房数据 🏠
本文主要介绍如何使用Python的Xpath库自动化爬取链家租房数据,并将数据保存为CSV文件。
项目概述 📋
本项目通过Python的Xpath库实现了对链家租房网站的数据自动化爬取,能够获取包括房源标题、类型、区域、面积、价格等关键信息,并将数据规整地保存到CSV文件中。
技术栈 🛠️
- Python 3.x
- lxml - HTML解析
- csv - 数据存储
代码详解 🔍
1. 导入必要库
import requests
from lxml import etree
import csv # 导入csv模块
requests:用于发送HTTP请求lxml.etree:用于解析HTML文档csv:用于将数据写入CSV文件
2. 设置请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'
}
设置User-Agent模拟真实浏览器访问,避免被网站反爬机制拦截。
3. 发送请求获取页面内容
url = 'https://hz.lianjia.com/zufang/pg30/#contentList'
res = requests.get(url, headers=headers)
html = etree.HTML(res.text)
这里我们请求杭州链家租房的第30页内容,并使用lxml解析HTML。
4. 数据解析 📊
项目通过XPath定位提取多种房源信息:
# 房源名称
name = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[1]/a/text()')
# 详情页链接
hrefs = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[1]/a/@href')
# 房源标签
tags = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[3]/i[1]/text()')
# 区域信息
district = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[2]/a[1]/text()')
# 街道信息
street = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[2]/a[2]/text()')
# 面积信息(需要进行数据清洗)
floor_space1 = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[2]/text()[5]')
# 朝向信息
orientation = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[2]/text()[6]')
# 户型信息
house_type = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/p[2]/text()[7]')
# 价格信息
price = html.xpath('//*[@id="content"]/div[1]/div[1]/div/div/span/em/text()')
# 图片链接
imgs = html.xpath('//*[@id="content"]/div[1]/div[1]/div/a/img/@data-src')
5. 数据清洗与处理 🧹
# 清理房源名称中的空值
name = [x.strip() for x in name if x.strip() != '']
# 处理面积数据,移除单位并清理格式
floor_space = []
for i in floor_space1:
floor_space1 = str(i).replace('㎡', '').replace("\n", '').replace(' ', '')
floor_space.append(floor_space1)
# 清理户型数据
house_type = [x.strip() for x in house_type if x.strip() != '']
6. 数据存储 💾
# 打开CSV文件准备写入(使用utf-8-sig编码解决Excel中文乱码)
with open('hangzhou_house.csv', 'a+', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file)
# 写入CSV表头
writer.writerow(
['标题', '类型', '楼栋', '区域', '街道', '面积(㎡)', '朝向', '价格(元/月)', '链接', '标签', '图片链接'])
使用utf-8-sig编码可以避免在Excel中打开CSV文件时出现中文乱码问题。
7. 数据处理与写入
for i in range(len(name)):
try:
# 数据清洗与分割
title = name[i].split('·')[1].split(' ')[0]
type_ = name[i].split('·')[0] # 避免与关键字type冲突,加下划线
building = name[i].split('·')[1].split(' ')[1]
city = district[i]
street1 = street[i]
# 处理面积数据
area = 80.0 if '.' not in floor_space[i].strip() else float(floor_space[i].strip())
direct = orientation[i].strip().replace('㎡', '')
price1 = float(price[i])
tag = tags[i]
link = hrefs[i]
img = imgs[i]
# 将数据写入CSV
writer.writerow([title, type_, building, city, street1, area, direct, price1, link, tag, img])
print(f'成功写入第{i + 1}条数据')
except Exception as e:
print(f'第{i + 1}条数据写入失败,错误原因:{e}')
这里使用try-except块来处理可能的数据异常,确保程序不会因为单条数据问题而中断。

项目亮点 ✨
- 完整的错误处理机制 - 确保程序稳定运行
- 数据清洗规范化 - 对原始数据进行统一格式化处理
- 编码问题解决 - 使用
utf-8-sig编码避免Excel中文乱码 - 详细日志输出 - 实时监控数据爬取进度
注意事项 ⚠️
- 遵守robots.txt - 在爬取前请检查网站的robots.txt文件
- 设置请求间隔 - 避免对目标网站造成过大压力
- 反爬应对 - 可能需要处理验证码、IP封禁等问题
- 数据更新 - 网站结构变化时需要调整XPath路径
扩展建议 🚀
- 添加多页面爬取功能
- 集成代理IP池应对反爬
- 添加数据可视化分析
- 设置定时任务自动更新数据
通过这个项目,我们不仅学会了如何使用Xpath进行网页数据爬取,还掌握了数据清洗、异常处理和文件存储等实用技能。希望这篇教程对你有帮助!💡
如果有任何问题,欢迎在评论区留言讨论!😊
更多推荐
所有评论(0)