溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python3爬蟲中ADSL撥號代理是什么

發(fā)布時(shí)間:2020-08-03 09:38:33 來源:億速云 閱讀:215 作者:清晨 欄目:編程語言

不懂Python3爬蟲中ADSL撥號代理是什么?其實(shí)想解決這個問題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

ADSL 撥號代理

我們嘗試維護(hù)過一個代理池。代理池可以挑選出許多可用代理,但是常常其穩(wěn)定性不高、響應(yīng)速度慢,而且這些代理通常是公共代理,可能不止一人同時(shí)使用,其 IP 被封的概率很大。另外,這些代理可能有效時(shí)間比較短,雖然代理池一直在篩選,但如果沒有及時(shí)更新狀態(tài),也有可能獲取到不可用的代理。

如果要追求更加穩(wěn)定的代理,就需要購買專有代理或者自己搭建代理服務(wù)器。但是服務(wù)器一般都是固定的 IP,我們總不能搭建 100 個代理就用 100 臺服務(wù)器吧,這顯然是不現(xiàn)實(shí)的。

所以,ADSL 動態(tài)撥號主機(jī)就派上用場了。下面我們來了解一下 ADSL 撥號代理服務(wù)器的相關(guān)設(shè)置。

1. 什么是 ADSL

ADSL(Asymmetric Digital Subscriber Line,非對稱數(shù)字用戶環(huán)路),它的上行和下行帶寬不對稱,它采用頻分復(fù)用技術(shù)把普通的電話線分成了電話、上行和下行 3 個相對獨(dú)立的信道,從而避免了相互之間的干擾。

ADSL 通過撥號的方式上網(wǎng),需要輸入 ADSL 賬號和密碼,每次撥號就更換一個 IP。IP 分布在多個 A 段,如果 IP 都能使用,則意味著 IP 量級可達(dá)千萬。如果我們將 ADSL 主機(jī)作為代理,每隔一段時(shí)間主機(jī)撥號就換一個 IP,這樣可以有效防止 IP 被封禁。另外,主機(jī)的穩(wěn)定性很好,代理響應(yīng)速度很快。

2. 準(zhǔn)備工作

首先需要成功安裝 Redis 數(shù)據(jù)庫并啟動服務(wù),另外還需要安裝 requests、redis-py、Tornado 庫。如果沒有安裝,讀者可以參考第一章的安裝說明。

3. 購買主機(jī)

我們先購買一臺動態(tài)撥號 VPS 主機(jī),這樣的主機(jī)服務(wù)商相當(dāng)多。在這里使用了云立方,官方網(wǎng)站:http://www.yunlifang.cn/dynamicvps.asp。

建議選擇電信線路。可以自行選擇主機(jī)配置,主要考慮帶寬是否滿足需求。

然后進(jìn)入撥號主機(jī)的后臺,預(yù)裝一個操作系統(tǒng),如圖 9-10 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-10 預(yù)裝操作系統(tǒng)

推薦安裝 CentOS 7 系統(tǒng)。

然后找到遠(yuǎn)程管理面板?遠(yuǎn)程連接的用戶名和密碼,也就是 SSH 遠(yuǎn)程連接服務(wù)器的信息。比如我使用的 IP 和端口是 153.36.65.214:20063,用戶名是 root。命令行下輸入如下內(nèi)容:

ssh root@153.36.65.214 -p 20063

輸入管理密碼,就可以連接上遠(yuǎn)程服務(wù)器了。

進(jìn)入之后,我們發(fā)現(xiàn)一個可用的腳本文件 ppp.sh,這是撥號初始化的腳本。運(yùn)行此腳本會提示輸入撥號的用戶名和密碼,然后它就開始各種撥號配置。一次配置成功,后面撥號就不需要重復(fù)輸入用戶名和密碼。

運(yùn)行 ppp.sh 腳本,輸入用戶名、密碼等待它的配置完成,如圖 9-11 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-11 配置頁面

提示成功之后就可以進(jìn)行撥號了。注意,在撥號之前測試 ping 任何網(wǎng)站都是不通的,因?yàn)楫?dāng)前網(wǎng)絡(luò)還沒聯(lián)通。輸入如下?lián)芴柮睿?/p>

adsl-start

