2025年数据抓取代理轮换:避免封禁并提升成功率
在当今的反机器人环境下,代理轮换对于成功的网页爬虫至关重要。本指南涵盖了从基础代理轮换到高级技术的所有内容,并提供了 Python 代码示例和避免被检测到的最佳实践。
网站采用各种反爬虫措施:
- IP 速率限制(每个 IP 的请求数)
- 请求模式分析
- 用户代理指纹识别
代理轮换的帮助:
-
跨多个 IP 分配请求
-
模拟自然用户行为
-
降低被封禁和验证码的风险
“如果没有代理轮换,即使是最优秀的爬虫也会在几分钟内被封禁。”——网页爬虫专家
代理类型 | 速度 | 可靠性 | 成本 | 最适合 |
---|---|---|---|---|
数据中心 | ★★★★ | ★★ | $ | 常规爬虫 |
住宅 | ★★★ | ★★★★ | $$$ | 电子商务、社交媒体 |
移动 (4G/5G) | ★★ | ★★★★★ | $$$$ | 高级反机器人网站 |
ISP | ★★★★ | ★★★★ | $$ | 均衡项目 |
建议:先从数据中心代理开始测试,然后升级到住宅代理进行生产数据抓取。
1导入请求
2从 itertools 导入 cycle
3
4proxies = [
5"http://121.136.189.231:60001",
6"http://113.160.132.195:8080",
7"http://122.10.225.55:8000"
8]
9
10proxy_pool = cycle(proxies)
11
12for _ in range(5):
13proxy = next(proxy_pool)
14try:
15response = request.get(
16"https://httpbin.io/ip",
17proxies={"http": proxy, "https": proxy},
18timeout=5
19)
20print(f"成功:{proxy} | {response.text}")
21except Exception as e:
22print(f"失败:{proxy} | {str(e)}")
23
24
1导入请求
2导入随机
3
4proxies = [...] # 你的代理列表
5
6for _ in range(5):
7proxy = random.choice(proxies)
8try:
9response = request.get(
10"https://httpbin.io/ip",
11proxies={"http": proxy, "https": proxy},
12timeout=5
13)
14print(f"成功:{proxy} | {response.text}")
15except Exception as e:
16print(f"失败:{proxy} | {str(e)}")
17
18
1导入请求
2from request.adapters import HTTPAdapter
3from urllib3.util.retry import Retry
4
5session = request.Session()
6retries = Retry(total=3, backoff_factor=1)
7session.mount('http://', HTTPAdapter(max_retries=retries))
8session.mount('https://', HTTPAdapter(max_retries=retries))
9
10# 对多个请求使用同一个代理
11proxy = "http://121.136.189.231:60001"
12session.proxies = {"http": proxy, "https": proxy}
13
14
1geo_proxies = {
2"US": "http://us-proxy:port",
3"UK": "http://uk-proxy:port",
4"DE": "http://germany-proxy:port"
5}
6
7对于 country,在 geo_proxies.items() 中指定 proxy:
8response = request.get(
9"https://httpbin.io/ip",
10proxies={"http": proxy, "https": proxy}
11)
12print(f"国家/地区: {country} | IP: {response.json()['origin']}")
13
14
1导入 aiohttp
2导入 asyncio
3
4async def check_proxy(session, proxy):
5try:
6async with session.get(
7"https://httpbin.io/ip",
8proxy=f"http://{proxy}",
9timeout=10
10) as respond:
11print(await response.text())
12except Exception as e:
13print(f"代理 {proxy} 失败: {str(e)}")
14
15async def main():
16proxies = open("proxies.txt").read().splitlines()
17async with aiohttp.ClientSession() as session:
18tasks = [check_proxy(session, proxy) for proxy in proxies]
19await asyncio.gather(*tasks)
20
21asyncio.run(main())
22
23
1from fake_useragent import UserAgent
2ua = UserAgent()
3headers = {"User-Agent": ua.random}
4
5
1import time
2import random
3time.sleep(random.uniform(1, 3))
4
5
1def is_proxy_alive(proxy):
2try:
3requests.get("http://example.com", proxies={"http": proxy}, timeout=5)
4return True
5except:
6return False
7
8
对于大型项目,请考虑:
MoMoProxy(企业级代理)网络)
Bright Data(企业级代理网络)
Smartproxy(经济实惠的住宅代理)
使用 ZenRows 的示例:
1proxy = "http://USERNAME:[email protected]:1337"
2response = request.get(
3"https://target.com",
4proxies={"http": proxy, "https": proxy}
5)
6
7
代理轮换对于成功的网页抓取至关重要。 以下是一些关键要点:
-
从基础轮换开始,并根据需要扩展
-
与其他反检测技术结合使用
-
使用高级代理进行生产环境数据抓取
-
持续监控并调整策略
如需了解更多高级技术,请浏览我们的指南:
-
轮换用户代理
-
绕过验证码
-
无头浏览器数据抓取