Advertisement
xm4dn355x

ThreadPoolExcecutor and ProcessPoolExecutor

Jan 10th, 2022
1,043
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.14 KB | None | 0 0
  1. import requests
  2. from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
  3. from fake_useragent import UserAgent
  4. from multiprocessing import cpu_count
  5.  
  6.  
  7. PARSING_DEPTH = 50
  8. USER_AGENT_HANDLER = UserAgent()
  9. WORKERS = cpu_count() + 1
  10. USE_THREADS = 'threads'
  11. USE_PROCESSES = 'processes'
  12.  
  13.  
  14. def get_page(category: str, page_id: int) -> str:
  15.     """Получаем страницу по категории и номеру страницы"""
  16.     url = f"https://www.ozon.ru/brand/{category}/"
  17.     if page_id:
  18.         url += f"?page={page_id}"
  19.     print(f'get url: {url}')
  20.     response = requests.get(url=url, headers={'User-Agent': str(USER_AGENT_HANDLER.random)})
  21.     return response.text
  22.  
  23.  
  24. def load_data(category_list: list, mode=USE_THREADS) -> None:
  25.     """Многопоточно прогружаем данные из категорий"""
  26.     if not category_list:
  27.         raise ValueError("Список категорий пуст")
  28.     # Определяемся между потоками и процессами
  29.     # кстати здесь можно было использовать pattern matching, но пока не пойму как
  30.     if mode == USE_THREADS:
  31.         ExecutorClass = ThreadPoolExecutor
  32.     elif mode == USE_PROCESSES:
  33.         ExecutorClass = ProcessPoolExecutor
  34.     else:
  35.         raise ValueError('Неизвестный режим выполнения')
  36.     pgs = PARSING_DEPTH     # Количество страниц для парсинга (просто чтоб через две строчки стало красивее)
  37.     # Запускаем исполнителей
  38.     with ExecutorClass(max_workers=WORKERS) as executor:
  39.         futures = [executor.submit(get_page, category, page_id) for category in category_list for page_id in range(pgs)]
  40.         for future in as_completed(futures):
  41.             text = future.result()
  42.             # обрабатываем полученный текст, сохраняем в файл/базу
  43.  
  44.  
  45. if __name__ == '__main__':
  46.     category_list = ['adidas-144082850', 'puma-87235756']
  47.     load_data(category_list, mode=USE_PROCESSES)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement