使用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块来处理可能的数据异常,确保程序不会因为单条数据问题而中断。

在这里插入图片描述

项目亮点 ✨

  1. 完整的错误处理机制 - 确保程序稳定运行
  2. 数据清洗规范化 - 对原始数据进行统一格式化处理
  3. 编码问题解决 - 使用utf-8-sig编码避免Excel中文乱码
  4. 详细日志输出 - 实时监控数据爬取进度

注意事项 ⚠️

  1. 遵守robots.txt - 在爬取前请检查网站的robots.txt文件
  2. 设置请求间隔 - 避免对目标网站造成过大压力
  3. 反爬应对 - 可能需要处理验证码、IP封禁等问题
  4. 数据更新 - 网站结构变化时需要调整XPath路径

扩展建议 🚀

  • 添加多页面爬取功能
  • 集成代理IP池应对反爬
  • 添加数据可视化分析
  • 设置定时任务自动更新数据

通过这个项目,我们不仅学会了如何使用Xpath进行网页数据爬取,还掌握了数据清洗、异常处理和文件存储等实用技能。希望这篇教程对你有帮助!💡

如果有任何问题,欢迎在评论区留言讨论!😊

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