You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python+Selenium提取URL遇问题:中原地产网站爬取求助

解决Centanet交易页爬取的两个问题

问题1:跳转详情页后返回至首页而非列表页

这个网站是单页应用(SPA),前端跳转时会修改浏览器历史栈,导致driver.back()无法定位到之前的列表页。

两种可行方案:

  • 方案1:提前保存列表页URL,返回时直接重载
    不用依赖浏览器的历史记录,每次返回都直接请求列表页URL,逻辑简单稳定:

    # 初始化时先保存列表页URL
    list_page_url = "https://hk.centanet.com/findproperty/list/transaction?q=xXHFRIuxWUSNboTJYGkUIg"
    driver.get(list_page_url)
    
    # 进入详情页处理数据后,直接回到列表页
    driver.get(list_page_url)
    
  • 方案2:在新标签页打开详情页
    避免修改原页面的历史栈,操作完详情页后切换回原标签即可:

    # 保存原窗口句柄
    main_window = driver.current_window_handle
    
    # 获取详情页URL(参考问题2的方法)
    row_element = driver.find_element_by_xpath(web_click)
    detail_url = row_element.get_attribute("data-detail-url")  # 替换为实际属性名
    
    # 在新标签页打开
    driver.execute_script(f"window.open('{detail_url}');")
    
    # 切换到新标签页
    for handle in driver.window_handles:
        if handle != main_window:
            driver.switch_to.window(handle)
            break
    
    # 处理详情页数据...
    
    # 关闭新标签页并切回原窗口
    driver.close()
    driver.switch_to.window(main_window)
    

问题2:无法找到列表项的href属性

列表项并非传统<a>标签,而是通过<div>绑定JS点击事件实现跳转,自然没有href属性。可以通过以下方式获取详情页URL:

方法1:提取元素的自定义data属性

打开浏览器开发者工具(F12),检查列表项元素,通常会有类似data-url、data-detail-url或data-id的属性,直接用get_attribute()提取:

row_element = driver.find_element_by_xpath(web_click)
# 示例:假设属性名为data-detail-url
detail_url = row_element.get_attribute("data-detail-url")

方法2:解析JS点击逻辑

如果没有data属性,查看元素的onclick事件内容,从中提取跳转URL:

# 获取点击事件的JS代码
click_script = driver.execute_script("return arguments[0].onclick.toString();", row_element)
# 从字符串中匹配URL(需根据实际代码调整正则)
import re
detail_url = re.search(r"window\.open\('(.*?)'\)", click_script).group(1)

方法3:监听网络请求

用Selenium的DevTools监听跳转时的网络请求,捕获详情页的URL(适合复杂场景):

# 启用DevTools监听网络请求
driver.execute_cdp_cmd('Network.enable', {})
driver.execute_cdp_cmd('Network.setRequestInterception', {'patterns': [{'urlPattern': '*transaction-detail*', 'interceptionStage': 'HeadersReceived'}]})

# 点击列表项
row_element.click()

# 获取请求的URL
requests = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': request_id})
detail_url = requests['url']

优化建议

替换time.sleep()为WebDriverWait,等待元素加载完成后再操作,提升稳定性:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 等待元素可点击
row_element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, web_click))
)
row_element.click()

内容的提问来源于stack exchange,提问作者user20260862

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:05:22