Понадобилось мне собрать определенного рода статистику по вебу. Но поисковики даже приблизительно не захотели выдавать стату, какими только запросами я их ни кормил. В итоге, по исконно русской традиции, принялся писать свой «поисковик». Итак, начнем.
Первое, что нам необходимо — список всех зарегистрированных доменов. В результате продолжительных поисков был найден ресурс, предлагающий после регистрации скачать файл зоны. Регистрация проходила с добавлением кредитной карты, и после трех дней триала с нее собирались снять деньги и даже дать уже готовый файл со списком доменов, но на тот момент ждать не хотелось (возбуждение знаете ли), поэтому я просто скачал файлы зон и написал простенький парсер на 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 раза. Для этого просто включаем
Бонус 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