撥號命令成功運(yùn)行,沒有報(bào)錯信息,耗時(shí)約幾秒。接下來再去 ping 外網(wǎng)就可以通了。

如果要停止撥號,可以輸入如下命令:

adsl-stop

之后,可以發(fā)現(xiàn)又連不通網(wǎng)絡(luò)了,如圖 9-12 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-12 撥號建立連接

斷線重播的命令就是二者組合起來,先執(zhí)行 adsl-stop,再執(zhí)行 adsl-start。每次撥號,ifconfig 命令觀察主機(jī)的 IP,發(fā)現(xiàn)主機(jī)的 IP 一直在變化,網(wǎng)卡名稱叫作 ppp0,如圖 9-13 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-13 網(wǎng)絡(luò)設(shè)備信息

接下來,我們要做兩件事:一是怎樣將主機(jī)設(shè)置為代理服務(wù)器,二是怎樣實(shí)時(shí)獲取撥號主機(jī)的 IP。

4. 設(shè)置代理服務(wù)器

在 Linux 下搭建 HTTP 代理服務(wù)器,推薦 TinyProxy 和 Squid,配置都非常簡單。在這里我們以 TinyProxy 為例來講解一下怎樣搭建代理服務(wù)器。

安裝 TinyProxy

第一步就是安裝 TinyProxy 軟件。在這里我使用的系統(tǒng)是 CentOS,所以使用 yum 來安裝。如果是其他系統(tǒng),如 Ubuntu,可以選擇 apt-get 等命令安裝。

命令行執(zhí)行 yum 安裝指令:

yum install -y epel-release
yum update -y
yum install -y tinyproxy

運(yùn)行完成之后就可以完成 tinyproxy 的安裝了。

配置 TinyProxy

TinyProxy 安裝完成之后還要配置一下才可以用作代理服務(wù)器。我們需要編輯配置文件,此文件一般的路徑是 /etc/tinyproxy/tinyproxy.conf。

可以看到有一行

Port 8888

在這里可以設(shè)置代理的端口,默認(rèn)是 8888。

繼續(xù)向下找到如下代碼:

Allow 127.0.0.1

這行代碼表示被允許連接的主機(jī) IP。如果希望連接任何主機(jī),那就直接將這行代碼注釋即可。在這里我們選擇直接注釋,也就是任何主機(jī)都可以使用這臺主機(jī)作為代理服務(wù)器。

修改為如下代碼:

# Allow 127.0.0.1

設(shè)置完成之后重啟 TinyProxy 即可:

systemctl enable tinyproxy.service
systemctl restart tinyproxy.service

防火墻開放該端口:

iptables -I INPUT -p tcp --dport 8888 -j ACCEPT

當(dāng)然如果想直接關(guān)閉防火墻也可以:

systemctl stop firewalld.service

這樣我們就完成了 TinyProxy 的配置了。

驗(yàn)證 TinyProxy

首先,用 ifconfig 查看當(dāng)前主機(jī)的 IP。比如,當(dāng)前我的主機(jī)撥號 IP 為 112.84.118.216,在其他的主機(jī)運(yùn)行測試一下。

用 curl 命令設(shè)置代理請求 httpbin,檢測代理是否生效。

curl -x 112.84.118.216:8888 httpbin.org/get

運(yùn)行結(jié)果如圖 9-14 所示:

Python3爬蟲中ADSL撥號代理是什么

圖 9-14 運(yùn)行結(jié)果

如果有正常的結(jié)果輸出,并且 origin 的值為代理 IP 的地址,就證明 TinyProxy 配置成功了。

5. 動態(tài)獲取 IP

現(xiàn)在可以執(zhí)行命令讓主機(jī)動態(tài)切換 IP,也在主機(jī)上搭建了代理服務(wù)器。我們只需要知道撥號后的 IP 就可以使用代理。

我們考慮到,在一臺主機(jī)撥號切換 IP 的間隙代理是不可用的,在這撥號的幾秒時(shí)間內(nèi)如果有第二臺主機(jī)頂替第一臺主機(jī),那就可以解決撥號間隙代理無法使用的問題了。所以我們要設(shè)計(jì)的架構(gòu)必須要考慮支持多主機(jī)的問題。

