Скрипт для автоматического поиска и проверки 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. Фильтрация «битых» доменов
Битым считается домен, у которого:
- HTTP‑статус —
404,500,502илиNone(таймаут/нет DNS); - Контент‑пустой — меньше 1 KB текста;
- 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. Как использовать полученный список
- Проверка цены – через сервисы типа
Namecheap,GoDaddy(API) получаем текущую стоимость. - Оценка «сила» домена – проверяем DR (Domain Rating) через Ahrefs API или DA через Moz.
- Выбор для PBN – берём домены с DR ≥ 20 и не более 1 млн обратных ссылок, чтобы не привлечь внимание поисковиков.
Практика для закрепления
-
Модифицировать генератор
- Добавьте к доменам префиксы из списка
["shop", "blog", "news"]. - Сохраните полученный список в
domains.txtи проверьте, сколько уникальных доменов получилось.
- Добавьте к доменам префиксы из списка
-
Улучшить проверку контента
- Вместо простого
len(body) < 1024реализуйте поиск «больших» HTML‑тегов (<p>,<h1>) и считаем домен битым, если их суммарный текст меньше 200 символов.
- Вместо простого
-
Встроить кэш DNS
- Подключите библиотеку
aiodns, создайте глобальный кэш и измерьте, насколько ускорился процесс (в секундах) по сравнению с базовой версией.
- Подключите библиотеку
-
Создать отчёт в Excel
- С помощью
pandasпрочитайтеdead_domains.csv, добавьте колонкуprice(условная цена 0.5 USD) и экспортируйте вdead_domains.xlsx.
- С помощью
-
Автоматический запуск
- Настройте
cron‑задачу, которая будет писать в журналlog.txtколичество найденных битых доменов каждый день. Проверьте, что после 7 дней в логе есть 7 строк.
- Настройте
Выполняя эти упражнения, вы закрепите каждый из этапов: генерацию, асинхронную проверку, фильтрацию, сохранение и автоматизацию. После этого ваш «поток» будет готов к масштабированию до 10 000 доменов в день и дальнейшему использованию в PBN‑проектах. Удачной разработки!
БЕСПЛАТНЫЙ КУРС: «ЦИФРОВОЙ СЕЙФ: БЫСТРОЙ БЭКАП»
Чат онлайн с возможностью отправки гифок
ИП или ООО: какая форма выгоднее для стартапа в Москве
Как использовать SAPE для защиты данных
Китайский производитель трубной арматуры
Микросервисы: как рисовать стрелки с подписями
Онлайн рулетка с поддержкой мобильных устройств
Онлайн встреча Екатеринбург
Оптимизация Битрикс на VDSina: бесплатный материал
Ошибки и их исправление при использовании SAPE
Основы и терминология LA SAPE: что это и как начать
Основы SAPE: что это и как работает
Партнёрская программа без блога: эффективные методы трафика из Telegram
Подготовка к ОГЭ: контрольные материалы
Погружение в английский без субтитров: 5 минут в день — эффективно
Путешествуйте самостоятельно: все, что нужно знать
Россия онлайн видеочат
Рулетка общения
Сбои AutoCAD при старте - быстрая диагностика
