使用Python BeautifulSoup无法抓取Airtel网站套餐,如何抓取充值套餐?
抓取Airtel官网充值套餐的解决方案
问题根源
你的代码无法拿到有效套餐数据,核心原因有两个:
- 动态渲染限制:Airtel的套餐数据是页面加载完成后通过JavaScript异步加载的,
requests.get只能获取静态HTML骨架,看不到实际的套餐内容。 - 反爬拦截:服务器识别出请求来自脚本而非浏览器,返回的内容不完整。
可行解决方法
方法1:用Selenium模拟浏览器渲染
Selenium可以模拟真实浏览器加载页面,获取JS渲染后的完整HTML,适合处理动态页面。
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 配置无头模式(无需弹出浏览器窗口) chrome_options = Options() chrome_options.add_argument("--headless=new") # 初始化Chrome驱动(需确保ChromeDriver版本与浏览器匹配,且在环境变量路径中) driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.airtel.in/myplan-infinity/") # 等待页面完全加载(根据网络情况调整等待时间) time.sleep(3) # 获取渲染后的页面源码 page_html = driver.page_source driver.quit() # 解析页面 soup = BeautifulSoup(page_html, 'html.parser') # 定位套餐元素(需根据实际页面结构调整选择器,示例用类名定位) plan_containers = soup.find_all('div', class_='plan-card') # 替换为页面实际的类名 for container in plan_containers: plan_details = container.get_text(strip=True) print(plan_details)
方法2:直接调用后端API(效率更高)
通过浏览器开发者工具(F12 → Network标签)抓包,找到返回套餐数据的API接口,直接请求接口获取JSON数据,比解析HTML更高效准确。
示例代码(需替换为实际抓包得到的API地址和请求头):
import requests # 模拟浏览器请求头,避免被拦截 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', 'Referer': 'https://www.airtel.in/myplan-infinity/' } # 替换为抓包得到的真实API地址 api_url = "https://www.airtel.in/api/v1/plans/infinity" response = requests.get(api_url, headers=headers) if response.status_code == 200: plan_data = response.json() # 提取并打印套餐信息 for plan in plan_data.get('data', []): print(f"套餐名称: {plan.get('title')}, 价格: ₹{plan.get('price')}, 描述: {plan.get('description')}")
注意事项
- 抓包API时,需注意接口的请求参数、Cookie或Token,部分接口需要携带验证信息才能返回数据。
- 控制请求频率,避免频繁触发网站反爬机制,可添加
time.sleep()间隔请求。 - 页面结构和API接口可能会更新,需定期检查并调整代码中的选择器或接口地址。
内容的提问来源于stack exchange,提问作者Sudhanshu Sharma
相关产品推荐
相关产品推荐

