[Prática do rastreador Python] O rastreador pode bloquear seu IP? Arranjo de pool de proxy IP

Prefácio

O uso de proxies é um problema comum ao rastrear a web. Devido a restrições em alguns sites, podemos ser bloqueados ou encontrar problemas como velocidades de acesso lentas ao acessar com frequência. Portanto, precisamos usar pools de proxy para evitar esses problemas. Este artigo apresentará como usar o pool de proxy IP para rastrear, com código e casos.

1. O que é um pool de proxy IP?

O pool de proxy IP é um serviço que pode obter dinamicamente um grande número de endereços IP de proxy. Ao atualizar constantemente a lista de IP do proxy e detectar a disponibilidade, ele pode evitar o bloqueio do acesso do rastreador. Um pool de proxy geralmente consiste em vários servidores proxy, e os endereços IP fornecidos por esses servidores proxy mudam constantemente.

2. Como usar o pool de proxy IP para rastreamento

Existem várias etapas para usar o pool de proxy IP para rastrear:

2.1 Obtenha IP proxy

Há muitas maneiras de obter IP proxy, como adquirir serviços proxy de terceiros, construir seu próprio servidor proxy, rastrear sites proxy gratuitos, etc. Entre eles, o rastreamento de sites proxy gratuitos é o método mais comum, mas a maioria dos proxies gratuitos são instáveis ​​e têm qualidade irregular, portanto, adquirir um serviço proxy de terceiros ou construir seu próprio servidor proxy será mais confiável.

2.2 Construir um pool de proxy

Armazene o IP do proxy obtido em um pool de proxy, geralmente usando uma estrutura de dados como Lista ou Fila, e então detecte-o em um determinado intervalo de tempo, remova o IP inválido ou readquira um novo IP e armazene-o no pool.

2.3 Use IP proxy no rastreador

O uso do IP do proxy na solicitação do rastreador pode ser implementado usando a biblioteca de solicitações ou o middleware proxy na estrutura Scrapy. Tomando como exemplo a biblioteca de solicitações, você precisa adicionar o IP do proxy no cabeçalho da solicitação, conforme mostrado abaixo:

import requests

proxies = {
  'http': 'http://ip:port',
  'https': 'http://ip:port',
}

response = requests.get(url, proxies=proxies)
2.4 Tratamento de exceções

Durante o processo de rastreamento, devido às diferentes estabilidades e disponibilidades dos IPs proxy, você pode encontrar alguns erros ou exceções. Por exemplo, tempo limite de solicitação, falha de IP do proxy, flutuação de rede, etc. Neste momento, precisamos lidar com exceções, podemos configurar solicitações de repetição, alterar IPs de proxy, etc., para garantir o funcionamento normal do programa.

3. Implementação de código

A seguir está um código simples de implementação do pool de proxy IP:

import requests
import threading
import time
from queue import Queue

# 获取代理IP
def get_proxies():
    # 这里使用免费代理网站进行获取,实际使用中需要替换成其他方式获取
    url ="https://www.zdaye.com/"
    response = requests.get(url).json()
    return [f"{i['protocol']}://{i['ip']}:{i['port']}" for i in response['data']['data_list']]

# 测试代理IP是否可用
def test_proxy(proxy, q):
    try:
        proxies = {
          'http': proxy,
          'https': proxy
        }
        response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=5)
        if response.status_code == 200:
            q.put(proxy)
            print(f"{proxy}可用")
    except:
        print(f"{proxy}不可用")

# 构建代理池
def build_proxies_pool():
    proxies_list = get_proxies()
    pool = Queue()
    threads = []
    # 开启多个线程对代理IP进行测试
    for proxy in proxies_list:
        t = threading.Thread(target=test_proxy, args=(proxy, pool))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()
    return pool

# 在爬虫中使用代理IP
def spider_request(url, proxies):
    try:
        response = requests.get(url, proxies={'http': proxies, 'https': proxies}, timeout=5)
        if response.status_code == 200:
            print(response.text)
    except:
        print(f"{proxies}请求失败")

if __name__ == '__main__':
    while True:
        pool = build_proxies_pool()
        if not pool.empty():
            proxies = pool.get()
            spider_request('http://httpbin.org/ip', proxies)
        time.sleep(5)

4. Análise de caso

Tomemos como exemplo o rastreamento das informações do usuário Zhihu para demonstrar o uso do pool de proxy IP.

import requests
import random
import time

# 构造请求头
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'}

# 获取代理IP
def get_proxies():
    # 这里使用免费代理网站进行获取,实际使用中需要替换成其他方式获取
    url ="https://www.zdaye.com/"
    response = requests.get(url).json()
    return [f"{i['protocol']}://{i['ip']}:{i['port']}" for i in response['data']['data_list']]

# 构造代理池
proxies_pool = get_proxies()

# 爬虫主体程序
def get_user_info(user_url):
    # 从代理池中随机选择一个代理IP
    proxies = random.choice(proxies_pool)
    try:
        response = requests.get(user_url, headers=headers, proxies={'http': proxies, 'https': proxies})
        if response.status_code == 200:
            print(response.text)
    except:
        print(f"{proxies}请求失败")

if __name__ == '__main__':
    user_list = ['https://www.zhihu.com/people/xie-ke-bai-11-86-24-2/followers',
                 'https://www.zhihu.com/people/gong-xin-10-61-53-51/followers',
                 'https://www.zhihu.com/people/y-xin-xin/followers']
    for user_url in user_list:
        get_user_info(user_url)
        time.sleep(5)

O texto acima é um programa rastreador de informações do usuário Zhihu simples, que usa um pool de proxy IP para evitar problemas de velocidade de acesso limitada e acesso bloqueado.

5. Resumo

Este artigo apresenta como usar um pool de proxy IP para evitar banimento e acesso restrito. Isso é conseguido obtendo o IP do proxy, construindo um pool de proxy, usando o IP do proxy no rastreador e lidando com exceções. Ao mesmo tempo, um caso simples é combinado para demonstração, na esperança de ser útil a todos.

Supongo que te gusta

Origin blog.csdn.net/wq10_12/article/details/132805025
Recomendado
Clasificación