Скрипт для автоматического поиска и проверки 1000 битых доменов в день
Дата публикации: 11.06.2026

Скрипт для автоматического поиска и проверки 1000 битых доменов в день

Хочу себе такие же кнопки

Что вы получите от этого блока

Вы научитесь писать скрипт, который каждый день будет находить до 1000 битых доменов, проверять их статус и сохранять готовый список для дальнейшего выкупа. Всё реализовано на Python 3 с использованием популярных библиотек, а также небольших трюков, позволяющих обходить ограничения API‑сервисов и ускорять процесс в 3‑5 раз.


1. Общая архитектура решения

Этап Что делаем Инструменты
Сбор списка доменов Получаем массив потенциальных доменов из готовых наборов (доменные листы, генераторы, API) requests, BeautifulSoup, публичные списки
Фильтрация по статусу Проверяем, жив ли домен (HTTP 200) и есть ли у него ссылка‑потеря (404/500) aiohttp, asyncio
Проверка «битости» Оцениваем, что домен не используется (нет контента, низкая PR/DA) whois, urllib, requests
Сохранение результата Записываем в CSV/SQLite для дальнейшего анализа csv, sqlite3
Планировщик Запускаем каждый день в фиксированное время cron (Linux) / Task Scheduler (Windows)

Скрипт построен асинхронно – это главный ускоряющий фактор. Вместо последовательных запросов к каждому домену мы открываем сотни соединений одновременно, а затем собираем ответы.


2. Подготовка окружения

# Установим Python 3.10+ (если ещё нет)
sudo apt-get update && sudo apt-get install -y python3 python3-pip

# Создаём виртуальное окружение
python3 -m venv venv
source venv/bin/activate

# Устанавливаем зависимости
pip install aiohttp aiodns beautifulsoup4 pandas tqdm

aiohttp – асинхронный HTTP‑клиент, aiodns ускоряет DNS‑разрешение, tqdm выводит прогресс‑бар, а pandas удобно сохраняет CSV.


3. Генерация списка потенциальных доменов

Самый простой способ – взять готовый список (например, из открытого репозитория GitHub) и добавить к нему комбинацию популярных слов‑ключей.

import random, string

def random_word(length=5):
    return ''.join(random.choice(string.ascii_lowercase) for _ in range(length))

def generate_domains(base_list, count=2000):
    domains = set()
    while len(domains) < count:
        word = random_word()
        for base in base_list:
            domains.add(f"{word}{base}")
    return list(domains)

База base_list может включать .com, .net, .org, а также локальные зоны (.ru, .su).

Совет: сохраняйте базу в файле bases.txt – так вы сможете менять её без перекомпиляции скрипта.


4. Асинхронная проверка статуса

import aiohttp, asyncio
from tqdm import tqdm

TIMEOUT = 10
HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; Bot/1.0)"}

async def fetch_status(session, domain):
    url = f"https://{domain}"
    try:
        async with session.get(url, timeout=TIMEOUT, headers=HEADERS) as resp:
            return domain, resp.status
    except Exception:
        return domain, None

async def check_domains(domains):
    results = []
    connector = aiohttp.TCPConnector(limit_per_host=100)  # ограничиваем количество запросов к одному хосту
    async with aiohttp.ClientSession(connector=connector) as session:
        tasks = [fetch_status(session, d) for d in domains]
        for fut in tqdm(asyncio.as_completed(tasks), total=len(tasks)):
            results.append(await fut)
    return results

Почему limit_per_host=100?
Большинство DNS‑серверов и веб‑сайтов блокируют слишком частые запросы с одного IP. Ограничивая количество одновременных соединений, мы снижаем риск 429‑ответов.


5. Фильтрация «битых» доменов

Битым считается домен, у которого:

  1. HTTP‑статус404, 500, 502 или None (таймаут/нет DNS);
  2. Контент‑пустой — меньше 1 KB текста;
  3. WHOIS‑данные — дата истечения уже прошла или домен не зарегистрирован.
import whois, os, re

def is_dead(status, content):
    if status in (404, 500, 502, None):
        return True
    # проверяем размер тела ответа
    return len(content) < 1024

def whois_check(domain):
    try:
        w = whois.whois(domain)
        # если нет даты создания – домен, не существует
        if not w.creation_date:
            return True
        # проверяем, не истекло ли время регистрации (пример: > 5 лет)
        # (здесь упрощаем, в реальном скрипте используем datetime)
        return False
    except Exception:
        return True

В основной функции мы комбинируем оба условия:

async def evaluate(domains):
    alive = await check_domains(domains)
    dead = []
    for domain, status in alive:
        if status in (404, 500, 502, None):
            dead.append(domain)
    return dead

6. Сохранение результатов

import csv, datetime

def save_to_csv(domains, filename="dead_domains.csv"):
    today = datetime.date.today().isoformat()
    with open(filename, "a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        for d in domains:
            writer.writerow([today, d])

Файл будет выглядеть так:

date domain
2026‑06‑11 abcxyz.com
2026‑06‑11 qwerty.net

7. Планировщик (cron)

Создайте файл run.sh:

#!/bin/bash
source /path/to/venv/bin/activate
python /path/to/your_script.py

Сделайте его исполняемым:

chmod +x run.sh

Добавьте задачу в crontab (каждый день в 02:30):

30 2 * * * /path/to/run.sh >> /path/to/log.txt 2>&1

8. Полный скрипт (сокращённый вариант)

#!/usr/bin/env python3
import asyncio, csv, datetime, random, string, aiohttp, whois
from tqdm import tqdm

BASES = ["com", "net", "org", "ru"]
COUNT = 2000
TIMEOUT = 10
HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; Bot/1.0)"}

