使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)

news2025/3/31 22:42:15

一、地址:

url = "https://zb.newhouse.fang.com/house/s/b91"  # 第一页的 URL

但是这个爬虫我不知道为啥总是翻不了页数,请帮忙修改一下~

二、用到的知识点以及代码详解:

这段代码是一个使用Selenium和lxml库实现的网页爬虫,主要用于爬取房天下网站(https://fang.com)上淄博地区的新房信息。

主要功能

  1. 使用Selenium控制Chrome浏览器自动翻页爬取新房列表

  2. 对每个新房项目打开详情页提取详细信息

  3. 提取的信息包括:房屋标题、价格、地址、咨询电话和户型

  4. 自动处理翻页逻辑,直到最后一页

  5. 包含异常处理机制,防止程序意外中断

代码特点

  1. 自动化浏览器控制:使用Selenium模拟真实用户操作浏览器

  2. 显式等待:使用WebDriverWait确保元素加载完成后再进行操作

  3. 多标签页处理:在新标签页中打开详情页,不影响列表页状态

  4. 健壮性设计

    • 包含多种异常处理

    • 检查元素是否存在再操作

    • 处理浏览器意外关闭情况

  5. 数据提取:使用lxml的XPath高效提取所需信息

# 导入必要的库
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
from selenium.common.exceptions import InvalidSessionIdException

# 配置 ChromeDriver
service = Service(executable_path=r"D:\chromdriver\chromedriver-win64\chromedriver.exe")
driver = webdriver.Chrome(service=service)
driver.set_page_load_timeout(30)  # 设置页面加载超时时间为 30 秒


def parse_detail_page(link):
    """
    打开详情页并提取信息
    功能:在新标签页中打开详情页,等待页面加载完成后调用解析函数,最后关闭详情页标签
    参数:
        link: 详情页的URL链接
    """
    try:
        # 使用JavaScript在新标签页中打开链接
        driver.execute_script("window.open('%s')" % link)
        # 切换到新打开的标签页
        driver.switch_to.window(driver.window_handles[1])

        # 显式等待,直到价格信息元素加载完成
        WebDriverWait(driver, timeout=10).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="price_line clearfix"]'))
        )

        # 调用详情页解析函数
        parse_detail_info(driver.page_source)

    except Exception as e:
        print("解析详情页时出错:", e)
    finally:
        # 确保关闭详情页标签并切换回列表页
        if len(driver.window_handles) > 1:
            driver.close()
            driver.switch_to.window(driver.window_handles[0])


def parse_detail_info(source):
    """
    从详情页HTML源码中提取房屋信息
    功能:使用lxml解析HTML,提取房屋标题、价格、地址、电话和户型信息
    参数:
        source: 详情页的HTML源码
    """
    # 将HTML源码转换为lxml的HTML对象
    html = etree.HTML(source)

    # 提取房屋标题(位于h1标签内)
    title = html.xpath('//h1//text()')
    print("房屋价格:", title[0] if title else "未知")

    # 提取价格信息(位于class为price_line clearfix的div内)
    price = html.xpath('//div[@class="price_line clearfix"]//p//text()')
    price = " ".join(price).strip() if price else "未知"
    print("价格:", price)

    # 提取地址信息(id为xfptxq_B04_12的div内的span标签)
    address = html.xpath('//div[@id="xfptxq_B04_12"]/span/text()')
    print("地址:", address[0] if address else "未知")

    # 提取咨询电话(class为phone_num的元素内)
    phone = html.xpath('//*[@class="phone_num"]/span[2]/text()')
    phone = " ".join(phone).strip() if phone else "未知"
    print("咨询电话:", phone)

    # 提取户型信息(class为fl zlhx的div内的a标签)
    layout = html.xpath('//div[@class="fl zlhx"]/a/text()')
    layout = " ".join(layout).strip() if layout else "未知"
    print("户型:", layout)

    print("---------------------------------------------------------")