假如有 10 臺撥號主機(jī)同時(shí)需要維護(hù),而爬蟲需要使用這 10 臺主機(jī)的代理,那么在爬蟲端維護(hù)的開銷是非常大的。如果爬蟲在不同的機(jī)器上運(yùn)行,那么每個爬蟲必須要獲得這 10 臺撥號主機(jī)的配置,這顯然是不理想的。

為了更加方便地使用代理,我們可以像上文的代理池一樣定義一個統(tǒng)一的代理接口,爬蟲端只需要配置代理接口即可獲取可用代理。要搭建一個接口,就勢必需要一臺服務(wù)器,而接口的數(shù)據(jù)從哪里獲得呢,當(dāng)然最理想的還是選擇數(shù)據(jù)庫。

比如我們需要同時(shí)維護(hù) 10 臺撥號主機(jī),每臺撥號主機(jī)都會定時(shí)撥號,那這樣每臺主機(jī)在某個時(shí)刻可用的代理只有一個,所以我們沒有必要存儲之前的撥號代理,因?yàn)橹匦聯(lián)芴栔笾暗拇硪呀?jīng)不能用了,所以只需要將之前的代理更新其內(nèi)容就好了。數(shù)據(jù)庫要做的就是定時(shí)對每臺主機(jī)的代理進(jìn)行更新,而更新時(shí)又需要撥號主機(jī)的唯一標(biāo)識,根據(jù)主機(jī)標(biāo)識查出這條數(shù)據(jù),然后將這條數(shù)據(jù)對應(yīng)的代理更新。

所以數(shù)據(jù)庫端就需要存儲一個主機(jī)標(biāo)識到代理的映射關(guān)系。那么很自然地我們就會想到關(guān)系型數(shù)據(jù)庫,如 MySQL 或者 Redis 的 Hash 存儲,只需存儲一個映射關(guān)系,不需要很多字段,而且 Redis 比 MySQL 效率更高、使用更方便,所以最終選定的存儲方式就是 Redis 的 Hash。

6. 存儲模塊

那么接下來我們要做可被遠(yuǎn)程訪問的 Redis 數(shù)據(jù)庫,各個撥號機(jī)器只需要將各自的主機(jī)標(biāo)識和當(dāng)前 IP 和端口(也就是代理)發(fā)送給數(shù)據(jù)庫就好了。

先定義一個操作 Redis 數(shù)據(jù)庫的類,示例如下:

import redis
import random
# Redis 數(shù)據(jù)庫 IP
REDIS_HOST = 'remoteaddress'
# Redis 數(shù)據(jù)庫密碼,如無則填 None
REDIS_PASSWORD = 'foobared'
# Redis 數(shù)據(jù)庫端口
REDIS_PORT = 6379
# 代理池鍵名
PROXY_KEY = 'adsl'
class RedisClient(object):
    def __init__(self, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, proxy_key=PROXY_KEY):
        """
        初始化 Redis 連接
        :param host: Redis 地址
        :param port: Redis 端口
        :param password: Redis 密碼
        :param proxy_key: Redis 哈希表名
        """
        self.db = redis.StrictRedis(host=host, port=port, password=password, decode_responses=True)
        self.proxy_key = proxy_key
    def set(self, name, proxy):
        """
        設(shè)置代理
        :param name: 主機(jī)名稱
        :param proxy: 代理
        :return: 設(shè)置結(jié)果
        """
        return self.db.hset(self.proxy_key, name, proxy)
    def get(self, name):
        """
        獲取代理
        :param name: 主機(jī)名稱
        :return: 代理
        """
        return self.db.hget(self.proxy_key, name)
    def count(self):
        """
        獲取代理總數(shù)
        :return: 代理總數(shù)
        """
        return self.db.hlen(self.proxy_key)
    def remove(self, name):
        """
        刪除代理
        :param name: 主機(jī)名稱
        :return: 刪除結(jié)果
        """
        return self.db.hdel(self.proxy_key, name)
    def names(self):
        """
        獲取主機(jī)名稱列表
        :return: 獲取主機(jī)名稱列表
        """
        return self.db.hkeys(self.proxy_key)
    def proxies(self):
        """
        獲取代理列表
        :return: 代理列表
        """
        return self.db.hvals(self.proxy_key)
    def random(self):
        """
        隨機(jī)獲取代理
        :return:
        """
        proxies = self.proxies()
        return random.choice(proxies)
    def all(self):
        """
        獲取字典
        :return:
        """return self.db.hgetall(self.proxy_key)

