当前位置: 首页 > article >正文

用Selenium+lxml库完成淄博链家网数据的爬取

一、淄博链家二手房网站地址

url=https://zb.lianjia.com/ershoufang/

二、基本知识点总结 

这个代码是一个使用 Selenium 和 lxml 库编写的网络爬虫,用于从链家网(Lianjia)的二手房列表页面中提取房屋信息。

代码结构

  1. 导入库

    • time:用于控制时间延迟。

    • lxml.etree:用于解析 HTML 文档并提取数据。

    • selenium:用于自动化浏览器操作,模拟用户点击和页面跳转。

    • selenium.webdriver:提供浏览器驱动(如 ChromeDriver)。

    • selenium.webdriver.support.ui.WebDriverWait:用于等待页面元素加载。

    • selenium.webdriver.common.by.By:用于定位页面元素。

  2. 配置 ChromeDriver

    • 指定 ChromeDriver 的路径,并初始化 Service 对象。

  3. 解析详情页

    • parse_detail_page(link):打开详情页,等待页面加载完成后调用 parse_detail_info 提取信息,然后关闭详情页并返回列表页。

  4. 解析详情页信息

    • parse_detail_info(source):使用 lxml.etree 解析 HTML 源码,提取价格、标题、地址、面积和户型等信息。

  5. 主循环

    • 打开链家网的二手房列表页面。

    • 使用 lxml.etree 解析列表页,获取每个房源的链接。

    • 遍历每个房源链接,调用 parse_detail_page 提取详细信息。

    • 点击“下一页”按钮,重复上述过程,直到没有下一页为止。

  6. 关闭浏览器

    • 在所有操作完成后,关闭浏览器。


基本知识点

  1. Selenium

    • Selenium 是一个用于自动化浏览器操作的工具,常用于网页测试和爬虫。

    • 通过 webdriver.Chrome 启动 Chrome 浏览器。

    • 使用 driver.get(url) 打开指定网页。

    • 使用 driver.execute_script 执行 JavaScript 代码(如打开新标签页)。

    • 使用 driver.switch_to.window 切换浏览器标签页。

  2. 页面元素定位

    • 使用 WebDriverWait 和 EC.presence_of_element_located 等待页面元素加载完成。

    • 使用 By.XPATH 或 By.CLASS_NAME 等方式定位页面元素。

    • 使用 driver.find_element 或 driver.find_elements 查找单个或多个元素。

  3. XPath

    • XPath 是一种用于在 XML 或 HTML 文档中定位节点的语言。

    • 代码中使用 XPath 提取房源链接、价格、标题、地址等信息。

    • 例如://div[@class="price-container"]//span[@class="total"]/text() 提取价格。

  4. lxml.etree

    • lxml 是一个高效的 HTML/XML 解析库。

    • 使用 etree.HTML(source) 将 HTML 源码转换为可解析的对象。

    • 使用 xpath() 方法提取数据。

  5. 异常处理

    • 使用 try-except 捕获异常(如未找到链接或下一页按钮),避免程序崩溃。

  6. 翻页逻辑

    • 通过查找“下一页”按钮并点击实现翻页。

    • 如果“下一页”按钮包含 disabled 类,则停止翻页。

这段代码是一个典型的 Selenium 爬虫,通过模拟用户操作从链家网提取二手房信息。它结合了 Selenium 的浏览器自动化能力和 lxml 的高效解析能力,适合处理需要 JavaScript 渲染的动态网页。通过学习这段代码,可以掌握 Selenium 的基本用法、XPath 数据提取技巧以及爬虫的翻页逻辑。 

三、具体代码以及详解 

  1. 配置 ChromeDriver

    • 指定 ChromeDriver 的路径,并创建 Service 对象,用于管理 ChromeDriver 的启动和停止。

  2. 解析详情页

    • 使用 driver.execute_script 打开新标签页并跳转到详情页。

    • 使用 driver.switch_to.window 切换到新标签页。

    • 使用 WebDriverWait 等待详情页的关键元素加载完成。

    • 调用 parse_detail_info 函数提取详情页信息。

    • 关闭详情页并切换回列表页。

  3. 解析详情页信息

    • 使用 lxml.etree 解析 HTML 源码。

    • 使用 XPath 提取价格、标题、地址、面积和户型等信息。

    • 如果未找到某个信息,则打印“未知”。

  4. 主循环

    • 启动 Chrome 浏览器并打开链家网的二手房列表页面。

    • 使用 WebDriverWait 等待房源列表加载完成。

    • 使用 lxml.etree 解析列表页,提取每个房源的链接。

    • 遍历每个房源链接,调用 parse_detail_page 提取详细信息。

    • 点击“下一页”按钮,重复上述过程,直到没有下一页为止。

  5. 异常处理

    • 在提取链接或点击“下一页”按钮时,捕获异常并处理,避免程序崩溃。

  6. 关闭浏览器

    • 在所有操作完成后,调用 driver.quit() 关闭浏览器。

import time
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

# 配置 ChromeDriver
# 指定 ChromeDriver 的路径
driver_path = r"D:\chromdriver\chromedriver-win64\chromedriver.exe"
# 创建 Service 对象,用于管理 ChromeDriver 的启动和停止
service = Service(executable_path=driver_path)


