如何用BeautifulSoup获取需点击按钮显示的电话号码(不使用Selenium)
无需Selenium获取点击显示的电话号码
以下是不用Selenium的解决思路和代码示例:
思路1:检查页面源码中的隐藏数据
很多网站会把需要点击才显示的电话号码提前嵌入HTML,只是通过CSS隐藏。直接在返回的页面内容里搜索相关元素:
- 查找带有
data-phone、hidden这类属性的元素 - 搜索页面中可能存在的电话号码格式字符串(比如带+号、括号的数字)
思路2:分析AJAX接口请求
点击显示电话的按钮时,浏览器通常会发送AJAX请求拉取号码。用浏览器开发者工具(F12)的Network标签,监控点击按钮后的请求,找到对应的API接口,直接用requests请求该接口获取数据。需要注意:
- 带上和浏览器一致的请求头(比如
User-Agent、Referer) - 接口参数可能需要传入页面URL中的公司ID(比如示例中的
00000005443350-781559001)
代码示例
import requests from bs4 import BeautifulSoup url = "https://www.europages.co.uk/ARTISAN-4-SEASON-PROJECTS/00000005443350-781559001.html" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 获取页面基础信息 res = requests.get(url, headers=headers) soup = BeautifulSoup(res.content, 'html.parser') name = soup.find('h1', class_="ep-epages-header-title text-h6 text-sm-h4").text.strip() address = soup.find('dd').text.strip() print(f"公司名称:{name}") print(f"地址:{address}") # 尝试提取隐藏的电话号码 phone_element = soup.find(attrs={"data-phone": True}) if phone_element: phone = phone_element.get("data-phone") print(f"电话号码:{phone}") else: # 若隐藏数据不存在,使用抓包得到的API接口(需自行替换实际接口) company_id = url.split('/')[-1].split('.')[0] # 示例接口,需根据实际抓包结果修改 api_url = f"https://www.europages.co.uk/api/company-contact/{company_id}" api_res = requests.get(api_url, headers=headers) if api_res.status_code == 200: contact_data = api_res.json() phone = contact_data.get("phoneNumber") if phone: print(f"电话号码:{phone}")
注意事项
- 部分网站的电话号码可能经过简单加密(比如字符替换、Base64编码),需要查看页面中的JS解密逻辑,用Python实现对应解密步骤
- 若网站有反爬机制,可能需要添加Cookie或调整请求频率,避免被封禁
内容的提问来源于stack exchange,提问作者Gyan Dixit
相关产品推荐
相关产品推荐

