Update subdomain.py

Многопоточность убрана.  Сайт критически воспринимает множественные обращения от одного хоста и начинает выдавать страницы с пустыми субдоменами.
This commit is contained in:
Ground-Zerro
2024-10-10 14:36:50 +11:00
committed by GitHub
parent 6283d2d872
commit c74bbc6e97

View File

@@ -27,13 +27,16 @@ def parse_page(url):
domain = columns[0].text.strip() # Извлечение столбца 'Domain' domain = columns[0].text.strip() # Извлечение столбца 'Domain'
data.add(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 return data
except requests.exceptions.HTTPError as e: except requests.exceptions.HTTPError as e:
if response.status_code == 429: if response.status_code == 429:
print(f"Ошибка загрузки {url}. Пробуем еще раз...") print(f"Ошибка загрузки {url}. Пробуем еще раз... (Попытка {attempt + 1})")
time.sleep(3) # Фиксированная задержка перед повторной попыткой time.sleep(5) # Фиксированная задержка перед повторной попыткой
else: else:
raise e raise e
@@ -47,52 +50,42 @@ def parse_all_pages(base_url):
recent_pages_data = [] # Список для хранения данных последних страниц recent_pages_data = [] # Список для хранения данных последних страниц
while keep_parsing: while keep_parsing:
print(f"Парсим страницы с {page} по {page + 2}") print(f"Парсим страницу {page}")
pages = [f"{base_url}?page={p}" for p in range(page, page + 3)] url = f"{base_url}?page={page}"
try: try:
with ThreadPoolExecutor(max_workers=3) as executor: result = parse_page(url)
future_to_url = {executor.submit(parse_page, url): url for url in pages} if result is None: # Если страница пуста или не существует
for future in as_completed(future_to_url): print(f"Страница {page} не существует или пуста. Проверяем еще раз...")
url = future_to_url[future] empty_page_attempts += 1
try: time.sleep(5) # Ожидание перед повторной проверкой
result = future.result() if empty_page_attempts >= 3:
if result is None: # Если страница пуста или не существует print(f"Страница {page} пуста после 3 попыток. Остановка.")
print(f"Страница {url.split('=')[-1]} не существует или пуста. Проверяем еще раз...") keep_parsing = False
empty_page_attempts += 1 break
time.sleep(3) # Ожидание перед повторной проверкой else:
if empty_page_attempts >= 3: continue # Переходим к следующей попытке
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
else: 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 return all_domains