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

news/2025/3/29 7:23:15/

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

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() 关闭浏览器。

python">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.ppmy.cn/news/1582844.html

相关文章

【PyTorch][chapter-38][MOE-load balancing】[3]

前言: 专家混合模型的基本思想是在深度学习时代之前提出的,可以追溯到 90 年代,当时罗伯特雅各布斯 (Robert Jacobs) 与“人工智能教父”杰弗里辛顿 (Geoffrey Hinton) 及其同事提出了“局部专家自适应混合模型”。他们提出了将神经网络划分为…

Redis Cluster核心机制:数据分片、故障转移与常用运维命令详解

Redis Cluster是Redis官方提供的分布式解决方案,通过数据分片、故障转移和自动重配置等机制,实现了高可用性和横向扩展能力。本文将深入解析Redis Cluster的核心机制,并结合实际运维场景,详细介绍常用的运维命令。 1 Redis Cluste…

代码随想录算法训练营第十五天|右旋字符串

文档讲解:代码随想录 难度:easy 附:冲 passion!!!passion!!!passion!!! 卡码网题目链接(opens new window) 字符串的右旋转操作是把…

FOC——Butterworth (巴特沃斯)数字滤波器(2025.03.18)

参考链接1: [DSP] Butterworth (巴特沃斯)数字滤波器设计参考 参考链接2: 陈佩青《数字信号处理教程》 参考链接3: ButterWorthFIlter(巴特沃斯滤波器) 在此感谢各位前辈大佬的总结,写这个只是为了记录学习大佬资料的过程,内容基本…

一文读懂Python之json模块(33)

一、json模块介绍 json模块的功能是将序列化的json数据从文件里读取出来或者存入文件。json是一种轻量级的数据交换格式,在大部分语言中,它被理解为数组(array)。 json模块序列化与反序列化的过程分别是 encoding和 decoding。e…

卷积神经网络 - 参数学习

本文我们通过两个简化的例子,展示如何从前向传播、损失计算,到反向传播推导梯度,再到参数更新,完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络,其结构仅包含一个卷积层和一个输出…

【开源宝藏】30天学会CSS - DAY3 第三课 滑动文本+变色

以下是一个逐步拆解的中文教程,帮助你理解并复刻这个文字平滑滑动,并在不同背景区域显示不同文字颜色的示例。该示例的核心是:在页面中有两部分背景(左侧红色、右侧浅绿色),同一句文字在水平方向滑动时&…

分享下web3j 常见用法

转账 fun sendEthTransaction(privateKey: String,toAddress: String,amount: BigDecimal) {//chainIdval chainId:Long 1//url 可以从https://chainlist.org/里面获取可用节点//eth转账,bnb同理,但需发送到bnb对应节点val url "https://xxx"…