使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)
一、地址:
url = "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL
但是这个爬虫我不知道为啥总是翻不了页数,请帮忙修改一下~
二、用到的知识点以及代码详解:
这段代码是一个使用Selenium和lxml库实现的网页爬虫,主要用于爬取房天下网站(https://fang.com)上淄博地区的新房信息。
主要功能
-
使用Selenium控制Chrome浏览器自动翻页爬取新房列表
-
对每个新房项目打开详情页提取详细信息
-
提取的信息包括:房屋标题、价格、地址、咨询电话和户型
-
自动处理翻页逻辑,直到最后一页
-
包含异常处理机制,防止程序意外中断
代码特点
-
自动化浏览器控制:使用Selenium模拟真实用户操作浏览器
-
显式等待:使用WebDriverWait确保元素加载完成后再进行操作
-
多标签页处理:在新标签页中打开详情页,不影响列表页状态
-
健壮性设计:
-
包含多种异常处理
-
检查元素是否存在再操作
-
处理浏览器意外关闭情况
-
-
数据提取:使用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')))# 解析列表页HTMLhtml = 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.弹出的网页运行可视化展示

这样就可以爬取到想要的数据了~
相关文章:
使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)
一、地址: url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数,请帮忙修改一下~ 二、用到的知识点以及代码详解: 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…...
大模型训练过程中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…...
语音机器人与智能体结合
自从春节期间deepseek的发布,大家对语音机器人接入大模型格外的关注。最近又收到一个需求,是语音机器人与智能体的结合。 什么是智能体? 智能体(Agent)是指能够感知环境并采取行动以实现目标的实体。根据其复杂程度&am…...
使用git-lfs管理大文件
当我们使用git管理文件版本的时候,经常会有一些比较大的文件,比如一些模型文件,或者备份的文档资料等,这些文件属于如果太大,就会给git的管理带来困难。 所以,对于这种大文件,一般我们就会采用…...
vs2022+QT6.7.3打包程序流程
1、新建目录test 2、将项目配置为Release X64,生成XXX.exe 3、将XXX.exe放到test目录 4、管理员方式打开Qt 6.7.3 (MSVC 2022 64-bit),进入test目录,执行:windeployqt6.exe XXX.exe 5、管理员方式打开x64 Native Tools Command Pr…...
Axios企业级封装实战:从拦截器到安全策略!!!
🚀 Axios企业级封装实战:从拦截器到安全策略 🔧 核心代码解析 // 创建Axios实例 const service axios.create({baseURL: api, // 🌐 全局API前缀timeout: 0, // ⏳ 永不超时(慎用!)withCrede…...
关于计算机视觉中的插值小记
计算机视觉中的插值(Interpolation)讲解 插值(Interpolation)在计算机视觉中是一项基础操作,常用于图像缩放、旋转、去噪、图像重建等任务。其核心思想是在已知数据点之间进行推测,估计未知的像素值或特征…...
img 的 onerror属性
名词解释: img 标签的 onerror 属性是一个事件处理属性,当图片因 src 地址无效、网络问题或其他加载错误导致加载失败时,会触发该属性内的代码。 1. <img> 标签的 src 属性 src(source 的缩写)属性是 <img…...
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两种三极管使用方法 上图中,横向左…...
Logback使用和常用配置
Logback 是 Spring Boot 默认集成的日志框架,相比 Log4j,它性能更高、配置更灵活,并且天然支持 Spring Profile 多环境配置。以下是详细配置步骤及常用配置示例。 一、添加依赖(非 Spring Boot 项目) 若项目未使用 Sp…...
SQL中累计求和与滑动求和函数sum() over()的用法
[TOC](SQL中累计求和与滑动求和函数sum() over()的用法) 一、窗口函数功能简介 sum(c) over(partition by a order by b) 按照一定规则汇总c的值,具体规则为以a分组,每组内按照b进行排序,汇总第一行至当前行的c的加和值。 sum():…...
【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…...
如何破解软件自动化测试框架的维护难题
破解软件自动化测试框架的维护难题应从优化测试用例设计、加强脚本的模块化与复用性、提高自动化测试工具的选择与使用效率等方面入手。其中,加强脚本的模块化与复用性尤为关键,通过提高脚本的模块化程度,可以显著降低后续维护成本࿰…...
外星人入侵(python设计小游戏)
这个游戏简而言之就是操作一个飞机对前方的飞船进行射击,和一款很久之前的游戏很像,这里是超级低配版那个游戏,先来看看效果图: 由于设计的是全屏的,所以电脑不能截图。。。。 下面的就是你操控的飞船,上面…...
iOS rootless无根越狱检测方案
不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…...
单端信号差分信号
单端信号和差分信号是电路中常见的两种信号传输方式,它们在具体的应用场景和特点上有着明显的区别。下面就来详细说明一下单端信号和差分信号的区别。 首先,单端信号是指信号通过一个信号线传输,通常一个信号线携带一个信号。这种传输方式适…...
LLM 优化技术(1)——Scaled-Dot-Product-Attention(SDPA)
在 Transformer 中抛弃了传统的 CNN 和 RNN,整个网络结构完全由Scaled Dot Product Attention 和Feed Forward Neural Network组成。一个基于 Transformer 的可训练的神经网络可以通过堆叠 Transformer 的形式进行搭建,Attention is All You Need论文中通…...
