tester.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import asyncio
  2. import aiohttp
  3. try:
  4. from aiohttp import ClientError
  5. except:
  6. from aiohttp import ClientProxyConnectionError as ProxyConnectionError
  7. from proxypool.db import RedisClient
  8. from proxypool.setting import *
  9. class Tester(object):
  10. def __init__(self):
  11. self.proxies = None
  12. self.redis = RedisClient()
  13. def set_proxies(self, proxies):
  14. """
  15. 设置代理
  16. :param proxies:
  17. :return:
  18. """
  19. self.proxies = proxies
  20. async def test_single_proxy(self, proxy):
  21. """
  22. 测试单个代理
  23. :param proxy:
  24. :return:
  25. """
  26. async with aiohttp.ClientSession() as session:
  27. try:
  28. if isinstance(proxy, bytes):
  29. proxy = proxy.decode('utf-8')
  30. real_proxy = 'http://' + proxy
  31. print('正在测试', proxy)
  32. async with session.get(TEST_API, proxy=real_proxy, timeout=15) as response:
  33. if response.status in VALID_STATUS_CODES:
  34. self.redis.add(proxy)
  35. print('代理可用', proxy)
  36. else:
  37. self.redis.decrease(proxy)
  38. print('请求响应码不合法,IP', proxy)
  39. except (ClientError, aiohttp.client_exceptions.ClientConnectorError, asyncio.TimeoutError):
  40. if self.redis.exists(proxy):
  41. self.redis.decrease(proxy)
  42. print('代理请求失败', proxy)
  43. def run(self):
  44. """
  45. 测试主函数
  46. :return:
  47. """
  48. print('测试器开始运行')
  49. try:
  50. loop = asyncio.get_event_loop()
  51. tasks = [self.test_single_proxy(proxy) for proxy in self.proxies]
  52. loop.run_until_complete(asyncio.wait(tasks))
  53. except Exception as e:
  54. print('测试器发生错误', e.args)