“Proxy代理”就是代理服务器的简称,简单来说就是在你和互联网之间充当“中间人”的一台服务器。


什么是 Proxy 代理?

  • 代理服务器(Proxy Server):帮你代替你向目标网站或服务器发送请求,接收响应后再转发给你。
  • 你不直接访问目标网站,而是先访问代理服务器,再由代理服务器去访问目标网站。

Proxy代理的作用和优势

  1. 隐藏真实IP地址
    代理服务器帮你访问网站,网站看到的是代理的IP,而不是你的真实IP,保护隐私。
  2. 突破地域限制
    通过使用不同国家的代理IP,可以访问一些对某些地区有限制的网站。
  3. 加速访问
    一些代理服务器会缓存内容,访问速度可能比直接访问更快。
  4. 访问控制和过滤
    企业或学校用代理服务器控制员工或学生的上网行为,限制访问某些网站。
  5. 提高安全性
    代理能对流量做过滤、检测,防止恶意攻击。

Proxy代理的类型

类型说明
正向代理用户通过代理访问互联网的服务器。
反向代理服务器端设置,客户端请求先到代理服务器。
透明代理不隐藏客户端IP,用户通常不知道自己用了代理。
匿名代理隐藏客户端IP,但声明自己是代理。
高匿名代理隐藏客户端IP,且不暴露自己是代理服务器。

在爬虫中的应用

  • 防止目标网站识别和屏蔽爬虫 IP。
  • 轮换代理池,模拟多用户请求,避免频繁请求导致封禁。
  • 访问地域受限的数据。

好的!下面是一个使用 Python requests 库通过代理(proxy)访问网站的简单示例代码:

import requests

# 设置代理服务器(以HTTP代理为例)
proxies = {
    "http": "http://123.45.67.89:8080",   # 代理IP和端口,请替换成实际代理地址
    "https": "http://123.45.67.89:8080",
}

try:
    # 发送请求,带上代理参数
    response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=5)
    print("响应状态码:", response.status_code)
    print("返回内容:", response.text)
except requests.exceptions.RequestException as e:
    print("请求异常:", e)

说明

  • "http://123.45.67.89:8080" 替换成你实际的代理 IP 和端口。
  • 代理格式支持 HTTP、HTTPS,也可以是 SOCKS5(需要安装额外依赖 requests[socks])。
  • 访问 https://httpbin.org/ip 是测试用,返回访问时的 IP 地址,验证代理是否生效。

如果使用 SOCKS5 代理示例

pip install requests[socks]
proxies = {
    "http": "socks5h://127.0.0.1:1080",
    "https": "socks5h://127.0.0.1:1080",
}

明白了!下面给你一个简单的 Python 多线程爬虫+代理池 示例,实现多线程爬取网页时自动轮换代理IP,帮助你避免被封禁。


Python 多线程爬虫 + 代理池示例

import threading
import requests
from concurrent.futures import ThreadPoolExecutor
import random
import time

# 目标网址列表(示例)
urls = [
    "https://httpbin.org/get?query=1",
    "https://httpbin.org/get?query=2",
    "https://httpbin.org/get?query=3",
    "https://httpbin.org/get?query=4",
    "https://httpbin.org/get?query=5",
]

# 代理池示例(请替换成真实可用代理IP:端口)
proxy_pool = [
    "http://123.45.67.89:8080",
    "http://98.76.54.32:3128",
    "http://111.22.33.44:8000",
]

lock = threading.Lock()
results = {}

def fetch_with_proxy(url):
    proxy = random.choice(proxy_pool)  # 随机选一个代理
    proxies = {
        "http": proxy,
        "https": proxy,
    }
    try:
        response = requests.get(url, proxies=proxies, timeout=5)
        with lock:
            results[url] = (response.status_code, len(response.content))
        print(f"[成功] {url} 代理:{proxy} 状态码:{response.status_code}")
    except Exception as e:
        with lock:
            results[url] = (None, None)
        print(f"[失败] {url} 代理:{proxy} 错误:{e}")

def main():
    max_workers = 3
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        executor.map(fetch_with_proxy, urls)

    print("\n全部任务完成,结果汇总:")
    for url, (status, length) in results.items():
        print(f"{url} -> 状态码: {status}, 内容长度: {length}")

if __name__ == "__main__":
    main()

重点说明

  • 代理池:用一个列表保存多个代理IP,爬取时随机选择。
  • 多线程:用 ThreadPoolExecutor 简化线程管理,提高效率。
  • 线程安全:对共享变量 results 访问加锁,避免数据竞争。
  • 异常处理:捕获请求异常,防止程序崩溃。

运行前准备

pip install requests