# 解析详情页
def parse_detail_page(link):
    """
    打开详情页并提取信息
    :param link: 详情页的 URL
    """
    # 使用 JavaScript 打开新标签页并跳转到详情页
    driver.execute_script("window.open('%s')" % link)
    # 切换到新打开的标签页(详情页)
    driver.switch_to.window(driver.window_handles[1])

    # 等待详情页加载完成
    # 使用 WebDriverWait 等待价格容器元素加载完成,最多等待 10 秒
    WebDriverWait(driver, timeout=10).until(
        EC.presence_of_element_located((By.XPATH, '//div[@class="price-container"]'))
    )

    # 解析详情页信息
    # 调用 parse_detail_info 函数,传入当前页面的 HTML 源码
    parse_detail_info(driver.page_source)

    # 关闭详情页,切换回列表页
    time.sleep(2)  # 等待 2 秒,确保操作完成
    driver.close()  # 关闭当前标签页(详情页)
    driver.switch_to.window(driver.window_handles[0])  # 切换回列表页


# 解析详情页信息
def parse_detail_info(source):
    """
    从详情页的 HTML 源码中提取房屋信息
    :param source: 详情页的 HTML 源码
    """
    # 将 HTML 源码转换为 lxml 的 etree 对象,便于使用 XPath 提取数据
    html = etree.HTML(source)

    # 提取价格信息
    # 使用 XPath 定位价格元素,并提取文本内容
    price = html.xpath('//div[@class="price-container"]//span[@class="total"]/text()')
    print("价格:", price[0] if price else "未知")  # 如果找到价格则打印,否则打印“未知”

    # 提取房屋标题
    # 使用 XPath 定位标题元素,并提取文本内容
    title = html.xpath('//h1[@class="main"]/text()')
    print("标题:", title[0] if title else "未知")  # 如果找到标题则打印,否则打印“未知”

    # 提取地址信息
    # 使用 XPath 定位地址元素,并提取文本内容
    address = html.xpath('//div[@class="communityName"]//a/text()')
    print("地址:", address[0] if address else "未知")  # 如果找到地址则打印,否则打印“未知”

    # 提取面积信息
    # 使用 XPath 定位面积元素,并提取文本内容
    area = html.xpath('//div[@class="houseInfo"]//div[@class="area"]//div[@class="mainInfo"]/text()')
    print("面积:", area[0] if area else "未知")  # 如果找到面积则打印,否则打印“未知”

    # 提取户型信息
    # 使用 XPath 定位户型元素,并提取文本内容
    layout = html.xpath('//div[@class="houseInfo"]//div[@class="room"]//div[@class="mainInfo"]/text()')
    print("户型:", layout[0] if layout else "未知")  # 如果找到户型则打印,否则打印“未知”


# 主循环
while True:
    # 启动 Chrome 浏览器
    driver = webdriver.Chrome(service=service)
    # 打开链家网的二手房列表页面
    driver.get("https://zb.lianjia.com/ershoufang/")

    # 等待列表页加载完成
    # 使用 WebDriverWait 等待房源列表元素加载完成,最多等待 10 秒
    WebDriverWait(driver, timeout=10).until(
        EC.presence_of_element_located((By.XPATH, '//div[@class="leftContent"]//ul[@class="sellListContent"]'))
    )

    # 将列表页的 HTML 源码转换为 lxml 的 etree 对象
    html = etree.HTML(driver.page_source)
    # 使用 XPath 定位所有房源列表项
    lis = html.xpath('//div[@class="leftContent"]//ul[@class="sellListContent"]/li')

    # 遍历每个房源列表项
    for li in lis:
        try:
            # 提取房源的详情页链接
            link = li.xpath(".//a/@href")[0]  # 调整 XPath 表达式
            # 调用 parse_detail_page 函数,打开详情页并提取信息
            parse_detail_page(link)
        except IndexError:
            # 如果未找到链接,则跳过该条目
            print("未找到链接,跳过该条目")
            continue

    # 单击下一页按钮
    try:
        # 定位“下一页”按钮
        next_btn = driver.find_element(By.XPATH, "//div[@class='page-box house-lst-page-box']/a[last()]")
        # 检查“下一页”按钮是否被禁用(即是否到达最后一页)
        if "disabled" in next_btn.get_attribute("class"):
            break  # 如果到达最后一页,则退出循环
        else:
            # 点击“下一页”按钮
            driver.execute_script("arguments[0].click();", next_btn)
    except Exception as e:
        # 如果未找到“下一页”按钮或无法点击,则退出循环
        print("未找到下一页按钮或无法点击:", e)
        break

# 关闭浏览器
driver.quit()  # 退出浏览器

 四、运行结果展示


http://www.kler.cn/a/598322.html

相关文章:

  • 音频焦点 Android Audio Focus
  • 护网期间监测工作全解析:内容与应对策略
  • GeoTrust SSL证书有哪些种类?怎么申请?
  • 大数据从入门到入魔系列————大数据治理技术栈技术选型
  • CMake-环境变量介绍
  • Apache中间件漏洞攻略
  • 阿里qwen大模型AI智能分析实时对话生成病例的DEMO
  • 物联网(IoT)系统中,数据采集器拿来即用
  • 20届智能车赛规则已完成搜索
  • SpringBoot集成Flyway
  • iPhone 16怎么编辑图片?图片编辑技巧、软件分享
  • QT实现WPS功能
  • Excel 小黑第12套
  • 使用自定义指令实现css样式层叠
  • 使用PyTorch Lightning进行深度学习模型训练
  • 时序数据库QuestDB在Winform窗体应用
  • XSS 攻击向量与绕过技巧
  • 银河麒麟桌面版包管理器(三)
  • conda 常用命令
  • datetime“陷阱”与救赎:扒“时间差值”证道