如何建立自己的代理IP池,减少爬虫被封的几率

本文介绍了如何通过Python爬虫从89免费代理网站获取免费IP,测试其可用性,并将有效IP存入CSV文件作为个人代理IP池,以降低爬虫被封的风险。涉及到了requests、lxml和fake_useragent库的使用,以及IP可用性验证的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何建立自己的代理IP池,减少爬虫被封的几率

在爬虫过程中,难免会遇到各种各样的反爬虫,运气不好,还会被对方网站给封了自己的IP,就访问不了对方的网站,爬虫也就凉凉。

代理参数-proxies

首先我们先来介绍下什么是代理参数
代理,顾名思义,就是代理你原来的IP地址去对接网络
的IP地址
使用代理参数,可以隐藏自身真实的IP地址,避免被对方的网站封了。

1、语法结构
proxies = {
'协议':'协议://IP:端口号'
}
2、示例
proxies = {
'http':'http://IP:端口号',
'https':'https://IP:端口号'
}

如何获取代理IP

那具体如果获取代理IP呢,大多数IP都是收费,免费的IP的可以使用的很少,比如下面这些网站,

这次我就主要介绍爬取89网的免费IP,并测试可用性,存入自己的代理IP池中
89代理官网中有两种获取免费IP的方法,第一种就是主页面显示的IP地址

方法一

在这里插入图片描述
F12进行调试,页面是静态的页面,结构也相对简单,其IP地址全部在tr标签
在这里插入图片描述

import csv
import time ,random
import requests
from fake_useragent import UserAgent
from lxml import etree
class GetProxyIP(object):
	#初始化URL
    def __init__(self):
        self.url='https://www.89ip.cn/index_{}.html'
    # 获取代理IP
    def get_IP(self,url):
        html=requests.get(
            url=url,
            headers={
            'User-Agent':UserAgent().random
            },
            timeout=5
        ).text
        #转换为xpath可解析格式
        parse_html=etree.HTML(html)
        #解析得到所有tr列表
        tr_list=parse_html.xpath('//tr')
        #遍历每个tr,获取每个tr中的IP
        for tr in tr_list[1:]:
            ip=tr.xpath('.//td[1]/text()')[0].strip()
            port=tr.xpath('./td[2]/text()')[0].strip()
            #测试IP可用性
            self.mtest_ip(ip,port)

    def mtest_ip(self,ip,port):
        url='http://httpbin.org/get'
        #设置headers
        headers={
            'User-Agent':UserAgent().random
        }
        #设置proxies代理参数
        proxies={
            'http': f'http://{ip}:{port}',
            'https': f'https://{ip}:{port}'
        }
        try:
        	#发起请求
            res=requests.get(url=url,proxies=proxies,headers=headers,timeout=8)
            print(res.status_code)
            #得到状态码就说明IP可用
            if res.status_code:
                print(ip,port,'Sucess')
                #存到列表中
                L=[ip+':'+port]
                #写到csv中
                with open('proxies.csv', 'a', encoding='utf-8') as f:
                    writer=csv.writer(f)
                    writer.writerow(L)
        #IP不可用则抛出异常
        except Exception as e:
            print(ip,port,'Failed',e)
            
	#运行方法
    def main(self):
    	#爬取1000页
        for i in range(1,1001):
            url=self.url.format(i)
            #解析得到IP
            self.get_IP(url)
            time.sleep(random.randint(5,10))

if __name__ == '__main__':
    spider= GetProxyIP()
    spider.main()

方法二

在API接口中生成IP链接,访问进去也是有很多免费的代理IP
在这里插入图片描述
在这里插入图片描述
下面就直接爬虫代码进行爬取

# 获取开放代理接口
import csv

import requests
import re
from fake_useragent import UserAgent
# 获取代理IP列表
def get_ip_list():
    url='http://api.89ip.cn/tqdl.html?api=1&num=60&port=&address=&isp='
    html=requests.get(url=url,headers={'User-Agent':UserAgent().random}).text
    #按<br>分组
    t_arr=html.split('<br>')
    # 第一个特殊,需要先按</script>\n分组
    t_0=t_arr[1].split('</script>\n')[1].strip
    ip_list=[]
    ip_list.append(t_0)
    # 第二个及后面直接遍历就行
    for i in range(2,len(t_arr)-1):
        ip_list.append(t_arr[i])
    print(ip_list)
    #测试所有的IP可用性
    for ip in ip_list:
        mtest_ip(ip)
def mtest_ip(ip):
    url='http://baidu.com/'
    headers={
        'User-Agent':UserAgent().random
    }
    proxies={
        'http': f'http://{ip}',
        'https': f'https://{ip}'
    }
    try:
        res=requests.get(url=url,proxies=proxies,headers=headers,timeout=8)
        print(res.status_code)
        #一般状态码返回200就说明可用
        if res.status_code==200:
            print(ip,'Sucess')
            L=[ip]
            with open('proxies2.csv', 'a', encoding='utf-8', newline='') as f:
                writer=csv.writer(f)
                writer.writerow(L)
    except Exception as e:
        print(ip,'Failed',e)

if __name__ == '__main__':
    get_ip_list()

以后直接调用IP就可以用别人的代理了

### 配置高匿名代理IP的最佳实践 为了确保Python爬虫能够有效利用高匿名代理IP来规避目标网站的检测,可以采取一系列方法和最佳实践。这些措施不仅有助于提升爬虫的成功率,还能增强其稳定性和效率。 #### 使用`requests`库配置单个高匿名代理 当仅需使用单一高匿名代理时,可以通过修改请求头中的代理参数轻松完成设置: ```python import requests proxies = { 'http': 'http://192.0.2.1:80', 'https': 'https://192.0.2.1:80' } response = requests.get('https://example.com', proxies=proxies) print(response.status_code) ``` 此代码片段展示了如何指定HTTP(S)协议对应的代理服务器地址[^1]。 #### 构建并轮询代理 对于更复杂的场景,则建议构建一个动态更新的代理,并定期测试其中每条记录的有效性。这不仅能增加访问成功的几率,还可以减少因频繁更换同一IP而引发的风险。 创建代理的方式如下所示: ```python from random import choice def load_proxies(file_path='proxies.txt'): with open(file_path, 'r') as f: proxy_list = [line.strip() for line in f.readlines()] return proxy_list def get_random_proxy(proxy_pool): if not proxy_pool or len(proxy_pool) == 0: raise Exception("No available proxies.") selected_proxy = choice(proxy_pool) formatted_proxy = {'http': f'http://{selected_proxy}', 'https': f'https://{selected_proxy}'} return formatted_proxy ``` 上述函数实现了从文件读取多个代理至列表中存储的功能;并通过随机选取其中一个作为当前会话使用的代理[^2]。 #### 定期验证代理有效性 考虑到部分免费获取渠道提供的代理可能不稳定甚至失效,在实际应用前应当先对其进行简单的连通性检验: ```python def test_proxy_ip(session, ip, port): try: response = session.get( url="http://icanhazip.com/", timeout=5, proxies={'http': f"http://{ip}:{port}", 'https': f"https://{ip}:{port}"}) if str(ip).strip().split(":")[0].replace("\n", "") == response.text.strip(): print(f"{ip} is working!") return True except Exception as e: pass print(f"{ip} failed to connect.") return False ``` 这段逻辑用于确认给定的IP端口组合能否正常工作,只有返回True的结果才会被加入最终可用的代理集合内[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值