Advertisement
Guest User

Untitled

a guest
Sep 14th, 2016
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.35 KB | None | 0 0
  1. #! /usr/bin/env python
  2.  
  3. import os
  4. import asyncio
  5. import aiohttp
  6. import datetime
  7. import logging
  8.  
  9.  
  10. logging.basicConfig(level=logging.DEBUG)
  11. logger = logging.getLogger(__name__)
  12. loop = asyncio.get_event_loop()
  13.  
  14.  
  15. class RequestException(Exception):
  16.     def __init__(self, message, code):
  17.         self.message = 'Response error message: {}, code: {}'.format(message, code)
  18.  
  19.  
  20. class Fetcher(object):
  21.  
  22.     def __init__(self, interval=60*25):
  23.         self.interval = interval
  24.         self.session = aiohttp.ClientSession()
  25.         self.semaphore = asyncio.Semaphore(10)
  26.         self.status = ''
  27.  
  28.     async def get(self, url, method="get", post_data=None):
  29.         with self.session:
  30.             with aiohttp.Timeout(300):
  31.                 try:
  32.                     data = None
  33.                     if method == 'get':
  34.                         response = await self.session.request('get', url)
  35.                     else:
  36.                         response = await self.session.request('post', url, data=post_data)
  37.                     if response:
  38.                         if response.status == 200:
  39.                             data = await response.read()
  40.                             await response.release()
  41.                         else:
  42.                             await response.release()
  43.                             raise RequestException(response.reason, response.status)
  44.                     return data
  45.  
  46.                 except Exception as e:
  47.                     raise e
  48.  
  49.     async def get_schedule_urls(self):
  50.         urls = []
  51.         post_data = {"username": os.environ['login'], "password": os.environ['password']}
  52.         raw_data = await self.get('https://eduhouse.ru/login/index.php', method='post', post_data=post_data)
  53.         # ... beautifulsoup work on raw_data...
  54.         return urls
  55.  
  56.     async def do_job(self):
  57.         # get urls
  58.         self.status = '[{}] fetch urls'.format(datetime.datetime.now())
  59.         urls = []
  60.         try:
  61.             urls = await self.get_schedule_urls()
  62.         except RequestException as e:
  63.             logger.error('RequestException: {}'.format(e.message))
  64.         except Exception:
  65.             logger.exception('BroadException: ')
  66.  
  67.         # download this shit
  68.         downloaded = []
  69.         if len(urls):
  70.             self.status = '[{}] download this shiiit'.format(datetime.datetime.now())
  71.             tasks = []
  72.             for u in urls:
  73.                 tasks.append(self.get(u))
  74.             with (await self.semaphore):
  75.                 downloaded = await asyncio.gather(*tasks, return_exceptions=True)
  76.                 # check for downloaded item != some exception
  77.  
  78.         # save this shit
  79.         if len(downloaded):
  80.             self.status = '[{}] save this shiiit'.format(datetime.datetime.now())
  81.             await self.fs_write()
  82.  
  83.     async def fs_write(self):
  84.         # save
  85.         pass
  86.  
  87.     async def run(self):
  88.         while True:
  89.             await self.do_job()
  90.             await asyncio.sleep(self.interval)
  91.  
  92.     async def print_status(self):
  93.         while True:
  94.             print(self.status)
  95.             await asyncio.sleep(5)
  96.  
  97. if __name__ == '__main__':
  98.     f = Fetcher()
  99.     try:
  100.         # make parallel tasks
  101.         tasks = [loop.create_task(f.run()), loop.create_task(f.print_status())]
  102.         loop.run_until_complete(asyncio.wait(tasks))
  103.     finally:
  104.         loop.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement