Python爬虫中获取Cookie和添加代理池的完整指南
在Python爬虫开发中,Cookie和代理池是应对网站反爬机制的两个核心技术。Cookie用于维持会话状态和身份验证,代理池则用于避免IP被封禁。
Cookie的获取与使用
Cookie的作用与原理
Cookie是服务器返回的加密字符串,记录了用户的登录状态和属性信息。它相当于网站在你设备上放置的"临时身份证",在有效期内携带Cookie访问网站,服务器就能识别你的身份。
获取Cookie的两种主要方法
1. 手动复制方式
通过浏览器开发者工具获取Cookie是最直接的方法:
打开Chrome开发者工具 → Network选项
刷新页面后查看请求的Request Headers
复制Cookie字段的值用于爬虫程序
2. 自动获取方式
使用Selenium模拟浏览器登录后自动获取Cookie:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://目标网站.com/login")
# 执行登录操作...
cookies = driver.get_cookies()
# 将cookies转换为字典格式用于requests
代理池的构建与应用
为什么需要代理池
高频访问同一网站容易触发IP封禁,通过代理IP轮换可以有效规避这种限制。
代理IP的获取渠道
免费代理:西刺代理、快代理等(稳定性较差)。
付费代理:代理云等(稳定性好,推荐商用)。
自建代理:购买服务器搭建专属代理池。
代理池的完整实现
以下是一个功能完整的Cookie管理和代理池爬虫项目:
import requests
import json
import time
from bs4 import BeautifulSoup
import random
class CookieProxyManager:
def __init__(self):
self.session = requests.Session()
self.proxy_list = []
self.cookies_file = 'cookies.json'
# 设置默认请求头模拟浏览器
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Referer': 'https://www.google.com/'
}
def load_cookies_from_file(self):
"""从文件加载Cookie"""
try:
with open(self.cookies_file, 'r', encoding='utf-8') as f:
cookies_dict = json.load(f)
self.session.cookies.update(cookies_dict)
print("Cookie加载成功")
except FileNotFoundError:
print("Cookie文件不存在,将创建新文件")
def save_cookies_to_file(self):
"""保存Cookie到文件"""
cookies_dict = requests.utils.dict_from_cookiejar(self.session.cookies)
with open(self.cookies_file, 'w', encoding='utf-8') as f:
json.dump(cookies_dict, f, ensure_ascii=False, indent=2)
print("Cookie保存成功")
def get_cookies_manually(self, url):
"""手动获取Cookie的辅助方法"""
print(f"请按以下步骤操作获取Cookie:")
print(f"1. 手动访问: {url}")
print(f"2. 打开浏览器开发者工具(F12)")
print(f"3. 在Network标签中找到请求")
print(f"4. 复制Request Headers中的Cookie值")
return input("请输入Cookie值: ")
def manual_cookie_setup(self, cookie_str):
"""设置手动复制的Cookie"""
cookies_dict = {}
for item in cookie_str.split(';'):
if '=' in item:
key, value = item.strip().split('=', 1)
cookies_dict[key] = value
self.session.cookies.update(cookies_dict)
print("手动Cookie设置成功")
def fetch_proxy_ips(self, proxy_url='https://www.xicidaili.com/'):
"""从代理网站获取代理IP列表"""
try:
response = self.session.get(proxy_url, headers=self.headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
proxy_ips = []
# 解析代理IP表格
proxy_table = soup.find('table', {'id': 'ip_list'})
if proxy_table:
rows = proxy_table.find_all('tr')[1:] # 跳过表头
for row in rows:
cols = row.find_all('td')
if len(cols) >= 8:
ip = cols[1].text
port = cols[2].text
protocol = cols[5].text.lower()
if protocol in ['http', 'https']:
proxy_url = f"{protocol}://{ip}:{port}"
proxy_ips.append(proxy_url)
self.proxy_list = proxy_ips
print(f"成功获取 {len(proxy_ips)} 个代理IP")
return proxy_ips
except Exception as e:
print(f"获取代理IP失败: {e}")
return []
def validate_proxy(self, proxy):
"""验证代理IP是否可用"""
test_url = 'http://httpbin.org/ip'
try:
proxies = {
'http': proxy,
'https': proxy
}
response = self.session.get(test_url, proxies=proxies, timeout=5)
if response.status_code == 200:
return True
except:
pass
return False
def get_random_proxy(self):
"""获取随机可用的代理IP"""
if not self.proxy_list:
self.fetch_proxy_ips()
if self.proxy_list:
return random.choice(self.proxy_list)
return None
def request_with_retry(self, url, max_retries=3, use_proxy=True):
"""带重试机制的请求方法"""
for attempt in range(max_retries):
try:
proxies = None
if use_proxy:
proxy = self.get_random_proxy()
if proxy:
proxies = {'http': proxy, 'https': proxy}
response = self.session.get(url, headers=self.headers,
proxies=proxies, timeout=10)
response.raise_for_status()
# 更新Cookie(如果服务器返回新的)
if response.cookies:
self.session.cookies.update(response.cookies)
return response
except requests.RequestException as e:
print(f"请求失败 (尝试 {attempt + 1}/{max_retries}): {e}")
if attempt < max_retries - 1:
time.sleep(2 ** attempt) # 指数退避
return None
if __name__ == "__main__":
manager = CookieProxyManager()
# 演示使用方法
test_url = "https://httpbin.org/cookies"
response = manager.request_with_retry(test_url)
if response:
print("请求成功!")
print(f"返回内容: {response.text}")
else:
print("所有重试均失败")
代码功能说明
核心功能模块:
1.Cookie管理
支持手动和自动两种Cookie获取方式
提供Cookie的持久化存储和加载功能
自动更新服务器返回的新Cookie
2.代理池管理
自动从代理网站抓取IP列表
内置代理IP验证机制
支持随机代理轮换策略
3.请求重试机制
指数退避算法避免频繁请求
自动代理失效切换
完整的异常处理
实用建议
建议先使用浏览器手动获取目标网站的Cookie,然后结合代理池进行小批量测试,这样可以快速验证配置的有效性,避免因参数设置不当导致的频繁封禁。
更多推荐
所有评论(0)