python搭建ip池

article/2025/10/24 4:05:36

 在爬取网站的时候我们有时候会遭受封ip等显现,因此我们需要搭建自己的ip池用于爬虫。

代码过程简述:

1、爬取代理ip网站信息

2、将获取的信息处理得到ip等关键信息

3、保存首次获取的ip信息并检测其是否可用

4、检测完毕将可用ip保存,搭建完成

本文是单线程,比较简单但效率可能没有那么快,多线程可以参考这篇文章:python搭建ip池(多线程)

下面是搭建完后的ip池展示:

 

老规矩先放总的代码后再一步步解析

# -*- coding: gbk -*-    # 防止出现乱码等格式错误
# ip代理网站:http://www.66ip.cn/areaindex_19/1.htmlimport requests
from fake_useragent import UserAgent
import pandas as pd
from lxml import etree # xpath# ---------------爬取该网站并获取通过xpath获取主要信息----------------
def get_list_ip(city_id):url = 'http://www.66ip.cn/areaindex_{}/1.html'.format(city_id)headers = {'User-Agent': UserAgent().random,}data_html = requests.get(url=url, headers=headers)data_html.encoding = 'gbk'data_html = data_html.texthtml = etree.HTML(data_html)etree.tostring(html)list_ip = html.xpath('//div[@align="center"]/table/tr/td/text()')      # 获取html含有ip信息的那一行数据return list_ip# --------------将爬取的list_ip关键信息进行处理、方便后续保存----------------
def dispose_list_ip(list_ip):num = int((int(len(list_ip)) / 5) - 1)  # 5个一行,计算有几行,其中第一行是标题直接去掉content_list = []for i in range(num):a = i * 5ip_index = 5 + a  # 省去前面的标题,第5个就是ip,往后每加5就是相对应iplocation_index = 6 + aplace_index = 7 + aitems = []items.append(list_ip[ip_index])items.append(list_ip[location_index])items.append((list_ip[place_index]))content_list.append(items)return content_list# -----------将处理结果保存在csv-------------
def save_list_ip(content_list,file_path):columns_name=["ip","port","place"]test=pd.DataFrame(columns=columns_name,data=content_list)         # 去掉索引值,否则会重复test.to_csv(file_path,mode='a',encoding='utf-8')print("保存成功")# -----------读取爬取的ip并验证是否合格-----------
def verify_ip(file_path):file = pd.read_csv(file_path)df = pd.DataFrame(file)verify_ip = []for i in range(len(df)):ip_port = str(df["ip"][i]) + ":" + str(df["port"][i])  # 初步处理ip及端口号headers = {"User-Agent": UserAgent().random}proxies = {'http': 'http://' + ip_port# 'https': 'https://'+ip_port}'''http://icanhazip.com访问成功就会返回当前的IP地址'''try:p = requests.get('http://icanhazip.com', headers=headers, proxies=proxies, timeout=3)item = []  # 将可用ip写入csv中方便读取item.append(df["ip"][i])item.append(df["port"][i])item.append(df["place"][i])verify_ip.append(item)print(ip_port + "成功!")except Exception as e:print("失败")return verify_ipif __name__ == '__main__':# ----------爬取与保存------------save_path = "test.csv"city_num = int(input("需要爬取几个城市ip"))   # 1~34之间,该网站只有34个城市页面content_list = []for i in range(city_num):             # 批量爬取list_ip关键信息并保存response = get_list_ip(i)list = dispose_list_ip(response)content_list += list        # 将每一页获取的列表连接起来save_list_ip(content_list,save_path)# -----------验证--------------open_path = "test.csv"ip = verify_ip(open_path)# ---------保存验证结果-----------save_path = "verify_ip.csv"save_list_ip(ip,save_path)

一、爬取代理ip网站信息

先导入所用到的库:

import requests    
from fake_useragent import UserAgent    # 用来随机UserAgent值(用自己的也不影响)
import pandas as pd
from lxml import etree # xpath

随便找到一个免费的ip代理网站

 这个网站没什么反爬机制,找到网站的url规律直接request  get他就行

 这里可以看出只是改了一下数字而已,直接get他

# ---------------爬取该网站并获取通过xpath获取主要信息----------------
def get_list_ip(city_id):      #  city_id用来询问要爬取多少个城市url = 'http://www.66ip.cn/areaindex_{}/1.html'.format(city_id)headers = {'User-Agent': UserAgent().random,}data_html = requests.get(url=url, headers=headers)data_html.encoding = 'gbk'data_html = data_html.texthtml = etree.HTML(data_html)etree.tostring(html)list_ip = html.xpath('//div[@align="center"]/table/tr/td/text()')      # 获取html含有ip信息的那一行数据return list_ip

