Pandas一键爬取解析代理IP与代理IP池的维护

news2025/1/17 8:56:43

目录

前言

一、获取代理IP

二、解析代理IP

三、维护代理IP池

四、完整代码

总结


前言

在爬虫过程中,我们经常会使用代理IP来绕过一些限制,比如防止被封IP等问题。而代理IP的获取和维护是一个比较麻烦的问题,需要花费一定的时间和精力。在Python中,使用Pandas库可以非常方便地实现代理IP的获取和维护,本文将详细介绍如何使用Pandas一键爬取解析代理IP并维护代理IP池。

一、获取代理IP

首先我们需要从代理IP网站获取代理IP,代理IP网站有很多,本文以西刺代理为例。

我们可以使用requests库发起一个GET请求,获取代理IP网站的源码。针对站大爷代理,其代理IP信息都被包含在table标签中,我们可以使用Pandas库对其进行解析。另外,西刺代理网站还提供了一些筛选条件,我们也可以用requests库模拟筛选条件的POST请求,将代理IP筛选出来。

代码如下:

import requests
import pandas as pd
from bs4 import BeautifulSoup

def get_ip_pool(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'
    }
    # 获取代理IP网站的源码
    res = requests.get(url, headers=headers)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    # 获取代理IP信息
    table = soup.find('table', {'id': 'ip_list'})
    df = pd.read_html(str(table))[0]
    # 筛选出有效的代理IP
    df = df[(df['类型'].isin(['HTTP', 'HTTPS'])) & (df['存活时间'].str.contains('天') | df['存活时间'].str.contains('小时') | df['存活时间'].str.contains('分钟'))]
    # 将DataFrame转换为列表
    ip_list = df[['IP地址', '端口号']].values.tolist()
    return ip_list

二、解析代理IP

我们已经获取到了代理IP,接下来需要对其进行解析。

代理IP的形式一般为:IP地址:端口号,我们需要将其拆分为IP地址和端口号两部分。可以使用str.split()函数将其拆分。

代码如下:

def parse_ip(ip_list):
    # 解析代理IP
    parsed_ip_list = []
    for ip in ip_list:
        parsed_ip_list.append(tuple(ip.split(':')))
    return parsed_ip_list

三、维护代理IP池

代理IP池是由一组可用的代理IP组成的集合,为了保证代理IP池的可用性,我们需要定时检测代理IP的可用性,并对不可用的代理IP进行删除。

我们可以使用requests库发起一个GET请求,以www.baidu.com为例,检测代理IP的可用性。如果响应状态码为200,则表示代理IP可用,否则代理IP不可用。

代码如下:

def check_ip(ip):
    # 检测代理IP可用性
    proxies = {
        'http': 'http://' + ':'.join(ip),
        'https': 'https://' + ':'.join(ip)
    }
    try:
        res = requests.get('https://www.baidu.com', proxies=proxies, timeout=5)
        if res.status_code == 200:
            return True
        else:
            return False
    except:
        return False

def maintain_ip_pool(ip_pool):
    # 维护代理IP池
    valid_ip_pool = []
    for ip in ip_pool:
        if check_ip(ip):
            valid_ip_pool.append(ip)
    return valid_ip_pool

四、完整代码

import requests
import pandas as pd
from bs4 import BeautifulSoup

def get_ip_pool(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'
    }
    # 获取代理IP网站的源码
    res = requests.get(url, headers=headers)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    # 获取代理IP信息
    table = soup.find('table', {'id': 'ip_list'})
    df = pd.read_html(str(table))[0]
    # 筛选出有效的代理IP
    df = df[(df['类型'].isin(['HTTP', 'HTTPS'])) & (df['存活时间'].str.contains('天') | df['存活时间'].str.contains('小时') | df['存活时间'].str.contains('分钟'))]
    # 将DataFrame转换为列表
    ip_list = df[['IP地址', '端口号']].values.tolist()
    return ip_list

def parse_ip(ip_list):
    # 解析代理IP
    parsed_ip_list = []
    for ip in ip_list:
        parsed_ip_list.append(tuple(ip.split(':')))
    return parsed_ip_list

def check_ip(ip):
    # 检测代理IP可用性
    proxies = {
        'http': 'http://' + ':'.join(ip),
        'https': 'https://' + ':'.join(ip)
    }
    try:
        res = requests.get('https://www.baidu.com', proxies=proxies, timeout=5)
        if res.status_code == 200:
            return True
        else:
            return False
    except:
        return False

def maintain_ip_pool(ip_pool):
    # 维护代理IP池
    valid_ip_pool = []
    for ip in ip_pool:
        if check_ip(ip):
            valid_ip_pool.append(ip)
    return valid_ip_pool

if __name__ == '__main__':
    url = 'https://www.zdaye.com'
    ip_list = get_ip_pool(url)
    parsed_ip_list = parse_ip(ip_list)
    valid_ip_pool = maintain_ip_pool(parsed_ip_list)
    print(valid_ip_pool)

总结

本文介绍了如何使用Pandas库一键爬取解析代理IP并维护代理IP池。Pandas库是Python中非常强大的数据处理库,可以大大简化数据处理的流程。在实际开发中,我们可以根据实际需求灵活使用Pandas库,提高数据处理效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1239473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重磅!这本30w人都在看的Python数据分析畅销书:更新了!

