在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,然后结合代理池进行小批量测试,这样可以快速验证配置的有效性,避免因参数设置不当导致的频繁封禁。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