簡體   English   中英

Python異步代理狀態檢查

[英]Python async proxy status check

美好的一天,即時通訊試圖掌握python中的異步內容,並陷入了應該可以輕松解決的情況,但是我仍然對我在做什么錯感到沮喪。 建議我有一個代理列表,我想檢查服務器是否已啟動並正在運行,更重要的是我想以異步方式進行操作,不幸的是,與同步功能的比較顯示了相同的執行時間。

因此,代碼如下:

import requests
import os
import asyncio

from lxml import html


class GetUkProxy:
    url = "https://free-proxy-list.net/uk-proxy.html"

    def __init__(self):
        self.getProxyList(self.url)

    def getProxyList(self, url):
        self.proxies = []
        data = requests.get(url)
        response = html.fromstring(data.text)
        for item in response.xpath('//table[@id="proxylisttable"]/tbody/tr'):
            ip, port = item.getchildren()[:2]
            self.proxies.append({'IP': ip.text, 'Port': port.text, 'Status': 'unknown'})

    def printProxies(self):
        try:
            for proxy in self.proxies:
                print(proxy['IP'] + ':' + proxy['Port'], proxy['Status'])
        except:
            print("Proxy list is empty")

    def checkProxies(self):
        loop = asyncio.get_event_loop()
        data = loop.run_until_complete(self.checkProxyList())
        loop.close()


    async def checkProxyList(self):
        try:
            tasks = []
            for proxy in self.proxies[:10]:
                task = asyncio.ensure_future(self.checkProxy(proxy))
                tasks.append(task)
            await asyncio.gather(*tasks)
        except:
            print('Proxy list is empty')

    async def checkProxy(self, proxy=None):
        try:
            check = os.system('ping -n 4 -w 2 ' + proxy['IP'])
            if not check:
                proxy['Status'] = 'Dead'
            else:
                proxy['Status'] = 'Alive'
        except Exception as exp:
            print(exp)

    def syncCheck(self):
        for item in self.proxies[:10]:
            check = os.system('ping -n 4 -w 2 ' + item['IP'])

異步checkProxies的執行時間等於同步syncCheck的執行時間,因此歡迎您提出錯誤根源以及如何解決錯誤的任何想法。

os.system是阻止事件循環的同步功能。

您可以使用asyncio.create_subprocess_exec異步執行系統命令,並避免阻塞事件循環。

async def checkProxy(self, proxy=None):
    try:
        check = await asyncio.create_subprocess_exec(
            'ping', '-c', '4', '-W', '2', proxy['IP'], stdout=asyncio.subprocess.PIPE)
        out, error = await check.communicate()

        proxy['Status'] = 'Alive'

        if error:
            proxy['Status'] = 'Dead'
    except Exception as exp:
        print(exp)

編輯:checkProxies方法中,我們將列出要一起運行的期貨。

def checkProxies(self):
    loop = asyncio.get_event_loop()
    proxies = self.proxies[:10]
    tasks = [self.checkProxy(proxy) for proxy in proxies]


    loop.run_until_complete(
        asyncio.gather(
            *tasks
        )
    )

    loop.close()

uk = GetUkProxy()
uk.checkProxies()
print(uk.proxies)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM