使用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高效提取所需信息

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
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.弹出的网页运行可视化展示

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

相关推荐
moz与京1 小时前
[附C++,JS,Python题解] Leetcode 面试150题(10)——轮转数组
c++·python·leetcode
什码情况2 小时前
回文时间 - 携程机试真题题解
数据结构·python·算法·华为od·机试
Alfadi联盟 萧瑶2 小时前
Python-Django入手
开发语言·python·django
漠北尘-Gavin4 小时前
【Python3.12.9安装llama-cpp-python遇到编译报错问题解决】
python·llama
测试老哥4 小时前
什么是集成测试?集成的方法有哪些?
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·集成测试
豆芽8195 小时前
Conda配置Python环境
python·conda·pip
CANI_PLUS5 小时前
python 列表-元组-集合-字典
开发语言·python
东方佑5 小时前
使用 Python 自动处理 Excel 数据缺失值的完整指南
开发语言·python·excel
weixin_478689765 小时前
pytorch与其他ai工具
人工智能·pytorch·python