Не так страшен черт, или сколько же реально используемых доменов

в 19:47, , рубрики: python, парсинг сайтов, Песочница, метки: ,

Понадобилось мне собрать определенного рода статистику по вебу. Но поисковики даже приблизительно не захотели выдавать стату, какими только запросами я их ни кормил. В итоге, по исконно русской традиции, принялся писать свой «поисковик». Итак, начнем.

Первое, что нам необходимо — список всех зарегистрированных доменов. В результате продолжительных поисков был найден ресурс, предлагающий после регистрации скачать файл зоны. Регистрация проходила с добавлением кредитной карты, и после трех дней триала с нее собирались снять деньги и даже дать уже готовый файл со списком доменов, но на тот момент ждать не хотелось (возбуждение знаете ли), поэтому я просто скачал файлы зон и написал простенький парсер на python. Что-то начало медленно опускаться, возможно это были руки… 106,138,643 зарегистрированных доменов. Предположим, что 1 http ответ будет примерно 100кб. Тогда я в итоге должен сохранить около 10 Тб. Продолжительные размышления и непродолжительный сон привели меня к мысли, что думая глобально, необходимо действовать локально. Практиковаться я решил на зоне .us — в 100 раз меньше доменов (предварительно 100 Гб). Учитывая что скрипты пишутся в процессе, ошибки и перезапуск неизбежны.

Второе, экономия ресурсов в целом и времени в частности. Dns запрос дешевле http. Я был уверен, что далеко не все домены имеют А запись (если среди читателей есть просто интересующиеся, то это значит что далеко не все домены ссылаются на какой-то сервер). Пишем простенький скриптик, выясняющий этот вопрос (честно говоря после надцатого перезапуска скриптик стал не таким уж простеньким, но не суть). Итого скормил 1 746 769 доменов .us зоны, на выходе получил 227 051 которые никуда не ведут. Уже хорошо. Просматривая результат увидел массу доменов с одинаковым ip. Точно! Паркинги! Игрался я часа 3. В итоге выделил следующие айпишники (более 10000 записей на каждый):

  • 108.179.223.250 89247
  • 184.168.221.96 22095
  • 208.87.35.103 11196
  • 216.21.239.197 13574
  • 97.74.42.79 14107
  • 208.91.197.27 29839
  • 64.202.189.170 144693
  • 68.178.232.100 328476
  • 68.178.232.99 12297

При подготовке списка доменов для финальной стадии отсеил то, что я не буду трогать:

ip_blacklist = {
    "74.220.199.6": "domins parking A",
    "74.220.199.8": "domins parking A",
    "74.220.199.9": "domins parking A",
    "74.117.221.143": "parking",
    "68.178.232.100": "GoDaddy's resale/parking shit (320k in us zone)",
    "64.202.189.170": "GoDaddy's redirector server, parse this shit later (150k .us)",
    "108.179.223.250": "zip code shit, don't need at all (90k in .us 00000.us like)",
    "184.168.221.96": "GoDaddy's parking server (22k .us)",
    "208.87.35.103": "domain parking B",
    "216.21.239.197": "domains.com parking",
    "68.178.232.99": "google's parking?!?!",
    "208.91.197.23": "parking",
    "208.91.197.24": "parking",
    "208.91.197.25": "parking",
    "208.91.197.26": "parking",
    "208.91.197.27": "parking",
    "97.74.42.79": "GoDaddys' site builder or somethink like, let's parse it later",
    "204.13.160.107": "parking",
    "64.95.64.218": "probably parking, decide later what to do",
    "64.95.64.194": "probably parking, decide later what to do (dead serv)",
    "213.186.33.5": "probably parking, decide later what to do",
    "216.21.239.197": "parking"
}

108.179.223.250 забавный сервер. На нем практически все домены вида юса-зип-код.us, мне он в статистике не нужен, поэтому и отфильтровал. GoDaddy со странными сервисами, вроде сайт-билдера и редиректора отправились туда же. В итоге:

На входе — 1 746 769 доменов
Без «А» записи — 227 051
Забракованных (ip) — 702 459
Остаток — 817 262

Мдя, если в .com зоне картина будет плюс-минус, то все что опустилось точно поднимется. Делаю пробный заход на 800к запросов, и… Боже, сколько проблем… urllib2 — плохое решение, sqlite3 — еще более «плохое» решение, в дебиан ограничение на кол-во открытых файлов примерно в 2к!? Я думал, что только виндоус так дурно пахнет.

Итог: можно спокойно сократить количество работы, что надо проделать, в 2 раза. Для этого просто включаем мозг. Предварительные оценки очень приблизительны. Файл с ответами на запросы в итоге весит 5 Гб, а не 100. Правда я отключил редиректы «до выяснения», т.к. 301 на другой домен мне не нужен, а вот с индекса в папку надо отработать, но этим я займусь позже. И в догонку даю ссылку на архив с итоговыми файлами. Если что, спрашивайте у питонщиков.

Бонус 1 — файлы 91.222.136.77/tmp/us/

Бонус 2 — Что искать в теле бесполезных страниц

kw_blacklist = {
    # originally found on terrapinn.us (212.53.89.138)
    "The domain DOMAIN is registered by NetNames": "blank domain registration",
    'pageTracker._trackPageview("/parked/dns/': "domins parking A",
    'src="http://return.uk.domainnamesales.com/return_js.php': "domains parking B",
    'googlesyndication.com/apps/domainpark/': "Google's parking?!?!?",
    'src="http://dsparking.com/': "Parking, check ip",
    'src="http://cdn.rooktemplate.com/rmgdsc/newProcess.js': "Parking, check ip",
    '<h2>This Domain Is Registered with Network Solutions</h2>': "No site on Network Solutions",
    '<title>Web Page Under Construction</title>': "No site on Network Solutions", # both means that we have to skip this site
}

Бонус 3 — Кол-во ответов различного типа (из тех самых 800к)
CODE 0 — 207523 (ошибка во время запроса типа таймаут или иди в ...)
CODE 200 — 385543
CODE 202 — 1
CODE 204 — 3
CODE 300 — 5
CODE 301 — 77447
CODE 302 — 114727
CODE 303 — 305
CODE 307 — 180
CODE 400 — 2498
CODE 401 — 1217
CODE 402 — 20
CODE 403 — 14237
CODE 404 — 10475
CODE 405 — 2
CODE 406 — 21
CODE 407 — 1
CODE 409 — 1
CODE 410 — 55
CODE 411 — 2
CODE 418 — 1
CODE 500 — 1807
CODE 501 — 1
CODE 502 — 160
CODE 503 — 965
CODE 504 — 26
CODE 505 — 4
CODE 508 — 1
CODE 509 — 3
CODE 600 — 1
CODE 999 — 1

Важное дополнение — смотрел я логи сервера и удивлялся, сильно удивлялся тому что с айпи 127.0.0.1 идут запросы на 80й порт. Проверил, таки да, на 127.0.0.1 ссылаются некоторые домены. Равно как и на 10.*.*.* и иные зарезервированные подсети.

Автор: InfoHole

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js