# 主程序入口
if __name__ == "__main__":
    # 初始URL(淄博新房列表第一页)
    url = "https://zb.newhouse.fang.com/house/s/b91"
    driver.get(url)

    try:
        # 主循环,持续爬取直到最后一页
        while True:
            print(f"正在爬取页面: {driver.current_url}")

            # 等待列表页加载完成(等待ul元素出现)
            WebDriverWait(driver, timeout=10).until(
                EC.presence_of_element_located((By.XPATH, '//div[@class="main_1200 tf"]//ul'))
            )

            # 解析列表页HTML
            html = etree.HTML(driver.page_source)
            # 获取所有房源列表项
            lis = html.xpath('//div[@class="main_1200 tf"]//ul/li')

            # 遍历每个房源项
            for li in lis:
                try:
                    # 获取房源详情页链接
                    link = li.xpath(".//a/@href")[0]
                    # 检查链接有效性(只处理房天下域名的链接)
                    if link.startswith("https://zb.newhouse.fang.com"):
                        parse_detail_page(link)
                    else:
                        print("跳过无效链接:", link)
                except IndexError:
                    print("未找到链接,跳过该条目")
                    continue

            # 翻页逻辑
            try:
                # 记录当前URL用于判断页面是否已跳转
                current_url = driver.current_url

                # 查找下一页按钮
                next_btn = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.XPATH, "//a[@class='next']"))
                )

                # 检查下一页按钮是否可用(是否已到最后一页)
                if "disabled" in next_btn.get_attribute("class"):
                    print("已到达最后一页,停止爬取")
                    break  # 退出循环
                else:
                    # 使用JavaScript点击下一页按钮(避免元素拦截问题)
                    driver.execute_script("arguments[0].click();", next_btn)

                    # 等待URL发生变化(页面跳转完成)
                    WebDriverWait(driver, 10).until(
                        lambda driver: driver.current_url != current_url
                    )

                    # 等待新页面的房源列表加载完成
                    WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((By.XPATH, '//div[@class="main_1200 tf"]//ul'))
                    )
                    time.sleep(2)  # 额外等待2秒确保页面完全加载

            except Exception as e:
                print("翻页时出错:", e)
                break  # 出错时退出循环

    # 处理浏览器会话异常(如浏览器意外关闭)
    except InvalidSessionIdException:
        print("浏览器会话已关闭,重新初始化浏览器...")
        driver.quit()
        # 重新初始化浏览器
        driver = webdriver.Chrome(service=service)
        driver.get(url)  # 重新加载初始页面
    finally:
        # 确保最终关闭浏览器
        driver.quit()

 三、运行结果

1.pycharm里面的代码运行结果

2.弹出的网页运行可视化展示 

这样就可以爬取到想要的数据了~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型训练过程中KVCache与MLA

基础内容 在Transformer模型中,每个token有qkv三个属性,分别通过神经网络变换得到。1 根据Transformer中注意力公式,每个token的q需要和之前所有的k计算注意力,然后经过Softmax函数后乘以之前所有token的V,得到最终的…

材质及制作笔记

基本流程: 建中模——zb雕刻高模——maya拓扑低模——拆uv——sp烘焙贴图——sp绘制材质——渲染 1 材质贴图: diffuse/albedo/basecolor:漫反射 reflection/specular:反射 metalness:金属度 glossiness&#xf…

语音机器人与智能体结合

自从春节期间deepseek的发布,大家对语音机器人接入大模型格外的关注。最近又收到一个需求,是语音机器人与智能体的结合。 什么是智能体? 智能体(Agent)是指能够感知环境并采取行动以实现目标的实体。根据其复杂程度&am…

Axios企业级封装实战:从拦截器到安全策略!!!

🚀 Axios企业级封装实战:从拦截器到安全策略 🔧 核心代码解析 // 创建Axios实例 const service axios.create({baseURL: api, // 🌐 全局API前缀timeout: 0, // ⏳ 永不超时(慎用!)withCrede…

Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步

一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统,执行安装Zerotier curl -s https://install.zerotier.com | sudo bash3、将树莓派网络加入Zerotier zerotier-cli join DB62228FEDF6CE55DB62228FEDF6CE55 为你的Zerotier IP 需…

51c嵌入式~三极管~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12208603 一、PNP与NPN两种三极管使用方法 分享这篇文章总结下关于NPN和PNP两种型号三极管的使用和连接方法。 在单片机应用电路中三极管主要的作用就是开关作用。 PNP与NPN两种三极管使用方法 上图中,横向左…

SQL中累计求和与滑动求和函数sum() over()的用法