想学习python进行数据分析,这本《利用python进行数据分析》是绕不开的一本书。目前该书根据Python3.10已经更新到第三版。 Python 语言极具吸引力。自从 1991 年诞生以来,Python 如今已经成为最受欢迎的解释型编程语言。 pandas 诞生于2008年。它是由韦…

requests库中r.content 与 r.read() 的使用方式

目录 一、r.content属性 二、r.read()方法 三、两者区别 总结 requests库是Python中一个非常流行的HTTP客户端库,可以方便地发送所有类型的HTTP请求。在requests库中,r.content和r.read()是两个常用的方法,用于获取HTTP响应的内容。本文将…

数据结构与算法编程题11

已知两个链表A和B分别表示两个集合&#xff0c;其元素递增排列。 请设计算法求出A与B的交集&#xff0c;并存放于A链表中。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #defin…

Postman插件如何安装(一)

我们chrome插件网热门推荐的软件之一就是postman。但是postman的适应平台分为&#xff1a;postman chrome应用程序&#xff0c;postman应用程序&#xff0c;postman插件。谷歌应用商店从2018年3月开始停止chrome应用程序的更新。除非继续使用老版本的postman chrome应用程序&am…

基于区域划分的GaN HEMT 准物理大信号模型

GaN HEMT器件的大信号等效电路模型分为经验基模型和物理基模型。经验基模型具有较高精度但参数提取困难&#xff0c;特别在GaN HEMT器件工艺不稳定的情况下不易应用。相比之下&#xff0c;物理基模型从器件工作机理出发&#xff0c;参数提取相对方便&#xff0c;且更容易更新和…

关于 Docker

关于 Docker 1. 术语Docker Enginedockerd&#xff08;Docker daemon&#xff09;containerdOCI (Open Container Initiative)runcDocker shimCRI (Container Runtime Interface)CRI-O 2. 容器启动过程在 Linux 中的实现daemon 的作用 Docker 是个划时代的开源项目&#xff0c;…

pikachu_php反序列化

pikachu_php反序列化 源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }//O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_POST[o])){$s $_POST[…

Java如何获取泛型类型

泛型&#xff08;Generic&#xff09; 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型&#xff0c;在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Vis…

2023 年 亚太赛 APMCM ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 以五一杯 A题为例子&#xff0c;以下是咱们做的一些想法呀&am…

HTML新手入门笔记整理:HTML基本标签

结构标签 <html> </html> 告诉浏览器这个页面是从<html> 开始&#xff0c;到 </html>结束 <head> </head> 网页的头部&#xff0c;用于定义一些特殊内容&#xff0c;如页面标题、定时刷新、外部文件等。 <body> </body> …

2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲…

MySQL 事务的底层原理和 MVCC(二)

7.2. undo 日志 7.2.1. 事务回滚的需求 我们说过事务需要保证原子性&#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; 情况一&#xff1a;事务执行过程中可能遇到各种错误&a…

Differences between package.json and pnpm-lock.yaml

1.pnpm-lock.yaml 是pnpm包管理工具生成的确保依赖包的版本在所有的环境里面都相同对依赖包的任何操作都会更新在该文件中&#xff0c;因此&#xff0c;需要确保提交到代码仓库中。包含了解析的依赖项和版本号。如下图&#xff1a; 2.package.json 列出应用所需的依赖和元数…

LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 题目链接&#xff1a;343. 整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入…

MySQL 8.2 Command Line Client打开时一闪而过闪退问题

MySQL8.2安装成功后&#xff0c;发现打开MySQL 8.0 Command Line Client时出现一闪而过&#xff0c;打不开的情况。 解决方案&#xff1a; 1、打开MySQL 8.2 Command Line Client文件位置 2、右键选择属性 3、复制它的目标 4、我复制下来的目标路径是这样的&#xff0c;"…

每日一题:LeetCode-589.N叉树的前序遍历

每日一题系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

linux ld 链接器学习笔记

ld链接器笔记 1. 首先编写一段汇编代码 这里的汇编语法时 AT&T语法,是gcc原生支持的语法,底层使用 gas(gnu assembler) 完成汇编,相较于 Intel x86语法, AT&T 语法要更加古老,因此大多数人更加偏向于使用 Intel 的语法. nasm 编译器支持x86语法.自从2.10版本&#xf…

四、文件包含漏洞

一、文件包含漏洞 解释&#xff1a;文件包含漏洞是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行&#xff1b;其还能够使得服务器上的源代码被读取&#xff0c;在PHP里面我们把可重复使用的函数写入到单个文件中&#x…

Python 提高篇学习笔记(一):深拷贝和浅拷贝

文章目录 一、什么是对象的引用二、深拷贝和浅拷贝2.1 浅拷贝(Shallow Copy)2.2 深拷贝(Deep Copy)2.3 copy.copy和copy.deepcopy的区别 一、什么是对象的引用 在 Python 中&#xff0c;对象的引用是指变量指向内存中某个对象的地址或标识符。当你创建一个新的对象(比如一个整…

Spring Boot创建和使用(重要)

Spring的诞生是为了简化Java程序开发的&#xff01; Spring Boot的诞生是为了简化Spring程序开发的&#xff01; Spring Boot就是Spring框架的脚手架&#xff0c;为了快速开发Spring框架而诞生的&#xff01;&#xff01; Spring Boot的优点&#xff1a; 快速集成框架&#x…