首页 > 编程语言 >python开发实战——ip池

python开发实战——ip池

时间:2023-08-02 17:04:59浏览次数:29  
标签:实战 python ip 代理 headers proxy IP proxies

前言

代理IP池是一组可用的代理IP地址,用于访问网站或执行其他网络请求。它可以帮助我们在网络请求时隐藏我们的真实IP地址,从而提高网络安全性、匿名性和稳定性。同时,代理IP池还可以通过定时更新和测试代理IP,保证代理IP的有效性和稳定性。

本文将介绍如何使用Python编写代理IP池,包括如何获取代理IP、测试代理IP有效性和管理代理IP池等内容。


1. 获取代理IP

获取代理IP的方法有很多种,比如从代理IP提供商购买,或者从免费代理IP网站爬取。在本文中,我们将使用爬虫从免费代理IP网站爬取代理IP。


首先,我们需要选择一个免费代理IP网站比如站大爷。在该网站中,我们可以找到各种类型的代理IP,如HTTP、HTTPS和SOCKS等。我们可以通过爬虫来获取这些代理IP。


在Python中,我们可以使用requests和BeautifulSoup库来实现爬取代理IP的功能。以下是一个示例代码:


import requests

from bs4 import BeautifulSoup

  
url = "https://www.zdaye.com/nn/"

  
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.36 Edge/16.16299"

}

  
response = requests.get(url, headers=headers)

  
soup = BeautifulSoup(response.text, 'html.parser')

  
ip_list = soup.select("#ip_list tr")

for ip in ip_list[1:]:

    tds = ip.select("td")

    ip_address = tds[1].text

    ip_port = tds[2].text

    ip_type = tds[5].text.lower()

    print("{0}://{1}:{2}".format(ip_type, ip_address, ip_port))

上述代码中:


`url`定义了要爬取的网页地址。

`headers`定义了请求头信息,包括`User-Agent`等信息。

`requests.get()`函数用于获取网页内容。

`soup.select()`函数用于指定CSS选择器来选取网页中的元素。

`tds`变量包含了每个代理IP的IP地址、端口号和类型等信息。

`print()`函数用于输出每个代理IP的完整信息。

运行上述代码后,可以获取到一些代理IP,但这些代理IP并不一定都是有效的。因此,我们需要测试代理IP的有效性。


2. 测试代理IP的有效性

测试代理IP的有效性是指检查代理IP是否可以正常使用,比如是否可以访问指定的网站。在Python中,我们可以使用requests库来测试代理IP的有效性。


以下是一个测试代理IP的示例代码:


import requests

  
# 要访问的网站

url = "https://www.baidu.com"

  
# 代理IP

proxies = {

    "http": "http://117.91.138.139:9999",

    "https": "https://117.91.138.139:9999",

}

  
# 请求头信息

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.36 Edge/16.16299"

}

  
try:

    response = requests.get(url, proxies=proxies, headers=headers, timeout=5)

    if response.status_code == 200:

        print("Valid proxy:", proxies)

    else:

        print("Invalid proxy:", proxies)

except:

    print("Invalid proxy:", proxies)

上述代码中:


`url`定义了要访问的网站。

`proxies`定义了要测试的代理IP地址和端口号。

`requests.get()`函数用于发送GET请求。

`response.status_code`用于获取响应的状态码,如果是200,则说明代理IP有效。

`timeout`参数用于设置请求超时时间。

`try-except`语句用于捕获异常,如果发生异常,则说明代理IP无效。

使用以上方法爬取代理IP并测试后可以得到一些有效的代理IP。但由于代理IP的有效期很短,而且有些代理IP可能会因为多次请求导致被封禁,因此我们需要定时更新代理IP池。


3. 管理代理IP池

管理代理IP池是指将获取到的代理IP存储在一个容器中,并定时更新这个容器中的代理IP。在Python中,我们可以使用列表或数据库来存储代理IP。


以下是一个使用列表管理代理IP池的示例代码:


import time

import requests

from bs4 import BeautifulSoup

  
url = "https://www.zdaye.com/nn/"

  
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.36 Edge/16.16299"

}

  
# 代理IP池

proxy_pool = []

  
def get_proxies():

    global proxy_pool

  
    response = requests.get(url, headers=headers)

    soup = BeautifulSoup(response.text, 'html.parser')

    ip_list = soup.select("#ip_list tr")

  
    for ip in ip_list[1:]:

        tds = ip.select("td")

        ip_address = tds[1].text

        ip_port = tds[2].text

        ip_type = tds[5].text.lower()

        proxy = "{0}://{1}:{2}".format(ip_type, ip_address, ip_port)

  
        # 测试代理IP是否有效

        if test_proxy(proxy):

            proxy_pool.append(proxy)

  
def test_proxy(proxy):

    # 要访问的网站

    url = "https://www.baidu.com"

  
    # 代理IP

    proxies = {

        "http": proxy,

        "https": proxy,

    }

  
    # 请求头信息

    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.36 Edge/16.16299"

    }

  
    try:

        response = requests.get(url, proxies=proxies, headers=headers, timeout=5)

        if response.status_code == 200:

            return True

        else:

            return False

    except:

        return False

  
def update_proxies():

    global proxy_pool

  
    while True:

        # 每隔5分钟更新一次代理IP池

        time.sleep(5 * 60)

  
        # 更新代理IP池

        proxy_pool = []

        get_proxies()

  
