“Proxy代理”就是代理服务器的简称,简单来说就是在你和互联网之间充当“中间人”的一台服务器。
什么是 Proxy 代理?
- 代理服务器(Proxy Server):帮你代替你向目标网站或服务器发送请求,接收响应后再转发给你。
- 你不直接访问目标网站,而是先访问代理服务器,再由代理服务器去访问目标网站。
Proxy代理的作用和优势
- 隐藏真实IP地址
代理服务器帮你访问网站,网站看到的是代理的IP,而不是你的真实IP,保护隐私。 - 突破地域限制
通过使用不同国家的代理IP,可以访问一些对某些地区有限制的网站。 - 加速访问
一些代理服务器会缓存内容,访问速度可能比直接访问更快。 - 访问控制和过滤
企业或学校用代理服务器控制员工或学生的上网行为,限制访问某些网站。 - 提高安全性
代理能对流量做过滤、检测,防止恶意攻击。
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
发表回复