如何抓取点击触发后才显示的网页电话号码?
解决点击后显示的电话号码抓取问题
你用requests获取的是页面初始的静态HTML代码,而目标电话号码是通过JavaScript动态加载的——只有点击触发后,页面才会请求后端数据并把号码渲染出来,所以直接用BeautifulSoup找不到对应的元素。
给你两种可行的解决方法:
方法一:用Selenium模拟浏览器操作
这种方法模拟真实用户的浏览行为,能处理动态加载的内容:
- 先安装依赖包和浏览器驱动:
- 执行
pip install selenium安装Selenium - 下载对应浏览器的驱动(比如ChromeDriver,要和你的浏览器版本匹配)
- 执行
- 示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://hipages.com.au/connect/makermanservices" # 初始化Chrome驱动(注意替换成你的ChromeDriver路径,或配置到环境变量) driver = webdriver.Chrome() driver.get(url) try: # 等待显示电话的按钮加载完成并点击 show_phone_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CLASS_NAME, "phone-number__trigger")) ) show_phone_btn.click() # 等待电话号码元素出现并获取文本 phone_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "phone-number__mobile")) ) print(phone_element.text) finally: # 关闭浏览器 driver.quit()
注:如果触发按钮的class不是phone-number__trigger,需要自己打开浏览器开发者工具查看实际的元素标识
方法二:直接调用后端API接口
这种方法效率更高,不需要模拟浏览器,需要分析页面的网络请求:
- 打开浏览器F12进入开发者工具,切换到「Network」标签
- 点击页面上显示电话的按钮,观察出现的XHR请求,找到返回电话号码的API接口
- 复制该接口的URL,以及请求头里的
User-Agent、Cookie等信息,用requests直接调用:
import requests # 复制浏览器请求中的headers,确保请求能被服务器正常响应 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Cookie": "这里替换成你浏览器中的Cookie内容" } # 替换成实际找到的API接口URL api_url = "https://hipages.com.au/api/xxx/phone" response = requests.get(api_url, headers=headers) phone_info = response.json() print(phone_info.get("phone"))
内容的提问来源于stack exchange,提问作者Ahmad Abdelbaset
相关产品推荐
相关产品推荐

