如何从隐藏HTML标签抓取手机号与邮箱?爬虫手机号抓取失败求助
解决手机号抓取空值/标签问题
问题根源
- 选择器不精准:你用的
.lui-sm-margin-left-xxs是通用间距类,并非手机号专属,可能匹配到无文本的空元素导致输出为空;偶尔匹配到包含手机号的父标签而非号码本身,所以返回完整HTML结构。 - 固定等待不可靠:页面动态加载时,固定sleep时长可能不足以让手机号完全渲染,导致抓取失败。
- 部分手机号需交互:部分商家的手机号默认隐藏,需要点击"显示号码"按钮才能获取。
修改后的代码
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
相关产品推荐
相关产品推荐

