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

一、地址:

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')))# 解析列表页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.弹出的网页运行可视化展示 

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ai画图comfyUI 精准定位gligen。允许指定图像中多个对象的位置和大小

基础功能下,outpainting是内容填充,拉近拉远镜头,自动填充旁边物体。嵌入模型也需要单独下载,演示完示例后推荐模型站有更直观效果介绍和用法。选中精确定位。看一眼坐标,直接默认出一张图。然后修改定位,和…

如何自动化同义词并使用我们的 Synonyms API 进行上传

作者:来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词, 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…

boost.asio

as(async):异步 同步io: reactor (非阻塞)(需要注册一次,在等待消息时可以干别的事) 阻塞io网络模型 接口:read\accept\connect\write 接口返回时,io完成 异步…

数据库后续

-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…

计算机网络基础:网络流量工程与优化策略

计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…

H5DS编辑器教程——H5页面触发动画实战指南

在 H5 页面设计中,触发动画通过动态交互提升用户体验,成为吸引注意力的关键手段。H5DS 编辑器作为一款高效的可视化工具,提供了丰富的动画制作功能,即使是零基础用户也能轻松实现专业级效果。 使用工具:H5DS编辑器 触…

什么是具身智能

具身智能(Embodied Intelligence)是人工智能与机器人学交叉的前沿领域,强调智能体通过身体与环境的动态交互实现自主学习和进化,其核心在于将感知、行动与认知深度融合‌。通俗地讲,就是机器人或者智能系统在物理环境中…

Java实现pdf中动态插入图片

今天接到一个需求&#xff0c;需要在pdf中的签名处&#xff0c;插入签名照片&#xff0c;但签名位置不固定&#xff0c;话不多说上代码&#xff1a; 1、首先引入itextpdf依赖包&#xff1a; <dependency><groupId>com.itextpdf</groupId><artifactId>…

MySQL8.4 InnoDB Cluster高可用集群使用指南

简介 高可用方案 Orchestrator&#xff1a; 可视化 Web 界面管理 MySQL 拓扑结构&#xff0c;并且兼容多种复制架构&#xff08;异步、半同步、GTID&#xff09;&#xff0c;提供自动和手动的故障转移。但是8.0.21后 MySQL 更新了主从复制相关命令&#xff0c;Orchestrator无…

从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档

从泛读到精读&#xff1a;合合信息文档解析如何让大模型更懂复杂文档 一、引言&#xff1a;破解文档“理解力”瓶颈二、核心功能&#xff1a;合合信息的“破局”亮点功能亮点1&#xff1a;复杂图表的高精度解析图表解析&#xff1a;为大模型装上精准“标尺”表格数据精准还原 功…

git:远程仓库拉取到本地,fork到本地,修改后再上传

讲述仓库成员拉取远程仓库&#xff08;即组长的仓库&#xff0c;里面有成员&#xff09;到本地&#xff0c;修改内容再上传的详细步骤&#xff1a; 1.进入仓库&#xff0c;首先fork &#xff08;如不&#xff0c;所作操作会直接对远程仓库进行&#xff0c;不用管理员审核&…

windows清除电脑开机密码,可保留原本的系统和资料,不重装系统

前言 很久的一台电脑没有使用了&#xff0c;开机密码忘了&#xff0c;进不去系统 方法 1.将一个闲置u盘设置成pe盘&#xff08;注意&#xff0c;这个操作会清空原来u盘的数据&#xff0c;需要在配置前将重要数据转移走&#xff0c;数据无价&#xff0c;别因为配置这个丢了重…

频谱分析仪的最大保持功能

专门应用于例如遥控器之类的&#xff0c;按一下&#xff0c;一瞬间出现的信号的测量。 把仪器连接天线&#xff0c;观测空间中的一些信号&#xff0c;比如WIFI的信号&#xff0c;我们可以看到仪器接收到的信号其实是一直变化的&#xff0c;并不是每一次扫描都能扫到我们想要的这…

智能粉尘监测解决方案|守护工业安全,杜绝爆炸隐患

在厂房轰鸣的生产线上&#xff0c;一粒微小粉尘的聚集可能成为一场灾难的导火索。如何实现粉尘浓度的精准监控与快速响应&#xff1f;我们为您打造了一套"感知-预警-处置"全闭环的智能安全方案&#xff01; 行业痛点&#xff1a;粉尘管理的生死线 在金属加工、化工…

Excel处理控件Aspose.Cells指南:如何在不使用 Microsoft Excel 的情况下解锁 Excel 工作表

Microsoft Excel 允许用户使用密码保护工作表&#xff0c;以防止未经授权的更改。但是&#xff0c;在某些情况下&#xff0c;您可能需要在不使用 Microsoft Excel 的情况下解锁 Excel 工作表。在本指南中&#xff0c;我们将探讨解锁 Excel 工作表的不同方法&#xff0c;例如使用…

音乐webpack(通杀webpack-1)

本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可…

【stm32--HAL库DMA+USART+空闲中断不定长收发数据】

串口通信-Hal库实现不定长度收发&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程创建&#xff09;基础配置时钟配置工程配置 代码编写现象 DMA 在正式配置之前&#xff0c;我们先来一起简单了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接内…

爬虫的第三天——爬动态网页

一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点&#xff1a; 用户交互&#xff1a;动态网页能够根据用户的请求而生成不同的内容。内容动态生成&#xff1a;数据来自数据库、API或用户输入。客户端动态渲染&#xff1a;浏览器…

【MATLAB例程】三维环境,基于TOA的动态轨迹定位,轨迹使用UKF(无迹卡尔曼滤波)进行滤波,模拟TOA/IMU的数据融合

本代码实现了一个基于到达时间&#xff08;TOA&#xff09;测距的三维定位系统&#xff0c;结合无迹卡尔曼滤波&#xff08;UKF&#xff09;对移动目标的轨迹进行优化。代码通过多锚节点&#xff08;>3&#xff09;的TOA测量数据&#xff0c;先进行初步定位解算&#xff0c;…

旋转变换原理

旋转变换原理 旋转是仿射变换的一种&#xff0c;通过变换矩阵实现图像绕指定中心旋转&#xff0c;保持直线和平行性不变。其数学表示为&#xff1a; 其中&#xff1a; ( c x , c y ) (c_x, c_y) (cx​,cy​) 是旋转中心。 θ \theta θ 是旋转角度&#xff08;逆时针为正&…