[TOC](SQL中累计求和与滑动求和函数sum() over()的用法) 一、窗口函数功能简介 sum(c) over(partition by a order by b) 按照一定规则汇总c的值,具体规则为以a分组,每组内按照b进行排序,汇总第一行至当前行的c的加和值。 sum()&#xff1a…

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言认识雪花ID…

FPGA——分秒计数器设计(DE2-115开发板)

一、项目创建 1.创建工程 点击File->New Project Wizard...或者直接在页面处点击 在第一行选择文件存放地点,第二行为项目名称,第三行为顶级设计实体名称 (下面的步骤可以暂时不做直接点Finish,因为是先写代码先把它跑出来暂…

雅思练习总结(九)

雅思练习总结(九) 本文章是雅思练习总结(九),总结了文章《BAKELITE》,内容包括原文精翻,文章脉络总结,单词扩展学习3个部分 1 文章原文及翻译 BAKELITE 翻译:贝克莱特…

windows USB 了解

GUID GUID 是一个 128 位的数字,在全球范围内是独一无二的,常被用于标识软件组件、设备接口等,以保证在不同系统和环境中能唯一识别特定对象。 DEFINE_GUID(GUID_DEVINTERFACE_USCUSTOMKEYS, 0x12345678, 0x1234, 0x5678, 0x12, 0x12, 0x23…

光谱相机的光谱信息获取

光谱信息的获取方式主要依赖于不同分光技术和成像方法,将入射光分解为不同波长并记录其强度。以下是常见的光谱信息获取技术分类及原理: ‌1. 分光技术(物理分解波长)‌ ‌(1) 滤光片法‌ ‌原理‌:使用固定或可调滤…

免去繁琐的手动埋点,Gin 框架可观测性最佳实践

作者:牧思 背景 在云原生时代的今天,Golang 编程语言越来越成为开发者们的首选,而对于 Golang 开发者来说,最著名的 Golang Web 框架莫过于 Gin [ 1] 框架了,Gin 框架作为 Golang 编程语言官方的推荐框架 [ 2] &…

构建大语言模型应用:简介(第一部分)

本专栏聚焦大语言模型(LLM)相关内容的解析,通过检索增强生成(RAG)应用的视角来进行。 本系列文章 简介(本文)数据准备句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模…

PEmicro Multilink FX调试踩坑

文章目录 1.背景2 功能说明2.1 实时数据查看功能2.1 电压观测2.2 SWO功能 3 设置与支持 1.背景 既然使用了NXP的芯片,笔者就想使用一下它的专用调试器,这里先说一下,笔者是从朋友那里借了一个调试器,型号为PEmicro Multilink FX …

主流大模型采用的架构、注意力机制、位置编码等汇总表

记录下主流大模型的一些核心知识点,包括: 架构注意力机制位置编码归一化激活函数模型参数 表中的一些模型已经是很久之前的了,比如表中并未收入 DeepSeek V3 中使用的MLA的注意力机制。先占个位,后续如果有更新的汇总表再来更…

SpringBoot学习笔记3.27

目录 实战篇第二课 1.注册参数的校验: 学习过程中遇到的问题: 1.什么是正则表达式 2.怎么自定义异常? 1. 创建全局异常处理类 2. 定义响应对象 3. 使用 ExceptionHandler 4. 设置响应状态码 5. 返回统一响应 6. 测试全局异常处理 …

2025NCTF--Web

文章目录 Websqlmap-masterez_dashez_dash_revenge Web sqlmap-master 源码 from fastapi import FastAPI, Request from fastapi.responses import FileResponse, StreamingResponse import subprocessapp FastAPI()app.get("/") async def index():return File…

如何破解软件自动化测试框架的维护难题

破解软件自动化测试框架的维护难题应从优化测试用例设计、加强脚本的模块化与复用性、提高自动化测试工具的选择与使用效率等方面入手。其中,加强脚本的模块化与复用性尤为关键,通过提高脚本的模块化程度,可以显著降低后续维护成本&#xff0…

外星人入侵(python设计小游戏)

这个游戏简而言之就是操作一个飞机对前方的飞船进行射击,和一款很久之前的游戏很像,这里是超级低配版那个游戏,先来看看效果图: 由于设计的是全屏的,所以电脑不能截图。。。。 下面的就是你操控的飞船,上面…