def random_word(length=5):
    return ''.join(random.choice(string.ascii_lowercase) for _ in range(length))

def generate_domains():
    domains = set()
    while len(domains) < COUNT:
        w = random_word()
        for b in BASES:
            domains.add(f"{w}.{b}")
    return list(domains)

async def fetch(session, domain):
    url = f"https://{domain}"
    try:
        async with session.get(url, timeout=TIMEOUT, headers=HEADERS) as resp:
            text = await resp.text()
            return domain, resp.status, text
    except Exception:
        return domain, None, ""

async def main():
    domains = generate_domains()
    connector = aiohttp.TCPConnector(limit_per_host=100)
    async with aiohttp.ClientSession(connector=connector) as sess:
        tasks = [fetch(sess, d) for d in domains]
        dead = []
        for fut in tqdm(asyncio.as_completed(tasks), total=len(tasks)):
            d, status, body = await fut
            if status in (404, 500, 502, None) or len(body) < 1024:
                dead.append(d)

    # WHOIS‑проверка (упрощённо)
    final_dead = [d for d in dead if whois_check(d)]

    # Сохраняем
    today = datetime.date.today().isoformat()
    with open("dead_domains.csv", "a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        for d in final_dead:
            writer.writerow([today, d])

    print(f"Найдено {len(final_dead)} битых доменов.")

if __name__ == "__main__":
    asyncio.run(main())

Важно: в реальном продакшене стоит добавить кэширование DNS, логирование ошибок и обработку robots.txt.


9. Оптимизации, которые экономят время и ресурсы

Проблема Решение Пример кода
Много запросов к одному DNS Использовать aiodns + локальный кэш resolver = aiodns.DNSResolver(cache=True)
Блокировка по IP Прокси‑пул (например, proxylist + aiohttp_socks) connector = aiohttp_socks.ProxyConnector.from_url(proxy_url)
Слишком большие ответы Обрезать тело до 1 KB (await resp.content.read(1024)) data = await resp.content.read(1024)
Потеря соединения Перезапуск неудавшихся задач (retry с экспоненциальным бэкоффом) await asyncio.sleep(2** i) в цикле for i in range(3)

10. Как использовать полученный список

  1. Проверка цены – через сервисы типа Namecheap, GoDaddy (API) получаем текущую стоимость.
  2. Оценка «сила» домена – проверяем DR (Domain Rating) через Ahrefs API или DA через Moz.
  3. Выбор для PBN – берём домены с DR ≥ 20 и не более 1 млн обратных ссылок, чтобы не привлечь внимание поисковиков.

Практика для закрепления

  1. Модифицировать генератор

    • Добавьте к доменам префиксы из списка ["shop", "blog", "news"].
    • Сохраните полученный список в domains.txt и проверьте, сколько уникальных доменов получилось.
  2. Улучшить проверку контента

    • Вместо простого len(body) < 1024 реализуйте поиск «больших» HTML‑тегов (<p>, <h1>) и считаем домен битым, если их суммарный текст меньше 200 символов.
  3. Встроить кэш DNS

    • Подключите библиотеку aiodns, создайте глобальный кэш и измерьте, насколько ускорился процесс (в секундах) по сравнению с базовой версией.
  4. Создать отчёт в Excel

    • С помощью pandas прочитайте dead_domains.csv, добавьте колонку price (условная цена 0.5 USD) и экспортируйте в dead_domains.xlsx.
  5. Автоматический запуск

    • Настройте cron‑задачу, которая будет писать в журнал log.txt количество найденных битых доменов каждый день. Проверьте, что после 7 дней в логе есть 7 строк.

Выполняя эти упражнения, вы закрепите каждый из этапов: генерацию, асинхронную проверку, фильтрацию, сохранение и автоматизацию. После этого ваш «поток» будет готов к масштабированию до 10 000 доменов в день и дальнейшему использованию в PBN‑проектах. Удачной разработки!


БЕСПЛАТНЫЙ КУРС: «ЦИФРОВОЙ СЕЙФ: БЫСТРОЙ БЭКАП»
Чат онлайн с возможностью отправки гифок
ИП или ООО: какая форма выгоднее для стартапа в Москве
Как использовать SAPE для защиты данных
Китайский производитель трубной арматуры
Микросервисы: как рисовать стрелки с подписями
Онлайн рулетка с поддержкой мобильных устройств
Онлайн встреча Екатеринбург
Оптимизация Битрикс на VDSina: бесплатный материал
Ошибки и их исправление при использовании SAPE
Основы и терминология LA SAPE: что это и как начать
Основы SAPE: что это и как работает
Партнёрская программа без блога: эффективные методы трафика из Telegram
Подготовка к ОГЭ: контрольные материалы
Погружение в английский без субтитров: 5 минут в день — эффективно
Путешествуйте самостоятельно: все, что нужно знать
Россия онлайн видеочат
Рулетка общения
Сбои AutoCAD при старте - быстрая диагностика