繁体   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