使用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
相关产品推荐
相关产品推荐