這里定義了一個 RedisClient 類,在init() 方法中初始化了 Redis 連接,其中 REDIS_HOST 就是遠(yuǎn)程 Redis 的地址,REDIS_PASSWORD 是密碼,REDIS_PORT 是端口,PROXY_KEY 是存儲代理的散列表的鍵名。

接下來定義了一個 set() 方法,這個方法用來向散列表添加映射關(guān)系。映射是從主機(jī)標(biāo)識到代理的映射,比如一臺主機(jī)的標(biāo)識為 adsl1,當(dāng)前的代理為 118.119.111.172:8888,那么散列表中就會存儲一個 key 為 adsl1、value 為 118.119.111.172:8888 的映射,Hash 結(jié)構(gòu)如圖 9-15 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-15 Hash 結(jié)構(gòu)

如果有多臺主機(jī),只需要向 Hash 中添加映射即可。

另外,get() 方法就是從散列表中取出某臺主機(jī)對應(yīng)的代理。remove() 方法則是從散列表中移除對應(yīng)的主機(jī)的代理。還有 names()、proxies()、all() 方法則是分別獲取散列表中的主機(jī)列表、代理列表及所有主機(jī)代理映射。count() 方法則是返回當(dāng)前散列表的大小,也就是可用代理的數(shù)目。

最后還有一個比較重要的方法 random(),它隨機(jī)從散列表中取出一個可用代理,類似前面代理池的思想,確保每個代理都能被取到。

如果要對數(shù)據(jù)庫進(jìn)行操作,只需要初始化 RedisClient 對象,然后調(diào)用它的 set() 或者 remove() 方法,即可對散列表進(jìn)行設(shè)置和刪除。

7. 撥號模塊

接下來要做的就是撥號,并把新的 IP 保存到 Redis 散列表里。

首先是撥號定時(shí),它分為定時(shí)撥號和非定時(shí)撥號兩種選擇。

非定時(shí)撥號:最好的方法就是向該主機(jī)發(fā)送一個信號,然后主機(jī)就啟動撥號,但這樣做的話,我們首先要搭建一個重新?lián)芴柕慕涌?,如搭建一個 Web 接口,請求該接口即進(jìn)行撥號,但開始撥號之后,此時(shí)主機(jī)的狀態(tài)就從在線轉(zhuǎn)為離線,而此時(shí)的 Web 接口也就相應(yīng)失效了,撥號過程無法再連接,撥號之后接口的 IP 也變了,所以我們無法通過接口來方便地控制撥號過程和獲取撥號結(jié)果,下次撥號還得改變撥號請求接口,所以非定時(shí)撥號的開銷還是比較大的。

定時(shí)撥號:我們只需要在撥號主機(jī)上運(yùn)行定時(shí)腳本即可,每隔一段時(shí)間撥號一次,更新 IP,然后將 IP 在 Redis 散列表中更新即可,非常簡單易用,另外可以適當(dāng)將撥號頻率調(diào)高一點(diǎn),減少短時(shí)間內(nèi) IP 被封的可能性。

在這里選擇定時(shí)撥號。

接下來就是獲取 IP。獲取撥號后的 IP 非常簡單,只需要調(diào)用 ifconfig 命令,然后解析出對應(yīng)網(wǎng)卡的 IP 即可。

獲取了 IP 之后,我們還需要進(jìn)行有效性檢測。撥號主機(jī)可以自己檢測,比如可以利用 requests 設(shè)置自身的代理請求外網(wǎng),如果成功,那么證明代理可用,然后再修改 Redis 散列表,更新代理。

需要注意,由于在撥號的間隙撥號主機(jī)是離線狀態(tài),而此時(shí) Redis 散列表中還存留了上次的代理,一旦這個代理被取用了,該代理是無法使用的。為了避免這個情況,每臺主機(jī)在撥號之前還需要將自身的代理從 Redis 散列表中移除。

這樣基本的流程就理順了,我們用如下代碼實(shí)現(xiàn):