if __name__ == '__main__':

    # 启动更新代理IP池的线程

    t = threading.Thread(target=update_proxies)

    t.start()

  
    # 使用代理IP访问网站

    while True:

        if len(proxy_pool) > 0:

            proxy = random.choice(proxy_pool)

            proxies = {

                "http": proxy,

                "https": proxy,

            }

            response = requests.get(url, proxies=proxies, headers=headers, timeout=5)

            if response.status_code == 200:

                print(response.text)

                time.sleep(5)

        else:

            time.sleep(1)


上述代码中:


`proxy_pool`列表用于存储代理IP。

`get_proxies()`函数用于获取代理IP并添加到`proxy_pool`列表中。

`test_proxy()`函数用于测试代理IP是否有效。

`update_proxies()`函数用于定时更新`proxy_pool`列表中的代理IP。

`time.sleep()`函数用于设置线程的睡眠时间。

`random.choice()`函数用于随机选择一个代理IP。

`response.status_code == 200`用于检查响应的状态码,如果是200,则说明代理IP有效。

运行上述代码后,可以看到代理IP池中的代理IP会随着时间的推移而不断地更新,并且可以正常使用。


总结

本文介绍了如何使用Python编写代理IP池,包括如何获取代理IP、测试代理IP有效性和管理代理IP池等内容。通过学习本文,您可以更好地了解代理IP的基本概念和实现方法,从而更好地应用代理IP来爬取数据或保护个人隐私。

标签:实战,python,ip,代理,headers,proxy,IP,proxies
From: https://blog.51cto.com/u_16022798/6940234

相关文章

  • Unity的IPostprocessBuildWithReport:深入解析与实用案例
    UnityIPostprocessBuildWithReportUnityIPostprocessBuildWithReport是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目后自动执行一些操作,并且可以获取构建报告。这个功能可以帮助开发提高工作效率,减少手动操作的时间和错误率。在本文中,我们将介绍UnityIPostproces......
  • 国标GB28181国标平台LntonGBS(源码版)国标视频平台实现设备录像设置收留IP的具体操作方
    国标视频云服务LntonGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • # yyds干货盘点 # 盘点一个Python递归的基础题目
    大家好,我是皮皮。一、前言前几天在Python黄金群【维哥】问了一个Python递归的基础问题,一起来看看吧。看上去代码没多少哈,但是韵味无穷。二、实现过程很多初学者遇到这个问题,很容易把答案说成是3,2,2这样,其实正好相反,这里【巭孬嫑勥烎】给了一个解释。这么一看好像还是不太好理解,看看......
  • 盘点一个Python递归的基础题目
    大家好,我是皮皮。一、前言前几天在Python黄金群【维哥】问了一个Python递归的基础问题,一起来看看吧。看上去代码没多少哈,但是韵味无穷。二、实现过程很多初学者遇到这个问题,很容易把答案说成是3,2,2这样,其实正好相反,这里【巭孬嫑勥烎】给了一个解释。这么一看好像还是不太好......
  • GIL锁;python垃圾回收机制;计算密集型用多进程,io密集型用多线程
    GIL锁;python垃圾回收机制;计算密集型用多进程,io密集型用多线程GIL锁及其作用1.GIL(GlobalInterpreterLock)又称全局解释器锁,本质就是一个互斥锁。2.它保证了cpython进程中的每个线程必须获得这把锁才能执行,不获得不能执行3.这样使得在同一进程内任何时刻仅有一个线程在执行。4......
  • python: Screen Recording
     用VLCmediaplayer播放录屏文件"""python.exe-mpipinstall--upgradepippipinstallpyautoguipipinstallopencv-pythonpipinstallpywin32python3.11"""#ThisisasamplePythonscript.importcv2importpyautoguiimport......
  • python开发实战——ip池
    前言代理IP池是一组可用的代理IP地址,用于访问网站或执行其他网络请求。它可以帮助我们在网络请求时隐藏我们的真实IP地址,从而提高网络安全性、匿名性和稳定性。同时,代理IP池还可以通过定时更新和测试代理IP,保证代理IP的有效性和稳定性。本文将介绍如何使用Python编写代理IP池,包括......
  • 17道经典考题,检验你的 Python 基本功
    Python是一门非常优美的语言,其简洁易用令人不得不感概人生苦短。在本文中,作者GauthamSanthosh带我们回顾了17个非常有用的Python技巧,例如查找、分割和合并列表等。这17个技巧都非常简单,但它们都很常用且能激发不一样的思路。人生苦短,为什么我要用Python?很多读者都知道Py......
  • 记一次 gunicorn+python+flask+venv 部署过程
    记一次gunicorn+python+flask+venv部署过程flask直接部署到服务器会有警告,本身也是不稳定的,它只是一个应用。需要一个独立的Server来承担WSGI角色和责任。venv是pytohn的虚拟环境,用来隔离不同项目的包版本不一致的问题。python3.6+以上都自带有,在部署之前先创建虚拟环境。1、......
  • [算法题python]822.翻转卡片游戏
    在桌子上有 n 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。我们可以先翻转任意张卡片,然后选择其中一张卡片。如果选中的那张卡片背面的数字 x 与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。哪个数是这些想要的数字中最小的......