Python 爬虫抓取可用代理 IP,然后怎么用呢?

null
Python 爬虫抓取可用代理 IP,然后怎么用呢?

3 回复
import requests
from concurrent.futures import ThreadPoolExecutor
import time

class ProxyPool:
    def __init__(self):
        self.proxies = []
        self.test_url = "http://httpbin.org/ip"  # 测试代理是否可用的地址
        
    def fetch_proxies(self):
        """从免费代理网站抓取IP(示例使用西刺代理)"""
        url = "https://www.xicidaili.com/nn/"
        headers = {'User-Agent': 'Mozilla/5.0'}
        
        try:
            resp = requests.get(url, headers=headers, timeout=10)
            # 这里需要根据实际网页结构解析HTML
            # 示例中仅演示流程,实际需要BeautifulSoup解析
            print("抓取代理IP完成(需补充解析逻辑)")
            
            # 模拟获取到的代理
            self.proxies = [
                'http://123.45.67.89:8080',
                'http://111.222.333.444:8888'
            ]
        except Exception as e:
            print(f"抓取失败: {e}")
    
    def test_proxy(self, proxy):
        """测试单个代理是否可用"""
        try:
            resp = requests.get(
                self.test_url,
                proxies={'http': proxy, 'https': proxy},
                timeout=5
            )
            if resp.status_code == 200:
                print(f"✅ {proxy} 可用")
                return proxy
        except:
            pass
        print(f"❌ {proxy} 无效")
        return None
    
    def validate_proxies(self):
        """验证所有代理IP"""
        valid_proxies = []
        with ThreadPoolExecutor(max_workers=10) as executor:
            results = executor.map(self.test_proxy, self.proxies)
            for result in results:
                if result:
                    valid_proxies.append(result)
        self.proxies = valid_proxies
        print(f"验证完成,剩余 {len(self.proxies)} 个可用代理")
    
    def get_proxy(self):
        """随机获取一个可用代理"""
        import random
        return random.choice(self.proxies) if self.proxies else None
    
    def use_proxy_example(self):
        """使用代理发送请求的示例"""
        proxy = self.get_proxy()
        if not proxy:
            print("没有可用代理")
            return
            
        try:
            # 使用代理访问目标网站
            resp = requests.get(
                'https://httpbin.org/headers',
                proxies={'http': proxy, 'https': proxy},
                timeout=10
            )
            print(f"使用代理 {proxy} 成功")
            print(f"响应内容: {resp.json()}")
        except Exception as e:
            print(f"请求失败: {e}")

# 使用示例
if __name__ == "__main__":
    pool = ProxyPool()
    
    # 1. 抓取代理
    pool.fetch_proxies()
    
    # 2. 验证代理
    pool.validate_proxies()
    
    # 3. 使用代理
    if pool.proxies:
        pool.use_proxy_example()
    else:
        print("没有可用的代理IP")

核心步骤:

  1. 抓取代理:从代理网站获取IP列表(需要实际解析HTML)
  2. 验证代理:用测试网址检查代理是否真正可用
  3. 使用代理:通过requests.get(proxies={'http': proxy})参数传入代理

实际使用时需要:

  • 补充代理网站的HTML解析逻辑(用BeautifulSoup)
  • 定期更新代理池(代理IP失效很快)
  • 考虑代理协议类型(HTTP/HTTPS/SOCKS)

总结:先验证再使用,别直接用抓来的IP。


常用的 HTTP 请求库和爬虫框架都支持设代理的方法,去看下文档就好。

回到顶部