import re
import time
import requests
from requests.exceptions import ConnectionError, ReadTimeout
from db import RedisClient
# 撥號網(wǎng)卡
ADSL_IFNAME = 'ppp0'
# 測試 URL
TEST_URL = 'http://www.baidu.com'
# 測試超時(shí)時(shí)間
TEST_TIMEOUT = 20
# 撥號間隔
ADSL_CYCLE = 100
# 撥號出錯重試間隔
ADSL_ERROR_CYCLE = 5
# ADSL 命令
ADSL_BASH = 'adsl-stop;adsl-start'
# 代理運(yùn)行端口
PROXY_PORT = 8888
# 客戶端唯一標(biāo)識
CLIENT_NAME = 'adsl1'
class Sender():
    def get_ip(self, ifname=ADSL_IFNAME):
        """
        獲取本機(jī) IP
        :param ifname: 網(wǎng)卡名稱
        :return:
        """
        (status, output) = subprocess.getstatusoutput('ifconfig')
        if status == 0:
            pattern = re.compile(ifname + '.*?inet.*?(d+.d+.d+.d+).*?netmask', re.S)
            result = re.search(pattern, output)
            if result:
                ip = result.group(1)
                return ip
    def test_proxy(self, proxy):
        """
        測試代理
        :param proxy: 代理
        :return: 測試結(jié)果
        """
        try:
            response = requests.get(TEST_URL, proxies={
                'http': 'http://' + proxy,
                'https': 'https://' + proxy
            }, timeout=TEST_TIMEOUT)
            if response.status_code == 200:
                return True
        except (ConnectionError, ReadTimeout):
            return False
    def remove_proxy(self):
        """
        移除代理
        :return: None
        """
        self.redis = RedisClient()
        self.redis.remove(CLIENT_NAME)
        print('Successfully Removed Proxy')
    def set_proxy(self, proxy):
        """
        設(shè)置代理
        :param proxy: 代理
        :return: None
        """
        self.redis = RedisClient()
        if self.redis.set(CLIENT_NAME, proxy):
            print('Successfully Set Proxy', proxy)
    def adsl(self):
        """
        撥號主進(jìn)程
        :return: None
        """
        while True:
            print('ADSL Start, Remove Proxy, Please wait')
            self.remove_proxy()
            (status, output) = subprocess.getstatusoutput(ADSL_BASH)
            if status == 0:
                print('ADSL Successfully')
                ip = self.get_ip()
                if ip:
                    print('Now IP', ip)
                    print('Testing Proxy, Please Wait')
                    proxy = '{ip}:{port}'.format(ip=ip, port=PROXY_PORT)
                    if self.test_proxy(proxy):
                        print('Valid Proxy')
                        self.set_proxy(proxy)
                        print('Sleeping')
                        time.sleep(ADSL_CYCLE)
                    else:
                        print('Invalid Proxy')
                else:
                    print('Get IP Failed, Re Dialing')
                    time.sleep(ADSL_ERROR_CYCLE)
            else:
                print('ADSL Failed, Please Check')
                time.sleep(ADSL_ERROR_CYCLE)
def run():
    sender = Sender()
    sender.adsl()

在這里定義了一個 Sender 類,它的主要作用是執(zhí)行定時(shí)撥號,并將新的 IP 測試通過之后更新到遠(yuǎn)程 Redis 散列表里。

主方法是 adsl() 方法,它首先是一個無限循環(huán),循環(huán)體內(nèi)就是撥號的邏輯。

adsl() 方法首先調(diào)用了 remove_proxy() 方法,將遠(yuǎn)程 Redis 散列表中本機(jī)對應(yīng)的代理移除,避免撥號時(shí)本主機(jī)的殘留代理被取到。

接下來利用 subprocess 模塊來執(zhí)行撥號腳本,撥號腳本很簡單,就是 stop 之后再 start,這里將撥號的命令直接定義成了 ADSL_BASH。

隨后程序又調(diào)用 get_ip() 方法,通過 subprocess 模塊執(zhí)行獲取 IP 的命令 ifconfig,然后根據(jù)網(wǎng)卡名稱獲取了當(dāng)前撥號網(wǎng)卡的 IP 地址,即撥號后的 IP。

再接下來就需要測試代理有效性了。程序首先調(diào)用了 test_proxy() 方法,將自身的代理設(shè)置好,使用 requests 庫來用代理連接 TEST_URL。在此 TEST_URL 設(shè)置為百度,如果請求成功,則證明代理有效。