尝试输出一下看一下结果 

city_num = int(input("需要爬取几个城市ip"))   # 1~34之间,该网站只有34个城市页面for i in range(city_num):             # 批量爬取list_ip关键信息并保存response = get_list_ip(i)print(response)

 二、将获取的信息处理得到ip等关键信息

从上面返回的结果看出,列表每隔五个出现一次循环,假设列表有n个元素,那么就有n/5个ip,第五个开始出现ip,第六个出现端口号,第七个出现地址,列表第5+5个出现第二个ip,6+5个位置出现第二个端口号,有这个规律后就可以开始处理。

def dispose_list_ip(list_ip):num = int((int(len(list_ip)) / 5) - 1)  # 5个一行,计算有几行,其中第一行是标题直接去掉content_list = []for i in range(num):a = i * 5ip_index = 5 + a  # 省去前面的标题,第5个就是ip,往后每加5就是相对应iplocation_index = 6 + aplace_index = 7 + aitems = []items.append(list_ip[ip_index])items.append(list_ip[location_index])items.append((list_ip[place_index]))content_list.append(items)return content_list

 尝试输出一下:

    city_num = int(input("需要爬取几个城市ip"))   # 1~34之间,该网站只有34个城市页面content_list = []for i in range(city_num):             # 批量爬取list_ip关键信息并保存response = get_list_ip(i)list = dispose_list_ip(response)content_list += list        # 将每一页获取的列表连接起来print(content_list)

 三、保存首次获取的ip信息并检测其是否可用

保存代码:

def save_list_ip(content_list,file_path):columns_name=["ip","port","place"]test=pd.DataFrame(columns=columns_name,data=content_list)         # 去掉索引值,否则会重复test.to_csv(file_path,mode='a',encoding='utf-8')print("保存成功")

首次保存后,读取保存的ip并对其进行一个验证是否可用,验证完毕后再将可用ip保存到csv中

# -----------读取爬取的ip并验证是否合格-----------
def verify_ip(file_path):file = pd.read_csv(file_path)df = pd.DataFrame(file)verify_ip = []for i in range(len(df)):ip_port = str(df["ip"][i]) + ":" + str(df["port"][i])  # 初步处理ip及端口号headers = {"User-Agent": UserAgent().random}proxies = {'http': 'http://' + ip_port# 'https': 'https://'+ip_port}'''http://icanhazip.com访问成功就会返回当前的IP地址'''try:p = requests.get('http://icanhazip.com', headers=headers, proxies=proxies, timeout=3)item = []  # 将可用ip写入csv中方便读取item.append(df["ip"][i])item.append(df["port"][i])item.append(df["place"][i])verify_ip.append(item)print(ip_port + "成功!")except Exception as e:print("失败",e)return verify_ip

最终运行:

将上面全部功能模块合并在一起就搭建完成啦!

if __name__ == '__main__':# ----------爬取与保存------------save_path = "test.csv"city_num = int(input("需要爬取几个城市ip"))   # 1~34之间,该网站只有34个城市页面content_list = []for i in range(city_num):             # 批量爬取list_ip关键信息并保存response = get_list_ip(i)list = dispose_list_ip(response)content_list += list        # 将每一页获取的列表连接起来print(content_list)save_list_ip(content_list,save_path)# -----------验证--------------open_path = "test.csv"ip = verify_ip(open_path)# ---------保存验证结果-----------save_path = "verify_ip.csv"save_list_ip(ip,save_path)


http://chatgpt.dhexx.cn/article/IvE9mILL.shtml

相关文章

搭建免费代理IP池

👨‍💻博客主页:i新木优子👀 🎉欢迎关注🔍点赞👍收藏⭐留言📝 🧚‍♂️寄语:成功的秘诀就是每天都比别人多努力一点👣 ✨有任何疑问欢迎评论探讨 先声明一下&…

python搭建ip池(多线程)

之前有讲过怎么搭建ip池,但由于单线程的效率太低,于是我们升级改造一下,将单线程变成多线程来搭建ip池,之前的方法可以参考一下:python搭建ip池 (如果会简单的request和提取文字就可以直接不看)…

教你自己搭建一个IP池(绝对超好用!!!!)

随着我们爬虫的速度越来越快,很多时候,有人发现,数据爬不了啦,打印出来一看。 不返回数据,而且还甩一句话 是不是很熟悉啊? 要想想看,人是怎么访问网站的? 发请求,对…

Python爬虫实战(二):爬取快代理构建代理IP池

