Python代理IP的使用和代理池的設定

Cloud01發表於2022-12-10

熟悉 python 的人都知道 為了 python 的正常請求,維持資料的穩定獲取, 都會用到代理 IP 代理 IP 不僅可以用 來規避 IP 在單位時間的請求次數 還可以 藉助代理來 隱藏真實的 IP 避免 出現 IP 請求過於頻繁”,“ 403 ”等報錯。 今天就帶大家簡單瞭解一下 Python 代理 IP 的使用和代理池怎麼設定。

一、 什麼是代理

代理一般指的是代理伺服器 Proxy Server 它的 作用就是代理網路使用者獲取資訊。就像是一個請求的中轉站,代理伺服器就是請求端與目標網站之間的一箇中轉 使用代理之後將不是直接請求目標網站, 使用者的 Request 訊號會先送到代理伺服器,由代理伺服器來取回所需要的資訊並傳送給 使用者 。此時的 請求 目標網站所識別的 IP 就不是 使用者真實的 本地 IP 而是代理 IP 地址 。這就是代理的基本原理。

二、 代理的作用

1 、突破自身 IP 訪問限制訪問其他不能訪問的站點。

2 、訪問一些單位或團體 內部資源,比如教育網的 FTP 資源

3 、提高訪問速度。代理伺服器通常有一個較大的硬碟緩衝區,請求資訊透過後將會儲存在緩衝區內。如果其他的使用者訪問相同的資訊,這時返回的內容將從緩衝區直接返回,提高 訪問 速度

4 、隱藏真實 IP ,可以利用代理伺服器隱藏自己的 真實 IP 資訊

三、   Python requests 如何使用代理

python requests 請求設定代理只需要傳遞一個引數: proxies 即可

import  requests
proxies = {
'http':'
'https':'
}
res = requests.get(")
print(res.json())

返回內容如下

{
  "ip": "203.160.80.166",
  "city": "Hong Kong",
  "region": "Central and Western",
  "country": "HK",
  "loc": "22.2783,114.1747",
  "org": "AS10099 China Unicom Global",
  "timezone": "Asia/Hong_Kong",
  "readme": "
}

四、 代理池的設定

代理池就是將代理伺服器的 IP 儲存到臨時資料庫中,實現隨用隨取。既可以將免費的代理網站的 IP 及時存進去,也可以避免了收費代理 api 的請求限制。

1. 如何設計代理池

代理池一般分為三個部分:收集代理,儲存代理和使用代理, 收集到儲存或者是 儲存到使用 期間可以對使用的代理做檢測,本文暫不提及。

收集代理:就是指從指定的目標源獲取到代理伺服器的 IP 之後存到歷史資料庫

儲存代理:負責儲存從目標網站的代理伺服器 IP ,通常使用 redis

使用代理:直接從臨時資料庫獲取提取過來的 IP 或者以介面的形式返回

2. 收集和儲存代理

本次使用的是 redis 的列表( List )對代理進行儲存,當然對去重有要求的話可以使用 redis 的有序集合( sorted set

redis 資料庫中建立一個叫做“ Proxy ”的 list ,將獲取到的 IP 進行儲存 :

import requests
import redis
 
redisHost = '127.0.0.1'
redisPort = 6379
redisPool = redis.ConnectionPool(host=redisHost, port=redisPort, password='', db=1)
redisCon = redis.Redis(connection_pool=redisPool)
 
def get_IP():
    IpApi = "url"
    res = requests.get(IpApi).json()["data"]
    for ip in res:
        ipInfo = f"http://{ip['ip']}:{ip['port']}"
        redisCon.rpush("Proxy",ipInfo)
 
if __name__ == '__main__':
    get_IP()

這裡使用的是 ipidea 的代理 api ,將獲取的伺服器地址存入了 redis 的列表中:

3. 使用代理

使用代理的話就從 redis Proxy 佇列,使用 redis pop 方法取到伺服器 IP

def GetIpFromRedis():
    serverIp = redisCon.lpop("Proxy")
    print(serverIp.decode())

4. 可持續化代理池

為了保證代理池的 IP 量位置在某一水平,可以使用 redis 中的 llen 方法對佇列的長度進行檢測。使用 while 迴圈,如果 IP 量低於一定的閾值就獲取代理地址並儲存,否則就跳過本次 while 迴圈:

def get_IP():
    while True:
        if redisCon.llen("Proxy") < 100:
            IpApi = "url"
            res = requests.get(IpApi).json()["data"]
            for ip in res:
                ipInfo = f"http://{ip['ip']}:{ip['port']}"
                redisCon.rpush("Proxy",ipInfo)
        else:
            pass

五、 總結

在網際網路不斷髮展,資訊資料龐大的今天, python 已經取代了過去傳統的依靠人力蒐集資訊的方式,成為了目前最為主流的資料獲取方法。使用代理 IP 並不是抓取資料的唯一方法,但它為 python 帶來了諸多好處,是 python 最可靠的選擇。

IPIDEA 作為 一家全球網際網路大資料IP 資源服務商。目前,已與全球數萬家企業達成深度合作,是世界 500 強公司都在使用的代理網路和資料收集工具。 IPIDEA 一直致力於連線人與資訊,為全球使用者提供優質的資料採集解決方案。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70017425/viewspace-2927620/,如需轉載,請註明出處,否則將追究法律責任。

相關文章