Skip to content

Instantly share code, notes, and snippets.

@djinn2chhk
Last active May 3, 2016 14:02
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save djinn2chhk/d4889f9fbc0ecf1ec7ba to your computer and use it in GitHub Desktop.
Save djinn2chhk/d4889f9fbc0ecf1ec7ba to your computer and use it in GitHub Desktop.

Задания разделены на несколько уровней с возрастающей сложностью. Если на каком-то из первых уровней недостаточно заданий, то дополнить их можно сайтами

Я старался не повторяться с theodinproject и другими курсами, но всего не предусмотришь. Список будет дополняться.

Важное замечание: старайтесь к каждому из этих заданий написать тесты на rspec или minitest, что больше нравится. Предусмотрите все частные случае и проблемы, которые могут возникнуть.

Замечание по вводу-выводу: везде, где не указано иное, подразумевается интерфейс командной строки. Посмотрите на библиотеку slop для случаев, когда аргументов больше двух.

Поехали:

A. Базовое владение языком (io, стадартная библиотека)

  1. Fib v2: назовем fib(k, n) функцию, которая возвращает n число в последовательности, каждое следующее число в которой является суммой k предыдущих. Считать первым числом последовательности 1, а предыдущие нулями.
  2. Random names: посмотрите на http://www.nrscotland.gov.uk/files/statistics/pop-names-07-t4.csv. В этом датасете содержится список имён с количеством людей, получивших каждое имя. Напишите функцию, которая будет возвращать случайное имя, которое бы соответствовало распределению. Ну, например, если в списке 100 вань 70 вась и 30 петь, то с 15% шансом должен возвращаться петя, с 35% вася и с 50% ваня.
  3. Conway's game of life: прочитайте правила в википедии https://ru.wikipedia.org/wiki/%D0%96%D0%B8%D0%B7%D0%BD%D1%8C_%28%D0%B8%D0%B3%D1%80%D0%B0%29 и постройте симуляцию. Поле бесконечным делать не надо, достаточно очень большим. Стартовое поле сделайте просто файлом.
  4. Sudoku: классическая задача о решении судоку. http://norvig.com/sudoku.html --- вот здесь можно найти примерное описание алгоритмов.

B: взаимодействие с внешним миром

  1. CBR scraper: на сайте центробанка ежедневно публикуются курсы валют, например: http://cbr.ru/currency_base/daily.aspx?date_req=05.02.2016 Постройте программу, которая на вход будет получать две даты и код валюты, а в ответ соберет курсы по этой валюте на заданном интервале и сохранит их в csv.
  2. Twitter mini-client: заведите себе аккаунт на твиттере, если ещё не, зафолловьте людей и пройдите в раздел разработчиков. https://dev.twitter.com/rest/public При помощи их REST API постройте аналог собственной ленты (не используя home_timeline, разумеется). Покажите топ-5 самых ретвиченных твитов.

C: Now we're getting somewhere

  1. 2ch.hk scraper: напишите две программы, первая будет периодически (раз в 15 секунд, например) обновлять https://2ch.hk/pr/, собирать оттуда треды и их последние посты и сохранять в sqlite3 базу. Вторая программа будет показывать последние десять тредов и последние пять постов в каждом. Затем распространить это на любые интересующие борды. Насчёт капчи: если не дрочить борду слишком сильно и часто, то по идее вас не должно банить и требовать ввода капчи, но! Если это всё-таки произошло, то скорее всего придётся эмулировать браузер для её обхода. Хорошие новости состоят в том, что это возможно. Исследуйте https://github.com/thoughtbot/capybara-webkit. Механизм примерно такой: если показывает окошко с капчей, делаем его скриншот, заставляем пользователя ввести капчу (в командную строку) прокидываем капчу внутрь эмулированного браузера, продолжаем скрейпить. То же самое касается и гугловской капчи, где нужно тупо кликнуть, там ещё проще. А ещё проще не пытаться ломиться туда, где нас не ждут, и вместо двача скрейпить любую другую борду.
  2. Bayes classifier: используя датасет из http://www.aueb.gr/users/ion/data/enron-spam/, нужно построить наивный байесовский классификатор спама. https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D0%BF%D0%B0%D0%BC%D0%B0 вот тут примерная постановка. Полученную модель нужно куда-то сохранить, по желанию либо просто сериализовать в файл, либо в дб, на ваше усмотрение. Ну и разумеется нужен некий интерфейс к этому классификатору, который позволит на вход давать письмо, а на выход получать ответ, спам это или хам.
  3. После выполнения 1 и 2, постройте к каждому из них хтмл-интерфейс, используя sinatra

D: Было слишком просто.

Пока что в этой категории будет только одно задание:

Общее описание: Строим мини-гугл. Получив на вход список сайтов из alexa top-500, ну или свой собственный, отправляемся кравлить всё это. На скравленных страницах выделяем ссылки и ходим уже по ним и так до бесконечности. Из скравленного контента строим индекс на elasticsearch. К этому индексу приделываем небольшую форму поиска.

Теперь важные соображения:

  1. Кравлить надо в много потоков или процессов
  2. Не нужно ходить по одним и тем же урлам больше одного раза
  3. Нужно уважать robots.txt и не лезть чаще положенного (ограничить сверху максимальное количество запросов на домен это в любом случае хорошая идея; подумайте о синхронизации этих рейт-лимитов между рабочими процессами)
  4. Рекомендую пока разделить процессы кравлинга и парсинга. То есть паук тупо качает страницы, а уже другой процесс выкусывает оттуда ссылки
  5. Ранжир страниц: возьмите страницу из учебника гугла и выдайте наибольший вес тексту ссылок, которые ведут на урл (не учитывайте в ранжире ссылки с самого домена; например example.com ссылающийся на google.com со словами "лучший поисковик мира" даст веса google.com по запросам "лучший поисковик", а если ссылка будет откуда-то с google.com, то нет
  6. Ошибки будут: сайты будут слать непонятные хттп-коды, некорректно сформированный хтмл, вешаться по таймауту, и так далее. Вы строите внедорожник, а не паркетник для идеальных условий
  7. Не нужно ходить по одному сайту всё время. Какой-нибудь ютуб вас может продержать бесконечно. Нужно ввести какой-то жесткий лимит на посещения страниц с одного домена в течение часа, например
  8. Необходимо нормализовать параметры. Какой-нибудь PHPSESSID нужно из всех урлов выкидывать

Когда основа будет готова, подумайте о деплое. Найдите и прочитайте гайд по chef. Заведите пять виртуальных машины, на одну из них задеплойте веб-интерфейс и демона, который пихает задачи для пауков, на другую парсер, на три остальных пауков.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment