使用 IP 池进行爬虫

在进行网络爬虫时,我们经常会遇到被网站封禁 IP 的问题。为了解决这个问题,我们可以使用 IP 池来轮流使用不同的 IP 地址,从而避免被封禁。在本文中,我们将介绍如何使用 Python 来实现 IP 池,以及如何在爬虫中使用它。

什么是 IP 池

IP 池是一个用于存储多个 IP 地址的集合。我们可以从 IP 池中随机选择一个 IP 地址,并在每次进行网络请求时使用不同的 IP 地址。通过使用不同的 IP 地址,我们可以模拟多个用户在进行访问,从而避免被封禁。

如何构建 IP 池

我们可以从多个来源获取 IP 地址,例如免费的 IP 代理网站或者付费的 IP 代理服务。在这里,我们将使用一个免费的 IP 代理网站 [ 来获取 IP 地址。

首先,我们需要安装 requestsbeautifulsoup4 库来进行网络请求和解析 HTML。

pip install requests beautifulsoup4

然后,我们可以编写一个函数来获取 IP 地址,并将其存储在一个列表中。

import requests
from bs4 import BeautifulSoup

def get_ip_list():
    url = '
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    ip_list = []
    for row in soup.find_all('tr')[1:]:
        columns = row.find_all('td')
        ip = columns[1].get_text()
        port = columns[2].get_text()
        ip_list.append(f'{ip}:{port}')
    return ip_list

上述代码中,我们使用了请求头来模拟浏览器发送请求,并使用 BeautifulSoup 库来解析 HTML 页面。我们遍历页面中的表格行,并提取每行中的 IP 地址和端口号,然后将其添加到 IP 列表中。

如何使用 IP 池

在使用 IP 池之前,我们需要对 IP 地址进行验证。我们可以编写一个函数来验证 IP 地址的可用性。

def check_ip(ip):
    url = '
    proxy = {'http': ip, 'https': ip}
    try:
        response = requests.get(url, proxies=proxy, timeout=5)
        if response.status_code == 200:
            return True
    except:
        return False
    return False

上述代码中,我们首先设置一个 URL 用于测试 IP 地址的可用性。然后,我们使用 requests 库的 proxies 参数来设置代理 IP,并设置超时时间为 5 秒。如果请求成功,即返回状态码为 200,我们就可以认为该 IP 地址可用。

接下来,我们可以编写一个函数来获取可用的 IP 地址,并随机选择一个 IP 地址来使用。

import random

def get_random_ip(ip_list):
    random_ip = random.choice(ip_list)
    if check_ip(random_ip):
        return random_ip
    else:
        ip_list.remove(random_ip)
        return get_random_ip(ip_list)

上述代码中,我们首先随机选择一个 IP 地址。如果该 IP 地址可用,则返回它;否则,我们从 IP 列表中移除该 IP 地址,并递归调用函数来获取另一个可用的 IP 地址。

现在,我们可以将上述代码整合到一个爬虫中,并使用 IP 池来进行网络请求。

def spider():
    ip_list = get_ip_list()
    ip = get_random_ip(ip_list)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    url = '
    proxy = {'http': ip, 'https