Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import requests
- from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
- from fake_useragent import UserAgent
- from multiprocessing import cpu_count
- PARSING_DEPTH = 50
- USER_AGENT_HANDLER = UserAgent()
- WORKERS = cpu_count() + 1
- USE_THREADS = 'threads'
- USE_PROCESSES = 'processes'
- def get_page(category: str, page_id: int) -> str:
- """Получаем страницу по категории и номеру страницы"""
- url = f"https://www.ozon.ru/brand/{category}/"
- if page_id:
- url += f"?page={page_id}"
- print(f'get url: {url}')
- response = requests.get(url=url, headers={'User-Agent': str(USER_AGENT_HANDLER.random)})
- return response.text
- def load_data(category_list: list, mode=USE_THREADS) -> None:
- """Многопоточно прогружаем данные из категорий"""
- if not category_list:
- raise ValueError("Список категорий пуст")
- # Определяемся между потоками и процессами
- # кстати здесь можно было использовать pattern matching, но пока не пойму как
- if mode == USE_THREADS:
- ExecutorClass = ThreadPoolExecutor
- elif mode == USE_PROCESSES:
- ExecutorClass = ProcessPoolExecutor
- else:
- raise ValueError('Неизвестный режим выполнения')
- pgs = PARSING_DEPTH # Количество страниц для парсинга (просто чтоб через две строчки стало красивее)
- # Запускаем исполнителей
- with ExecutorClass(max_workers=WORKERS) as executor:
- futures = [executor.submit(get_page, category, page_id) for category in category_list for page_id in range(pgs)]
- for future in as_completed(futures):
- text = future.result()
- # обрабатываем полученный текст, сохраняем в файл/базу
- if __name__ == '__main__':
- category_list = ['adidas-144082850', 'puma-87235756']
- load_data(category_list, mode=USE_PROCESSES)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement