python爬虫如何绕过反爬机制_python爬虫如何伪装浏览器

新网编辑 30 0

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

python爬虫如何绕过反爬机制_python爬虫如何伪装浏览器
(图片来源 *** ,侵删)

一、为什么网站会设置反爬?

网站通过反爬机制保护数据、降低服务器压力、防止恶意抓取。常见手段包括:

  • 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-useragentplaywright-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. 自建 *** 池思路

  1. 爬取免费 *** 网站,检测可用性
  2. 存入 Redis,设置 TTL
  3. 每次请求随机抽取,失败即剔除

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:自动处理重试、浏览器渲染

四、行为模拟:节奏与轨迹

反爬系统会记录鼠标轨迹、滚动速度、点击间隔。使用 PyAutoGUIPlaywright 模拟:


page.mouse.move(100, 200, steps=10)
page.wait_for_timeout(random.randint(800, 1500))
page.click("#search-btn")

核心: 随机化间隔、轨迹曲线、滚动幅度,避免固定模式。

python爬虫如何绕过反爬机制_python爬虫如何伪装浏览器
(图片来源 *** ,侵删)

五、 *** 加密参数逆向实战

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 搭建分布式:

  1. Redis 存储待爬队列
  2. 多台机器共享指纹中间件
  3. 动态限速,AutoThrottle 根据响应延迟自动调整并发

# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://user:pass@host:6379'
AUTOTHROTTLE_ENABLED = True

八、日志与监控:及时发现封禁

使用 ELKPrometheus + Grafana

python爬虫如何绕过反爬机制_python爬虫如何伪装浏览器
(图片来源 *** ,侵删)
  • 记录响应码、重试次数、 *** 成功率
  • 异常告警:HTTP 状态码 4xx/5xx 激增时触发 Webhook
  • 自动切换备用策略:验证码出现即启用打码平台

九、法律与伦理边界

技术可行 ≠ 合规。务必:

  1. 阅读并遵守 robots.txt
  2. 仅抓取公开数据,不突破登录、付费墙
  3. 控制并发,避免对目标站造成拒绝服务

十、完整示例:绕过某电商反爬抓取商品价


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 与滑块检测。

  • 评论列表

留言评论