嘿,老铁们,今天咱们来聊聊HTTP代理的那些事儿。做爬虫这行,代理简直就是我们的命根子啊!没有代理,你连个电商数据都爬不全,更别说那些高难度的反爬网站了。我踩过的坑比你见过的代理IP还多,今天就把我压箱底的干货都掏出来,让你少走弯路。
第一,选代理这事儿,千万别图便宜。那些免费代理,用的人比蚂蚁还多,你一请求,对方服务器直接把你拉黑。我一般会买那种按量付费的代理,虽然贵点,但质量有保障。特别是做跨境电商的,稳定的代理太重要了,不然你刚把商品信息爬下来,IP被封了,那损失可就大了。
说到代理管理,我有个小技巧分享给大家。用Python的requests库时,可以这样设置代理:
import requests
proxies = {
'http': 'http://your_proxy_ip:port',
'https': 'https://your_proxy_ip:port'
}
response = requests.get('http://example.com', proxies=proxies)
但这样每次都要写一遍多麻烦啊!我一般会写个代理池,自动轮换IP:
import random
proxy_list = [
'http://proxy1:port',
'http://proxy2:port',
'http://proxy3:port'
]
def get_random_proxy():
return {'http': random.choice(proxy_list), 'https': random.choice(proxy_list)}
# 使用时
response = requests.get('http://example.com', proxies=get_random_proxy())
这个简单吧?但还不够高级。我还会加个失败重试机制:
from requests.exceptions import ProxyError, ConnectTimeout, RequestException
def fetch_with_retry(url, max_retries=3):
for _ in range(max_retries):
try:
proxy = get_random_proxy()
response = requests.get(url, proxies=proxy, timeout=10)
return response
except (ProxyError, ConnectTimeout, RequestException) as e:
print(f"请求失败: {e}, 更换代理重试...")
continue
return None
这样即使某个代理挂了,程序也能自动切换,大大提高了稳定性。
接下来是请求头伪装。很多网站会检测你的请求头,发现是爬虫就直接拒绝。我一般会从浏览器里复制真实的请求头,特别是User-Agent和Referer这两个关键字段。
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',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Referer': 'https://www.google.com/'
}
response = requests.get(url, headers=headers, proxies=proxy)
但每次都用同一个User-Agent也很容易被识别,所以我一般会准备一个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/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0'
]
# 在请求中随机选择
headers['User-Agent'] = random.choice(user_agents)
请求频率控制也是个大学问。太频繁请求会被封IP,太慢又影响效率。我一般会加个随机延迟:
import time
import random
def random_delay(min_seconds=1, max_seconds=3):
delay = random.uniform(min_seconds, max_seconds)
time.sleep(delay)
# 在请求前后调用
random_delay()
response = requests.get(url, headers=headers, proxies=proxy)
random_delay()
这样你的请求看起来就像真实用户在操作,不会太规律。
说到会话保持,很多网站登录后会设置cookie,如果你每次都用不同的IP,服务器会认为你是不同用户,导致会话失效。我一般会把cookie和代理关联起来:
session = requests.Session()
# 第一次请求,获取cookie
response = session.get(url, headers=headers, proxies=proxy)
# 后续请求使用相同的session和cookie
response = session.get(url, headers=headers, proxies=proxy)
但这样还是不够,因为代理IP一直在变。我一般会固定几个代理IP,用完后再换新的,避免频繁切换导致cookie失效。
应对反爬机制,我还有个绝招:模拟浏览器行为。比如,先访问首页,再点击链接,末尾才抓取数据,这样看起来就像真实用户在浏览:
# 1. 先访问首页
home_response = session.get('https://example.com', headers=headers, proxies=proxy)
# 2. 再访问目标页面
target_response = session.get('https://example.com/target-page', headers=headers, proxies=proxy)
# 3. 末尾抓取数据
data = target_response.text
高级一点的,我还会用Selenium配合代理,模拟真实用户操作:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://your_proxy_ip:port')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://example.com')
这样能绕过很多基于JavaScript的反爬机制。
对了,还有一个很多人忽略的点:HTTPS代理。有些网站会检测你的连接是否加密,用HTTP代理访问HTTPS网站会被识别。所以配置代理时要注意:
proxies = {
'http': 'http://your_proxy_ip:port',
'https': 'https://your_proxy_ip:port' # 注意这里要用https
}
有时候代理服务商提供的代理可能不支持HTTPS,这种代理就不能用于访问HTTPS网站,白白浪费钱。
末尾,我再分享一个实战技巧:代理IP质量检测。不是所有付费代理都靠谱,我会写个小脚本来测试:
def test_proxy(proxy):
try:
response = requests.get('http://httpbin.org/ip', proxies=proxy, timeout=5)
if response.status_code == 200:
print(f"代理 {proxy} 可用")
return True
except Exception as e:
print(f"代理 {proxy} 失败: {e}")
return False
# 测试代理池中的所有代理
for proxy in proxy_list:
test_proxy({'http': proxy, 'https': proxy})
这样就能筛选出可用的代理,避免浪费资源。
其实做爬虫这行,经验比什么都重要。我踩过的坑太多了,比如曾经因为没处理好cookie,爬了三天三夜的数据全白费了。还有一次,代理IP没轮换好,把对方服务器搞崩溃了,差点吃官司。这些教训都是用真金白银换来的,希望你们能少走弯路。
总而言之,代理这东西,没有最好的,只有最适合的。根据你的需求选择合适的代理,灵活运用各种技巧,才能在爬虫这条路上走得更远。记住,技术是死的,人是活的,多实践多总结,你也能成为爬虫高手!