bookradar.org — сервис поиска книг

    Хочу представить вам свой проект, над которым я трудился последние несколько месяцев, а также рассказать как это происходило. bookradar.org — поисковик книг по интернет магазинам. Сервис рассчитан на людей, которые любят читать книги. С помощью сайта они могут узнать, где можно купить нужную книгу, а также сэкономить на покупке. Чем больше стоит книга, тем больше ее цена разнится в магазинах.



    Так например книга Фил Розенцвейг «Эффект ореола…и другие восемь иллюзий, вводящие менеджеров в заблуждение.» стоит в разных магазинах от 537 до 885 руб. Разница довольно существенна.

    От идеи к результату далее …



    Пример запроса по книге:



    Идея



    Я люблю читать книги, и часто их покупаю. честно говоря, я их покупаю чаще чем, успеваю прочитать. Некоторые книги могут лежать у меня на полке по 3 года, прежде чем я до них доберусь. У меня есть читалки Kindle Paperwhite и Nook Simple Touch, также много книг я прочитал на компе во всяких pdf. Несомненно у электронных книг, есть преимущества — их можно быстро купить и читать в темноте, но всеже я предпочитаю бумажные.

    Была середина ноября 2012, я записался на онлайн курс “MongoDB for Developers”. Прошла пара недель от его начала. Хотя я еще не представлял всех возможностей MongoDB, мне уже очень нравилась эта технология. Было желание как-то применить новые знания на практике. И тут мне пришла идея сделать сайт по поиску книг.

    На тот момент я уже видел один подобный сайт, но честно говоря, он был не очень удобный, и не всегда выдавал достоверные результаты. Возможно стоило поискать еще другие сайты, но в тот момент я этого не сделал. Смотреть на другие сайты я стал уже после того как запустил свой. Их оказалось намного больше чем я мог предположить. Таких сайтов более десятка. Однако это меня нисколько не смутило. Я могу предложить пользователям более удобный поиск, а в перспективе надеюсь более точный и более широкий. Да и вообще недостатка идей не наблюдается)

    Реализация


    Сначала я решил, что мне хватит пары выходных, чтобы осуществить задуманное, но как это часто бывает, потребовалось гораздо больше времени. На работе я использую Django, но честно говоря, за пару лет работы с ней она мне несколько наскучила. Django отличный фреймворк, но просто хотелось чего-то нового, и я решил делать проект на Flask. Почему именно Flask? Случайный знакомый скинул ссылку на туториал создания блога на Flask+mongoDB и сказал, что он уже давно использует Flask в своих проектах. Было интересно попробовать.



    Попросил жену нарисовать дизайн (Полина привет!), уточнив что дизайн нужен максимально простой, без всяких теней и градиентов. На тот момент это позволило мне сэкономить время на верстке и легче вносить изменения.

    Прошел месяц… честно говоря я очень сильно устал все вечера и выходные посвящая программированию, и энтузиазм стремительно гас. Мне нужно было срочно получить обратную связь от реальных людей. Я выложил проект в минимально рабочем виде. Проект уже работал, реально искал книги в магазинах, но сильно страдал от множества мелких багов и недоработок. Все это было сделано умышленно, чтобы ускорить выкладку первой версии. Не было даже таких элементарных вещей как обработка ошибок 404 и 500, не говоря уже о всяких history API.

    Получив положительную оценку коллег, я вдохновился на продолжение работы. Следующий месяц был посвящен в основном доработке, во этих самых мелких косяков.
    К тому же выяснилось, что реальные данные не соответсвуют тому, к чему я готовился изначально. Пришлось менять схему документов в БД, разделять коллекции, изменять алгоритмы.

    С реальными данными много приколов. Например я расчитывал, что ISBN может быть уникальным идентификатором для книги. На деле оказалось не так. У одной книги может быть множество ISBN’ов. Уж не знаю кто в магазинах занимается наполнением базы, но мало того, что ISBN могут быть невалидными, дак вместо ISBN может оказаться вообще черти что, от произвольных цифр, до каких-то фраз на русском языке. Вместо цифры ноль может быть забит символ “О”, а вместо английской “Экс” может быть русская “Ха”.
    Более того, у двух совершенно разных книг, может оказаться один ISBN. В теории такое невозможно. Некоторые книги издатели объединяют в комплекты. Например в такой якобы книге оказываются ISBN’ы от двух разных книг и авторы от двух разных книг.

    А дальше я столкнулся с проблемой производительности. Python как и любой другой динамический язык работает не так быстро как хотелось бы. Для веб-приложений как правило это не играет роли, т.к. если у вас тормозит сайт значит это тормозит БД, дисковые операции или сеть. Я долго профилировал код, оптимизировал алгоритмы. Пришел к выводу, что алгоритмы нормальные, тормозят Python и БД.

    Нужно было переписывать существенную часть проекта на более быстром языке, очевидно со статической типизацией. Так в проекте появилась Scala, неведомый доселе мне язык программирования)

    Почему собственно Scala? Я выбирал между C, C++ и Scala. Первый Segmentation Fault заставил меня вычеркнуть из этог списка Си. Си хороший язык, но явно не оптимальный для данной задачи. Конечно я смотрел тесты производительности языков, но честно говоря я не верил, что скорость Java/Scala близка к скорости С++. Поэтому я написал свой тест производительности. Я взял небольшой кусок парсера и написал реализацию его на Python, Scala и С++.

    Вот результаты парсига 1,5 Гб файла:

    CPython 4 мин 12 сек
    PyPy 2 мин 48 сек
    Scala 57 сек
    C++ 47 сек.

    Алгоритм везде одинаковый, для парсинга, используются лишь строковые операции. В Scala также пробовал юзать какой-то стандартный XML парсер, но это работало намного медленнее.
    Как видим скорость Scala действительно близка к плюсам. А писать и отлаживать Scala проще. К тому же у меня было с кем проконсультироваться, в случае возникновения непоняток (Иван привет!).

    При написании кода на Scala часто ловил себя на мысли “так этот код выглядит неправильно, нужно выяснить как это сделать правильно”. Такой перфекционизм мог существенно затормозить разработку. Я говорил себе “чувак, ты не знаешь этот язык, и поэтому не можешь писать сразу правильно, поэтому просто пиши, чтобы работало!”. Психологически было сложно заставить себя писать “чтобы работало”, хотелось делать “красиво”. Но в конечном итоге я брал себя в руки и писал “чтобы работало”.

    TDD. Все парсеры с самого начала были покрыты тестами, что на Python, что на Scala. Это именно то место, где тесты сразу ускоряют разработку. С другой стороны на форнтэнде до сих пор нет ни одного теста.

    Монетизация


    В первый же день после запуска коллеги спросили меня, когда я собираюсь сделать поиск платным. А я и не собирался этого делать. Монетизация простая и понятная — партнерские программы магазинов. Рекламу размещать не планирую.

    Настоящее


    Сейчас уже исправлена целая гора недочетов присутствовавших при запуске, хотя они еще присутствуют в заметном количестве. Одна из интересных задач с которой пришлось столкнутся это склейка книг из разных источников. Сейчас алгоритм склейки работает уже достаточно хорошо, но иногода все-таки дает сбои. Если вы столкнулись с этим, напишите мне.

    Фронтэнд написан на Python/Flask, бакэнд на Scala, в качестве базы — MongoDB.

    Планы на будущее


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

    Надеюсь вам понравился мой сервис,
    буду крайне признателен за советы, критику и пожелания.

    Заходите — www.bookradar.org!
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 49

      +2
      Информацию о книгах получаете путем обычного парсинга страниц интернет-магазинов?
        0
        Начинал так, но потом начал договариваться с магазинами. Но какую-то часть все равно придется парсить так или иначе.
          0
          Не обязательно — почти у всех магазинов есть партнерки и почти все книжные магазины поставляют список в формате xml для яндекс-маркета. (yml) Например www.ozon.ru/context/partner_xml/.

          0
          Заметил, что в описании не хватает правильного переноса строк, а точнее вообще переноса. Все книги, что я смотрел, были с описанием в одну строку, что очень тяжело поддаётся чтению. Например, bookradar.org/books/0321445619?id=157745
            0
            Спасибо за замечание, обязательно поправлю.
            +1
            магазинов побольше в поиск добавьте
            findbook.ru нашел за 460 руб. эту же книжку
              +9
              Стотысячный агрегатор книжных магазинов. )) Навскидку можно вспомнить с десяток таких сервисов.

              www.knigochei.ru
              www.findbook.ru


                +1
                Описанный в статье сервис на порядок проще в использовании и восприятии результатов поиска, чем приведённые вами примеры.
                  +2
                  Не знаю. Мне ваш сервис не очень понравился. Видно, привык к файндбуку… )))
                    +1
                    Букрадар не мой.

                    На первый взгляд, у файндбука слишком замороченный интерфейс. 4 поисковых поля и сложно ориентироваться в выдаче. Но на вкус и цвет все фломастеры разные.
                      0
                      >> слишком замороченный интерфейс. 4 поисковых поля

                      omg
                        0
                        Сравните с букрадаровским одним универсальным полем, да ещё и с выпадающими подсказками.
              +6
              market.yandex.ru гораздо эффективнее ищет книги.
              В крайнем случае Поиск по продуктам от Google
              Плюс нет огромного магазина www.e5.ru в котором к тому же бесплатная доставка по коду kalend2013

              Нет расчета вместе со стоимостью доставки.

              И было бы гораздо полезнее искать по нескольким книгам + стоимость доставки.
                +1
                Багец.
                по запросу «BMW» находит много, в том числе и «BMW X5 серии. Модели E53 2000-2006 гг. выпуска. Устройство, техническое обслуживание и ремонт»,
                но при запросе «BMW X5» ничего находит.
                  0
                  Спасибо за замечание!
                    0
                    И еще, если я например ввёл «фгвш» вместо «audi» то можно и догадаться что была введена бесмыслица и «изменить» раскладку.
                      0
                      Поправил
                      +3
                      Кармический плюс за скалу, монгу и питон

                      <Я пиарюсь>
                      проверьте пунктуацию ©
                      сайт — говно™
                      </Я пиарюсь>
                        –3
                        Молодцы какие. Мы то же самое для игрушек делаем — найтиигрушку.рф/
                          0
                          а какой объем базы?
                          поиск работает подозрительно шустро…
                            +5
                            а вот такая девушка привлечет больше внимания
                            image
                            • UFO just landed and posted this here
                                0
                                в этом деле главное не что читать, а как :)
                                –1
                                Зачем постить ЭТО сдесь?
                                • UFO just landed and posted this here
                                0
                                Сейчас размер базы 8,5 Гб. Есть более интересная задача — выгружать этот объем каждый день за приемлемое время.
                                  0
                                  ну, нам это не удавалось, у нас было около 20Гб (соц игра)
                                  для решения проблемы отказоустойчивости, мы настроили репликацию,
                                  а дампы делали по ночам, но их так ни разу не пришлось использовать.

                                  какова посещаемость после Хаброэффекта?
                                    0
                                    На текущий момент за сегодня зашли 2 892 посетителя.
                                      0
                                      ну — это маловато, хотя небольшую нагрузку создаст

                                      а, на нагрузку тестировал сервис?
                                      При 10К ежесуточно не будет тормозить?
                                        0
                                        Нагрузку тестил, если хостинг не подведет, то тормозить не будет.
                                    0
                                    а используешь полнотекстный поиск Монго или Сфинкс?
                                      0
                                      Полнотекстовый поиск Монги уже заметно тормозил на 800 тыс книг, помню поиск выполнялся секунд за 6. Сейчас да, Сфинкс. А вы по 20 Гб, чем искали?
                                        0
                                        я не искал, там лежали данные о состоянии игрового профиля игрока: кол-во юнитов, хр-ка и расположение каждого юнита,
                                        осуществлялся выбор по _id, который совпадал с user_id
                                        а для рейтинга боев, использовалась выборка с ранжированием рейтинга…
                                        например для игрока с рейтингом = 10, осуществлялся выбор 10 игроков с рейтингом 9+ отсортированным по убыванию: 13,… 12....11...10...9
                                  –1
                                  Как может человек, который читает много книг, так безграмотно писать?
                                    +1
                                    Не могу сдержать эмоции: ну как можно «томуже» писать слитно? Это не опечатка, вы пишете так несколько раз во всем тексте.
                                    Ну поставьте себе хотя бы Word!!!
                                      –1
                                      Да сам не знаю. Если вы во всех словах все соседние буквы местами перепутаете, я этого даже не замечу) Я могу 5 раз прочитать слово с перепутанными и отсутствующими буквами и не заметить, что с ним что-то не так. Видимо какая-то особенность восприятия текста.
                                        +1
                                        это вполне нормальное восприятие текста, если пропускается буковка или местами меняются две соседних… Мозг человека, особенно того, который много видит текста (предполагается что он читает) сам восстановит информацию так, что глаз даже и не заметит. Многие думают, что мы видим глазами… Глаза — всего лишь датчики восприятия, а обработка всей информации происходит в мозгу. так что не парься… ты не виноват…
                                          +1
                                          Да я читал про исследования в этой области, меня больше удивляет почему большинство людей видит все эти опечатки. Я не думаю, что они читают меньше.
                                            0
                                            да, они читают меньше, и мозг у них более свободный, по этому им в глаза врезаются всякие отклонения от шаблонов.
                                      0
                                      Клевый сервис, единственный поисковик который нашел книжку Марино — «Интенсивная терапия» — ГЭОТАР 2010
                                      Остальные сервисы вываливают кучу результатов магазинов, где она значиться, но нет в наличии. Этот честно выдал всего один магазин где она есть)
                                      0
                                      bookradar: По запросу «Objective-C и программирование для Mac OS X и iOS» книги не найдены.
                                      findbook: 9 вариантов

                                      Не конкурент.
                                        0
                                        Хотелось бы галочку «искать только электронные версии книг»
                                          0
                                          Насколько я знаю, электронные есть в своих спецефических форматах для ридеров и в наших магазинах продают еще в pdf. Вас какой вариант интересует?
                                            0
                                            Любой, сконвертировать всегда можно.
                                          0
                                          вот еще один удобный сервис nemaloknig.ru

                                          Only users with full accounts can post comments. Log in, please.