如果代理有效,再調(diào)用 set_proxy() 方法將 Redis 散列表中本機(jī)對應(yīng)的代理更新,設(shè)置時(shí)需要指定本機(jī)唯一標(biāo)識和本機(jī)當(dāng)前代理。本機(jī)唯一標(biāo)識可隨意配置,其對應(yīng)的變量為 CLIENT_NAME,保證各臺撥號主機(jī)不沖突即可。本機(jī)當(dāng)前代理則由撥號后的新 IP 加端口組合而成。通過調(diào)用 RedisClient 的 set() 方法,參數(shù) name 為本機(jī)唯一標(biāo)識,proxy 為撥號后的新代理,執(zhí)行之后便可以更新散列表中的本機(jī)代理了。

建議至少配置兩臺主機(jī),這樣在一臺主機(jī)的撥號間隙還有另一臺主機(jī)的代理可用。撥號主機(jī)的數(shù)量不限,越多越好。

在撥號主機(jī)上執(zhí)行撥號腳本,示例輸出如圖 9-16 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-16 示例輸出

首先移除了代理,再進(jìn)行撥號,撥號完成之后獲取新的 IP,代理檢測成功之后就設(shè)置到 Redis 散列表中,然后等待一段時(shí)間再重新進(jìn)行撥號。

我們添加了多臺撥號主機(jī),這樣就有多個穩(wěn)定的定時(shí)更新的代理可用了。Redis 散列表會實(shí)時(shí)更新各臺撥號主機(jī)的代理,如圖 9-17 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-17 Hash 結(jié)構(gòu)

圖中所示是四臺 ADSL 撥號主機(jī)配置并運(yùn)行后的散列表的內(nèi)容,表中的代理都是可用的。

8. 接口模塊

目前為止,我們已經(jīng)成功實(shí)時(shí)更新?lián)芴栔鳈C(jī)的代理。不過還缺少一個模塊,那就是接口模塊。像之前的代理池一樣,我們也定義一些接口來獲取代理,如 random 獲取隨機(jī)代理、count 獲取代理個數(shù)等。

我們選用 Tornado 來實(shí)現(xiàn),利用 Tornado 的 Server 模塊搭建 Web 接口服務(wù),示例如下:

import json
import tornado.ioloop
import tornado.web
from tornado.web import RequestHandler, Application
# API 端口
API_PORT = 8000
class MainHandler(RequestHandler):
    def initialize(self, redis):
        self.redis = redis
    def get(self, api=''):
        if not api:
            links = ['random', 'proxies', 'names', 'all', 'count']
            self.write('<h5>Welcome to ADSL Proxy API</h5>')
            for link in links:
                self.write('<a href=' + link + '>' + link + '</a><br>')
        if api == 'random':
            result = self.redis.random()
            if result:
                self.write(result)
        if api == 'names':
            result = self.redis.names()
            if result:
                self.write(json.dumps(result))
        if api == 'proxies':
            result = self.redis.proxies()
            if result:
                self.write(json.dumps(result))
        if api == 'all':
            result = self.redis.all()
            if result:
                self.write(json.dumps(result))
        if api == 'count':
            self.write(str(self.redis.count()))
def server(redis, port=API_PORT, address=''):
    application = Application([(r'/', MainHandler, dict(redis=redis)),
        (r'/(.*)', MainHandler, dict(redis=redis)),
    ])
    application.listen(port, address=address)
    print('ADSL API Listening on', port)
    tornado.ioloop.IOLoop.instance().start()

這里定義了 5 個接口,random 獲取隨機(jī)代理,names 獲取主機(jī)列表,proxies 獲取代理列表,all 獲取代理映射,count 獲取代理數(shù)量。

程序啟動之后便會在 API_PORT 端口上運(yùn)行 Web 服務(wù),主頁面如圖 9-18 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-18 主頁面

訪問 proxies 接口可以獲得所有代理列表,如圖 9-19 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-19 代理列表

訪問 random 接口可以獲取隨機(jī)可用代理,如圖 9-20 所示。

Python3爬蟲中ADSL撥號代理是什么

圖 9-20 隨機(jī)代理

我們只需將接口部署到服務(wù)器上,即可通過 Web 接口獲取可用代理,獲取方式和代理池類似。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Python3爬蟲中ADSL撥號代理是什么內(nèi)容對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI