是的,可以绕过,但需要综合运用 *** 池、请求头伪装、行为模拟、加密参数逆向等多种技术。

(图片来源 *** ,侵删)
一、为什么网站会设置反爬?
网站通过反爬机制保护数据、降低服务器压力、防止恶意抓取。常见手段包括:
- User-Agent 检测:识别非浏览器流量
- IP 频率限制:同一 IP 请求过快即封禁
- 滑块/验证码:人机验证
- 动态加密参数: *** 生成签名或 token
二、伪装浏览器:请求头与指纹
1. 构造完整请求头
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",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://www.target.com/",
"Sec-Ch-Ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-origin",
"Upgrade-Insecure-Requests": "1"
}
注意: 仅设置 User-Agent 远远不够,现代反爬会校验完整指纹。
2. 使用真实浏览器指纹库
推荐 fake-useragent 与 playwright-stealth:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
iphone = p.devices['iPhone 14 Pro']
browser = p.webkit.launch(headless=True)
page = browser.new_page(**iphone, bypass_csp=True)
page.add_init_script(path='stealth.min.js')
page.goto("https://example.com")
三、 *** 池与IP轮换:让请求“像人”
1. 自建 *** 池思路
- 爬取免费 *** 网站,检测可用性
- 存入 Redis,设置 TTL
- 每次请求随机抽取,失败即剔除
import redis, requests, random
r = redis.Redis()
proxies = [p.decode() for p in r. *** embers('valid_proxies')]
proxy = {"http": random.choice(proxies)}
requests.get(url, headers=headers, proxies=proxy, timeout=5)
2. 商用 *** 推荐
- 亮数据:住宅 IP,成功率高
- Oxylabs:支持城市级定位
- ScraperAPI:自动处理重试、浏览器渲染
四、行为模拟:节奏与轨迹
反爬系统会记录鼠标轨迹、滚动速度、点击间隔。使用 PyAutoGUI 或 Playwright 模拟:
page.mouse.move(100, 200, steps=10)
page.wait_for_timeout(random.randint(800, 1500))
page.click("#search-btn")
核心: 随机化间隔、轨迹曲线、滚动幅度,避免固定模式。

(图片来源 *** ,侵删)
五、 *** 加密参数逆向实战
1. 定位加密函数
打开浏览器 DevTools → Network → Initiator,找到生成 sign 的 *** 文件。
2. 本地复现算法
使用 PyExec *** 或 js2py 直接执行:
import execjs
with open('encrypt.js', 'r', encoding='utf-8') as f:
js = f.read()
ctx = execjs.compile(js)
sign = ctx.call('getSign', timestamp, query)
3. 若算法复杂
可借助 Mitmproxy 中间人 *** ,直接抓取已加密参数,再重放。
六、验证码破解:从打码平台到深度学习
- 通用滑块:使用 ddddocr 识别缺口坐标
- 文字点选:接入 2Captcha API
- 行为验证:录制真人轨迹,训练 LSTM 模型
import ddddocr
slide = ddddocr.DdddOcr(det=False, ocr=False)
with open('bg.jpg', 'rb') as f1, open('fullbg.jpg', 'rb') as f2:
res = slide.slide_match(f1.read(), f2.read(), simple_target=True)
distance = res['target'][0]
七、分布式爬虫:速度与隐匿的平衡
单机 IP 有限,使用 Scrapy-Redis 搭建分布式:
- Redis 存储待爬队列
- 多台机器共享指纹中间件
- 动态限速,AutoThrottle 根据响应延迟自动调整并发
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://user:pass@host:6379'
AUTOTHROTTLE_ENABLED = True
八、日志与监控:及时发现封禁
使用 ELK 或 Prometheus + Grafana:

(图片来源 *** ,侵删)
- 记录响应码、重试次数、 *** 成功率
- 异常告警:HTTP 状态码 4xx/5xx 激增时触发 Webhook
- 自动切换备用策略:验证码出现即启用打码平台
九、法律与伦理边界
技术可行 ≠ 合规。务必:
- 阅读并遵守 robots.txt
- 仅抓取公开数据,不突破登录、付费墙
- 控制并发,避免对目标站造成拒绝服务
十、完整示例:绕过某电商反爬抓取商品价
import asyncio, aiohttp, random, json
from playwright.async_api import async_playwright
async def fetch_price(sku):
async with async_playwright() as p:
iphone = p.devices['iPhone 14 Pro']
browser = await p.webkit.launch(headless=True)
page = await browser.new_page(**iphone)
await page.add_init_script(path='stealth.min.js')
await page.goto(f"https://item.jd.com/{sku}.html", timeout=60000)
await page.wait_for_selector(".price")
price_text = await page.inner_text(".price")
await browser.close()
return {"sku": sku, "price": price_text}
if __name__ == "__main__":
skus = ["100012043978", "100035246702"]
loop = asyncio.get_event_loop()
tasks = [fetch_price(s) for s in skus]
results = loop.run_until_complete(asyncio.gather(*tasks))
print(json.dumps(results, ensure_ascii=False))
亮点: 使用真实 iPhone 设备指纹,自动滚动、等待,成功绕过 UA 与滑块检测。
评论列表