Анализ результатов поиска с веб-сайта, compojure/clojure

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

Домашняя страница будет выглядеть достаточно просто, с текстовым полем, где вы должны ввести название фильма и отправить кнопку с именем "Поиск". Я постараюсь быть как можно более подробным:

1. Это главная страница:

(defn view-input [] 
(view-layout 
[:h2 "Find your Movie"] 
[:body {:style "font: 14pt/16pt helvetica; background-color: #F2FB78; padding-top:100px; text-align: center"  }
(form-to [:post "/"]
  [:br] 
  [:br]
  (text-field {:placeholder "Enter movie name" } :a) [:br] 
  (submit-button "Search")
     )]
     ))

2. Вот функции, которые я использовал:

(defn create-flick-url [a]   
(str "http://www.imdb.com/search/title?title=" a "&title_type=feature"         
   ))


(defn flick-vec [categories a]
       (vec (let [flick-url (create-flick-url a)
                 flick-names (print-flick-name-content flick-url)]
                 (mapper-gen4 flick-names
                 (get-image-content flick-url) 
                  ))) )

(defn view-output2 [categories a]    
(view-layout
[:h2 "Search results"]
[:form {:method "post" :action "/"}               
  (interleave
    (for [flick (flick-vec categories a)]        
    (label :title (:name flick))) 
    (for [flick-name (flick-vec categories a)]        
    [:br])         
    (for [flick-image (flick-vec categories a)]
       [:img {:src (:image flick-image)}])
    (for [flick (flick-vec categories a)]
      [:br]))
      ]))

3. И это часть GET/POST в том же классе, где я использую функции view-output и view-output2:

 (defroutes main-routes            
      (GET "/" [] 
        (view-input))

  (POST "/" [categories a] 
     (view-output2 categories a))

4. Также эти функции используются предыдущими:

(defn print-flick-name-content
 [url]
 (vec (flatten (map :content (h3+table url)))))

  (defn get-image-content
  [url]
   (vec (flatten (map #(re-find #"http.*jpg" %) 
     (map :style (map :attrs (h3+table2 url)))))))

 (defn get-page
   "Gets the html page from passed url"
  [url]
  (html/html-resource (java.net.URL. url)))

  (defn h3+table
   "Return seq of <h3> and table tags, where content of the <h3> tag meet defined condition"
  [url]
  (html/select (get-page url) 
         [:td (html/attr= :class "title") :h3 :a]))     

  (defn h3+table2
   "Return seq of <h3> and table tags, where content of the <h3> tag meet defined condition"
   [url]
   (html/select (get-page url) 
         [:td (html/attr= :class "image")]))  

5. И вот последняя функция, определенная в другом классе, которая работает с картой:

   (defn mapper-gen4
    [names images] (sort-by :name (map #(hash-map 
                            :name %1 :image %2) names images)))

Я знаю, что это немного, но таким образом кто-то увидит, где проблема, так что пока страница результатов поиска не показывает ни результатов, ни ошибок, только пустая страница с заголовком h2 Search Results. Заранее спасибо!

1 ответ

Я бы начал с маршрута обработки формы:

(POST "/" [categories a] 
     (view-output2 categories a))

вставив скромное заявление о печати:

(POST "/" [categories a] 
     (do
       (println "CAT" categories "A" a)
       (view-output2 categories a)))

Убедитесь, что ваш обработчик включает в себя wrap-reload, чтобы вы могли обновить страницу и проверить консоль. Вы можете увидеть, что категории и a равны нулю, и тогда вы можете попробовать что-то вроде этого:

(POST "/" req 
     (do
       (println "REQ" req)
       (view-output2 *hard-coded-categories* *hard-coded-a*)))

Замените жестко закодированные категории и жестко закодированные структурой данных, которую вы ожидаете увидеть. Это будет тестировать:

  1. В запросе вы увидите, где находятся параметры.
  2. Вы увидите, соответствует ли ваш код рендеринга тому, что вы ожидаете, с правильными данными.

Если проблема в том, что категории и a равны нулю, возможно, вы просто забыли обработчик промежуточного программного обеспечения (посмотрите, почему это важно).

Если они содержат ожидаемые вами данные в структуре, которую вы ожидаете, то пришло время углубиться в другие ваши функции. Для этого я рекомендую использовать сеанс REPL и вызывать функцию верхнего уровня с жестко заданными значениями, которые вы ожидаете от формы, однако, если вы используете wrap-reload, вы также можете просто повторно отправить форму. Например, вы можете добавить распечатки входов и выходов вашей функции mapper-gen4 и функции get-page.

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

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

Другие вопросы по тегам