写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了

📅 2026/7/25 2:29:54
写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了
写爬虫时用了代理还被封Python 代理的那些隐藏坑我替你踩明白了作为一名编程讲师我经常遇到学生抱怨“我明明用了代理为什么还是被网站封了” 这个问题看似简单但背后的坑却多得让人头疼。今天我就从基础概念讲到高级用法用真实代码带你绕过这些隐藏陷阱。无论你是刚入门的新手还是经验丰富的开发者这篇文章都能帮你少走弯路。## 基础概念代理是什么为什么用了还会被封代理Proxy本质上是你的爬虫和目标网站之间的“中间人”。它把你的请求转发给网站返回响应给你这样网站看到的是代理的 IP而不是你的真实 IP。但很多新手以为只要随便找个代理就能高枕无忧了。错网站的反爬虫机制不仅检查 IP还会检查其他因素比如-请求头Headers代理本身不会修改你的请求头如果请求头暴露了你的真实信息如 User-Agent 过于单一封你没商量。-请求频率代理 IP 不是万能药。如果你用同一个代理 IP 每秒发 100 个请求网站照样会认为这是恶意行为。-代理质量免费代理通常不稳定、速度慢甚至本身就是“蜜罐”用于追踪爬虫的陷阱。所以用了代理还被封核心原因不是代理这个“工具”有问题而是你的“使用方式”有漏洞。接下来我会带你逐步排查这些问题。## 初级陷阱只换 IP不换请求头很多人写爬虫时第一步就是找代理然后直接套用比如这样pythonimport requests# 伪代码获取代理proxy {http: http://123.45.67.89:8080, https: http://123.45.67.89:8080}# 用代理发送请求response requests.get(https://example.com, proxiesproxy)print(response.status_code)这段代码看似正确但实际运行后很可能被封。原因在于requests库默认发送的请求头如User-Agent是python-requests/2.x.x这种标识在网站看来就是爬虫的特征。代理虽然换了 IP但请求头没变网站一看“哦又是那个熟悉的 Python 爬虫”直接封掉。解决方案手动设置一个真实的浏览器 User-Agent并且随机切换。### 完整代码示例 1基础代理 随机 User-Agentpythonimport requestsimport random# 常见浏览器 User-Agent 列表USER_AGENTS [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36]def fetch_with_proxy(url, proxy): 使用指定代理和随机 User-Agent 发送请求 headers { User-Agent: random.choice(USER_AGENTS), Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: en-US,en;q0.5 } try: response requests.get(url, proxiesproxy, headersheaders, timeout5) print(f状态码: {response.status_code}, 使用代理: {proxy[http]}) return response except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None# 测试proxy {http: http://123.45.67.89:8080, https: http://123.45.67.89:8080}fetch_with_proxy(https://httpbin.org/ip, proxy)这个例子中我们不仅用了代理还模拟了真实浏览器的请求头。网站看到“Mozilla/5.0”这种标识会更倾向于认为这是一个正常用户。但注意这只是第一步如果请求频率过高仍然会被封。## 中级陷阱忽略请求频率与 IP 池管理代理 IP 池是爬虫进阶的必备工具。但很多人的做法是找一个代理 IP然后循环使用每隔 0.1 秒发一次请求。结果可想而知——代理 IP 被网站标记然后封禁整个 IP 段。### 完整代码示例 2带 IP 池和延时控制的爬虫pythonimport requestsimport timeimport random# 模拟一个代理 IP 池实际使用中可以从代理服务商获取PROXY_POOL [ {http: http://111.222.33.44:8080, https: http://111.222.33.44:8080}, {http: http://55.66.77.88:3128, https: http://55.66.77.88:3128}, {http: http://99.100.101.102:80, https: http://99.100.101.102:80}]def smart_scraper(url, target_count10): 智能爬虫随机代理 随机延时 重试机制 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 } for i in range(target_count): # 随机选择一个代理 proxy random.choice(PROXY_POOL) # 设置随机延时1到3秒之间模拟人类行为 delay random.uniform(1, 3) print(f请求 {i1}/{target_count}使用代理: {proxy[http]}延时 {delay:.2f} 秒) time.sleep(delay) try: response requests.get(url, proxiesproxy, headersheaders, timeout5) if response.status_code 200: print(f成功获取数据状态码: {response.status_code}) else: print(f异常状态码: {response.status_code}可能被封) except requests.exceptions.ProxyError: print(f代理 {proxy[http]} 失效尝试下一个) continue except requests.exceptions.Timeout: print(请求超时跳过) continue# 测试smart_scraper(https://httpbin.org/ip, target_count5)这个代码的关键点在于-IP 池使用多个代理轮换降低单个 IP 的请求频率。-随机延时random.uniform(1, 3)让请求间隔不固定更像人类操作。-异常处理代理失效时自动跳过避免程序崩溃。但即使这样如果你爬取的目标网站反爬虫力度很强比如淘宝、知乎仍然可能被封。这就引出了高级用法。## 高级用法应对高级反爬虫机制当网站使用更复杂的手段如检测浏览器指纹、JavaScript 渲染、IP 地理位置一致性时普通代理和延时策略就失效了。这里我分享两个高级技巧1.使用 Session 保持 Cookie很多网站会通过 Cookie 跟踪会话。如果你每次请求都用新代理和新 Session网站会认为你是不同用户但如果你用同一个 Session 配合代理切换会暴露你的真实行为。 - 正确做法为每个代理创建独立的 Session模拟不同用户。2.使用 Headless 浏览器 代理对于需要 JavaScript 渲染的网站用requests无法获取数据。这时可以用Selenium或Playwright结合代理。### 高级示例Playwright 代理抓取动态页面pythonfrom playwright.sync_api import sync_playwrightimport timedef scrape_with_browser_and_proxy(url, proxy_server): 使用 Playwright 无头浏览器 代理 with sync_playwright() as p: # 启动浏览器配置代理 browser p.chromium.launch( headlessTrue, # 无头模式 proxy{server: proxy_server} ) context browser.new_context( user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 ) page context.new_page() try: page.goto(url, timeout30000) # 等待页面加载完成模拟人类等待 page.wait_for_load_state(networkidle) # 获取页面内容 content page.content() print(f成功获取页面长度: {len(content)} 字符) return content except Exception as e: print(f抓取失败: {e}) return None finally: browser.close()# 测试需要先安装 Playwright: pip install playwright playwright installscrape_with_browser_and_proxy(https://httpbin.org/ip, http://123.45.67.89:8080)这个代码展示了如何用无头浏览器模拟真实用户配合代理爬取动态内容。但注意这种方法的资源消耗更大速度也更慢适合对付那些“硬骨头”网站。## 总结与避坑指南通过以上内容你应该明白了用了代理还被封不是代理的错而是你的策略太简单。以下是核心总结1.不要只依赖代理代理只是 IP 层面的伪装你还需要模拟请求头、Cookie、行为模式等。2.代理质量决定下限免费代理容易被封建议使用付费代理服务或自建代理池。3.频率控制是关键无论用什么代理高频率请求都会暴露你。4.高级场景用浏览器自动化对于动态网站或强反爬虫requests不够用可以考虑Playwright或Selenium。5.日志和监控很重要记录每个代理的成功率及时剔除失效代理。最后记住爬虫的核心原则——尊重网站的robots.txt和使用条款。写代码是为了学习不是为了搞破坏。希望这篇文章能帮你避开那些坑写出更稳定、更优雅的爬虫。如果你还有其他问题欢迎在评论区留言一起交流