目录 🌹前言构建IP池的目的爬取目标准备工作代码分析第一步第二步第三步第四步第五步完整代码使用方法 🌹前言 博主开始更新爬虫实战教程了,期待你的关注!!! 第一篇:Python爬虫实战(…

ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'

MySQL> update user set host% where user root; ERROR 1062 (23000): Duplicate entry %-root for key PRIMARY 然后查看了下数据库的host信息如下: host已经有了%这个值,所以直接运行命令: 复制代码 代码如下: MySQL>flush priv…

Mysql 报错 ERROR 1062 (23000): Duplicate entry ‘%-root‘ for key ‘PRIMARY‘

文章目录 错误详情错误原因解决方案最后 错误详情 今天在云主机上配置Hive时,设置远程连接的权限报错如下: 错误原因 之前电脑上已经有了%, 解决方案 查看一下电脑中是否已经具有% select host,user from user where userroot;如果已经存…

ORA-20000

exec dbms_stats.gather_database_stats(ESTIMATE_PERCENT>100, method_opt > FOR ALL INDEXED COLUMNS SIZE AUTO, cascade>true, degree>120);在12c和19c中,想要启用资源管理,必须先把并发收集统计信息禁用。 alter system set resource_…

mysql一张表复制到另外一张表,报错[23000][1062] Duplicate entry ‘1‘ for key ‘big_2.PRIMARY‘

mysql一张表复制到另外一张表 insert into big_2 select * from big_4 报错 [23000][1062] Duplicate entry 1 for key big_2.PRIMARY 看报错,是big_2的主键已经有1了,不能再插入相同的值,我这边id是自增字段,指定插入字段就能解决…

我32岁,花23000元从雕刻员转行程序员,承诺保底6K,选IT是成功了吧

我从22岁起,就开始在县城一家雕刻厂做流水线工人,从厂房门口看过去,雕刻厂的一切都是灰色的,到处落满花岗岩的灰屑。 一边是师傅们趴在石料上无休止地劳作,一边是新安装的数控雕刻机发出尖刻的响声,我是这…

Mysql出现问题:ERROR 1451 (23000): Cannot delete or updatea parent row: a foreign key constraint fail解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…

Mysql出现问题:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…

[23000][1452] Cannot add or update a child row: a foreign key constraint fails (`test2`.`#sql-1238_5

在建立外键关系时,出现该报错信息: [23000][1452] Cannot add or update a child row: a foreign key constraint fails (test2.#sql-1238_50, CONSTRAINT fk_student_ID FOREIGN KEY (ID) REFERENCES achievement (ID)) 原因: 建立外键时&a…

函数批量插入报错ERROR 1062 (23000): Duplicate entry ‘x‘ for key ‘y.PRIMARY‘

问题 测试时候发现,如果直接执行Insert语句是完全没有问题的,但是一旦使用mysql函数对insert语句中的主键做1操作,就开始ERROR 1062; 数据库版本 表结构 直接插入操作 - 正常 mysql函数批量插入操作 -ERROR 1062 错误原因 set t…

[23000][1062] Duplicate entry ‘6‘ for key ‘PRIMARY‘

在 DataGrip 里插入数据的时候,我试图修改已经设置成了主键和自增的字段 ID,所以导致了该问题: [23000][1062] Duplicate entry 6 for key PRIMARY 翻译过来的意思:密钥“PRIMARY”的重复条目“6” 原因: 因为 ID 字…

Mysql出现问题:ERROR 1022 (23000): Can‘t write; duplicate key in table ‘**‘解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…

Mysql出现问题:ERROR 1062 (23000): Duplicate entry ‘‘ for key ‘PRIMARY‘解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…

Mysql出现问题:ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constrain fail解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆&…

SQLSTATE[23000]: Integrity constraint violation:1062 Duplicate entry1664187678631531497821000‘ 解决办法

SQLSTATE[23000]: Integrity constraint violation:1062 Duplicate entry1664187678631531497821000 for key UK ns payrefund out trade no 问题截图解决办法 问题截图 记录一下问题>~< 解决办法 将字段out_trade_no设置为普通索引&#xff08;NORMAL&#xff09;即可…

mysql中的错误代码1452(23000)和 1062(23000)

文章目录 mysql中的错误代码1452(23000)解决 先将外键的数据补充完整 mysql 错误代码&#xff1a; 1062&#xff08;23000&#xff09;分析 mysql中的错误代码1452(23000) 其实出现错误的原因是&#xff1a;插入外键的数据在另一张表的主键中不存在&#xff1b; 【也就是逐渐已…

记录SQL Server中的23000错误

记录一个SQL Server中的23000错误 文章目录 错误描述如何解决 错误描述 [23000] [Microsoft][SQL Server Native Client 10.0][SQL Server]当IDENTITY_INSERT设置为ОFF时&#xff0c;不能为表’RCEIS_CONFIRM’中的标识列插入显式值。(544) 如何解决 执行一下下面语句 SET IDE…