如何使用Python的bs4或其他库抓取span标签内的电话号码
解决方案
问题根因
你写的两个BeautifulSoup查询语句没有语法错误,无法获取到电话号码的核心原因是:该站点的联系信息属于动态加载内容,不会在首次请求返回的静态HTML源码中渲染,需要用户点击「显示联系方式」按钮后才会通过异步请求拉取数据插入DOM。BeautifulSoup只能解析首次请求返回的静态内容,自然无法找到对应节点。
可行实现方案
方案1:模拟浏览器操作抓取
使用Playwright或Selenium模拟真实用户的点击操作,等待内容加载完成后再提取信息,Playwright示例代码如下:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # headless设为True可静默运行浏览器 browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("目标商品页面地址") # 等待联系按钮加载完成后点击 contact_btn = page.locator("button:has-text('اتصل بالبائع')") contact_btn.click() # 等待号码渲染后提取内容 phone_num = page.locator(".contact a").inner_text() print(phone_num) browser.close()
方案2:直接调用异步接口获取
如果不需要启动浏览器,可以抓包获取联系方式的异步接口,直接构造请求拉取数据,性能比模拟浏览器更高:
- 打开浏览器开发者工具的「网络」面板,点击显示联系方式按钮后筛选XHR请求,找到返回联系信息的接口
- 补充和浏览器一致的请求头(User-Agent、Cookie等)后直接调用接口,解析返回的JSON数据即可拿到电话号码
注意事项
- 控制请求频率,避免触发站点反爬规则被封禁IP
- 调用接口时如果返回403,检查是否漏传了必要的请求头参数
内容的提问来源于stack exchange,提问作者Omar Mahmnoud
相关产品推荐
相关产品推荐

