报错特征:
-
HTTP状态码:429
-
拦截主体:Vercel 安全校验系统
-
请求结果:无有效页面源码,直接返回安全拦截校验页,无法抓取任何页面数据
-
常规优化无效:单纯添加UA、请求延时、重试机制、Cookie均无法绕过拦截
Vercel的429是主动安全防护拦截,和请求频率无关
解决方案
Playwright 无头浏览器模拟
Playwright 是微软推出的浏览器自动化工具,可启动真实Chromium浏览器内核,完整模拟真人用户访问行为:执行JS代码、生成真实浏览器指纹、自动通过Vercel人机校验、等待页面动态渲染完成,从根源上规避所有风控拦截
python
# 安装python依赖
pip install playwright
# 自动安装Chromium浏览器内核
playwright install chrome
python
from playwright.sync_api import sync_playwright
url = "https://www.xxx"
def get_product_links():
with sync_playwright() as p:
# 启动浏览器,关闭自动化检测特征
browser = p.chromium.launch(
headless=True, # 无头模式,后台运行
args=["--disable-blink-features=AutomationControlled"]
)
# 伪装真实浏览器环境
context = browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080}
)
page = context.new_page()
# 访问页面,等待所有网络请求、JS渲染完成
page.goto(url, wait_until="networkidle", timeout=30000)
# 精准等待商品DOM渲染完成,避免空数据
page.wait_for_selector('a[data-testid*="product-result"]', timeout=20000)
# 批量提取所有商品链接
item_locator = page.locator('a[data-testid*="product-result"]')
total = item_locator.count()
link_list = []
for i in range(total):
href = item_locator.nth(i).get_attribute("href")
link_list.append(href)
browser.close()
return link_list
if __name__ == "__main__":
links = get_product_links()
print("提取到的商品链接:")
print(links)
print(f"共{len(links)}条链接")
绕过Vercel安全校验、适配所有动态渲染页面、模拟真人行为、稳定性拉满
总结
requests、urllib等静态HTTP工具,无法绕过带JS校验的Vercel防护
爬虫拦截的本质从来不是"请求太快",而是请求行为不像真人
优化:
-
批量抓取时添加随机延时,避免固定时序请求
-
高频采集场景搭配代理IP池,轮换IP访问
-
Playwright可开启有头模式调试,确认页面加载正常后再切换无头模式
-
禁止循环高频刷新页面,模拟人工浏览间隔
免责声明
本文所有代码、技术方案仅作网络爬虫技术学习、前端渲染原理、网站安全防护机制研究使用,仅供开发者交流技术思路,禁止用于任何商业批量采集、未经授权大规模爬取他人网站数据。