Python爬虫设置IP代理
设置代理(Proxy)
作用:
当网站检测到某个IP的访问频率过高时,可能会封禁该IP。通过使用代理服务器,可以定期更换IP地址,避免被识别和封锁。
优势:
让网站无法追踪真实请求来源,提升爬虫的隐蔽性和稳定性。
分类:
透明代理
-
特点:目标网站能检测到你在使用代理,并知道你的真实IP地址。
-
适用性:不符合隐藏真实IP的需求。
匿名代理
-
特点:目标网站知道你使用了代理,但无法获取你的真实IP。
-
适用性:提供基础匿名性,但仍有被识别的风险。
高匿代理(推荐)
-
特点:目标网站既无法检测代理使用,也无法获取真实IP。
-
适用性:最适合爬虫场景,隐蔽性最高。
IP可以自己在网上搜免费的或者购买IP代理池
# 导入必要的库
from urllib.request import Request, build_opener # 用于创建请求和打开器
from fake_useragent import UserAgent # 用于生成随机User-Agent
from urllib.request import ProxyHandler # 用于设置代理# 定义目标URL
url = 'http://httpbin.org/get'# 设置请求头,使用随机生成的Chrome浏览器User-Agent
headers = {'User-Agent': UserAgent().chrome
}# 创建请求对象,传入URL和请求头
request = Request(url, headers=headers)# 设置代理(注释展示了不同格式的代理配置)
# 格式1: 带用户名密码的代理
# handler = ProxyHandler({"http": "username:password@ip:port"})
# 格式2: 实际用户名密码和代理IP端口的示例(已注释,避免暴露敏感信息)
# handler = ProxyHandler({"http": "dtxqwxkb:scocqa4e@180.103.123.171:16818"})
# 格式3: 仅IP和端口的代理(无认证)
# handler = ProxyHandler({"http": "ip:port"})
# 实际使用的代理配置(当前启用的是无认证代理)
handler = ProxyHandler({"http": "180.103.123.171:16818"})# 创建带有代理配置的打开器
opener = build_opener(handler)# 发送请求并获取响应
response = opener.open(request)# 打印响应内容(解码为UTF-8字符串)
print(response.read().decode('utf-8'))
实现自动更换代理IP:
方法1:从代理池随机选择(需提前准备IP列表)
import random
from urllib.request import Request, build_opener, ProxyHandler
from fake_useragent import UserAgent# 代理池(示例IP,需替换为实际可用的代理)
proxy_pool = ["180.103.123.171:16818","203.156.124.82:8080","45.167.124.10:9999"
]# 随机选择一个代理
proxy = random.choice(proxy_pool)
handler = ProxyHandler({"http": proxy})# 创建请求
url = 'http://httpbin.org/get'
headers = {'User-Agent': UserAgent().chrome}
request = Request(url, headers=headers)# 发送请求
opener = build_opener(handler)
response = opener.open(request)
print(f"当前代理IP: {proxy}")
print(response.read().decode('utf-8'))
方法2:通过API动态获取新IP(需代理服务商支持)
import requests
from urllib.request import Request, build_opener, ProxyHandler
from fake_useragent import UserAgent# 从代理服务商API获取新IP(示例API,需替换为实际接口)
def get_new_proxy():api_url = "https://your-proxy-service.com/api/get-ip"response = requests.get(api_url).json()return f"{response['ip']}:{response['port']}"# 动态获取代理
proxy = get_new_proxy()
handler = ProxyHandler({"http": proxy})# 创建请求
url = 'http://httpbin.org/get'
headers = {'User-Agent': UserAgent().chrome}
request = Request(url, headers=headers)# 发送请求
opener = build_opener(handler)
response = opener.open(request)
print(f"当前代理IP: {proxy}")
print(response.read().decode('utf-8'))