diff --git a/utilities/subdomain.py b/utilities/subdomain.py index afc63bf..64d8e8a 100644 --- a/utilities/subdomain.py +++ b/utilities/subdomain.py @@ -27,13 +27,16 @@ def parse_page(url): domain = columns[0].text.strip() # Извлечение столбца 'Domain' data.add(domain) # Добавляем в множество - time.sleep(random.uniform(1, 3)) # Задержка между запросами + time.sleep(random.choice([2, 3, 4, 5])) # Случайная задержка между запросами + + if attempt > 0: + print(f"Успешная загрузка {url} после {attempt}-й попытки.") return data except requests.exceptions.HTTPError as e: if response.status_code == 429: - print(f"Ошибка загрузки {url}. Пробуем еще раз...") - time.sleep(3) # Фиксированная задержка перед повторной попыткой + print(f"Ошибка загрузки {url}. Пробуем еще раз... (Попытка {attempt + 1})") + time.sleep(5) # Фиксированная задержка перед повторной попыткой else: raise e @@ -47,52 +50,42 @@ def parse_all_pages(base_url): recent_pages_data = [] # Список для хранения данных последних страниц while keep_parsing: - print(f"Парсим страницы с {page} по {page + 2}") - pages = [f"{base_url}?page={p}" for p in range(page, page + 3)] + print(f"Парсим страницу {page}") + url = f"{base_url}?page={page}" try: - with ThreadPoolExecutor(max_workers=3) as executor: - future_to_url = {executor.submit(parse_page, url): url for url in pages} - for future in as_completed(future_to_url): - url = future_to_url[future] - try: - result = future.result() - if result is None: # Если страница пуста или не существует - print(f"Страница {url.split('=')[-1]} не существует или пуста. Проверяем еще раз...") - empty_page_attempts += 1 - time.sleep(3) # Ожидание перед повторной проверкой - if empty_page_attempts >= 3: - print(f"Страница {url.split('=')[-1]} пуста после 3 попыток. Остановка.") - keep_parsing = False - break - else: - continue # Переходим к следующей попытке - else: - empty_page_attempts = 0 # Обнуляем счётчик, если нашли данные - all_domains.update(result) # Добавляем новые домены в множество - print(f"Разбор {url} завершен.") - - # Добавляем данные страницы в список для сравнения - recent_pages_data.append(result) - if len(recent_pages_data) > 3: # Храним данные только последних 3 страниц - recent_pages_data.pop(0) - - # Проверяем, повторяются ли данные на последних трёх страницах - if len(recent_pages_data) == 3 and recent_pages_data[0] == recent_pages_data[1] == recent_pages_data[2]: - print(f"Данные на последних трёх страницах одинаковы. Остановка парсинга.") - keep_parsing = False - break - except Exception as e: - print(f"Ошибка парсинга {url}: {e}") - raise e - except requests.exceptions.HTTPError as e: - if '429' in str(e): - print("Ошибка 429. Пауза 4 секунды.") - time.sleep(3) # Пауза 3 секунды при ошибке 429 + result = parse_page(url) + if result is None: # Если страница пуста или не существует + print(f"Страница {page} не существует или пуста. Проверяем еще раз...") + empty_page_attempts += 1 + time.sleep(5) # Ожидание перед повторной проверкой + if empty_page_attempts >= 3: + print(f"Страница {page} пуста после 3 попыток. Остановка.") + keep_parsing = False + break + else: + continue # Переходим к следующей попытке else: - raise e # Пробрасываем другие ошибки, если они не 429 + empty_page_attempts = 0 # Обнуляем счётчик, если нашли данные + all_domains.update(result) # Добавляем новые домены в множество + print(f"Разбор страницы {page} завершен.") - page += 3 # Переход к следующему набору страниц + # Добавляем данные страницы в список для сравнения + recent_pages_data.append(result) + if len(recent_pages_data) > 3: # Храним данные только последних 3 страниц + recent_pages_data.pop(0) + + # Проверяем, повторяются ли данные на последних трёх страницах + if len(recent_pages_data) == 3 and recent_pages_data[0] == recent_pages_data[1] == recent_pages_data[2]: + print(f"Данные на последних трёх страницах одинаковы. Остановка парсинга.") + keep_parsing = False + break + + except Exception as e: + print(f"Ошибка парсинга страницы {page}: {e}") + raise e + + page += 1 # Переход к следующей странице return all_domains