tester.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. conn = aiohttp.TCPConnector(verify_ssl=False)
  27. async with aiohttp.ClientSession(connector=conn) as session:
  28. try:
  29. if isinstance(proxy, bytes):
  30. proxy = proxy.decode('utf-8')
  31. real_proxy = 'http://' + proxy
  32. print('正在测试', proxy)
  33. async with session.get(TEST_URL, proxy=real_proxy, timeout=15) as response:
  34. if response.status in VALID_STATUS_CODES:
  35. self.redis.add(proxy)
  36. print('代理可用', proxy)
  37. else:
  38. self.redis.decrease(proxy)
  39. print('请求响应码不合法,IP', proxy)
  40. except (ClientError, aiohttp.client_exceptions.ClientConnectorError, asyncio.TimeoutError, AttributeError):
  41. if self.redis.exists(proxy):
  42. self.redis.decrease(proxy)
  43. print('代理请求失败', proxy)
  44. def run(self):
  45. """
  46. 测试主函数
  47. :return:
  48. """
  49. print('测试器开始运行')
  50. try:
  51. loop = asyncio.get_event_loop()
  52. tasks = [self.test_single_proxy(proxy) for proxy in self.proxies]
  53. loop.run_until_complete(asyncio.wait(tasks))
  54. except Exception as e:
  55. print('测试器发生错误', e.args)