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

如何从隐藏HTML标签抓取手机号与邮箱?爬虫手机号抓取失败求助

解决手机号抓取空值/标签问题

问题根源

  1. 选择器不精准:你用的.lui-sm-margin-left-xxs是通用间距类,并非手机号专属,可能匹配到无文本的空元素导致输出为空;偶尔匹配到包含手机号的父标签而非号码本身,所以返回完整HTML结构。
  2. 固定等待不可靠:页面动态加载时,固定sleep时长可能不足以让手机号完全渲染,导致抓取失败。
  3. 部分手机号需交互:部分商家的手机号默认隐藏,需要点击"显示号码"按钮才能获取。

修改后的代码

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化Chrome驱动
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)  # 显式等待,最长等待10秒

# 访问目标网站
driver.get("https://www.local.ch/en/")

# 搜索功能
def search_query(query):
    search = wait.until(EC.presence_of_element_located((By.NAME, "what")))
    search.clear()
    search.send_keys(query)
    search.send_keys(Keys.RETURN)
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, "search-header-results")))

# 提取搜索结果统计
def datasearch():
    searchResult = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "search-header-results")))
    print(f"搜索结果:{searchResult.text}\n")

# 抓取数据(含手机号处理)
def data_scrape():
    # 等待卡片容器加载完成
    components = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".js-entry-card-container.row.lui-margin-vertical-xs.lui-sm-margin-vertical-m")))
    for component in components:
        name = component.find_element(By.CSS_SELECTOR, ".lui-margin-vertical-zero.card-info-title").text
        addre = component.find_element(By.CSS_SELECTOR, ".card-info-address").text
        
        # 处理手机号:优先找带tel协议的链接,精准定位号码
        phone = ""
        try:
            # 尝试抓取直接显示的手机号
            phone_element = component.find_element(By.CSS_SELECTOR, ".card-info-phone a[href^='tel:']")
            phone = phone_element.get_attribute("href").replace("tel:", "")
        except:
            # 处理需要点击展开的隐藏手机号
            try:
                show_phone_btn = component.find_element(By.CSS_SELECTOR, ".js-show-phone")
                driver.execute_script("arguments[0].click();", show_phone_btn)
                time.sleep(0.5)
                phone_element = component.find_element(By.CSS_SELECTOR, ".card-info-phone a[href^='tel:']")
                phone = phone_element.get_attribute("href").replace("tel:", "")
            except:
                phone = "无手机号"
        
        print(f"名称: {name}\n地址: {addre}\n电话: {phone}\n")

# 执行流程
search_query("Clinique")
datasearch()
data_scrape()
driver.quit()

关键改动说明

  • 精准选择器:用a[href^='tel:']定位手机号元素,通过href属性提取号码,避免匹配无关元素。
  • 显式等待:替换固定sleep为WebDriverWait,等待元素加载完成后再抓取,提升稳定性。
  • 隐藏号码处理:增加点击"显示号码"按钮的逻辑,解决部分手机号默认隐藏的问题。
  • 异常捕获:添加try-except块,避免单个元素抓取失败导致程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:10:43