Анализ результатов поиска с веб-сайта, 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*)))
Замените жестко закодированные категории и жестко закодированные структурой данных, которую вы ожидаете увидеть. Это будет тестировать:
- В запросе вы увидите, где находятся параметры.
- Вы увидите, соответствует ли ваш код рендеринга тому, что вы ожидаете, с правильными данными.
Если проблема в том, что категории и a равны нулю, возможно, вы просто забыли обработчик промежуточного программного обеспечения (посмотрите, почему это важно).
Если они содержат ожидаемые вами данные в структуре, которую вы ожидаете, то пришло время углубиться в другие ваши функции. Для этого я рекомендую использовать сеанс REPL и вызывать функцию верхнего уровня с жестко заданными значениями, которые вы ожидаете от формы, однако, если вы используете wrap-reload, вы также можете просто повторно отправить форму. Например, вы можете добавить распечатки входов и выходов вашей функции mapper-gen4 и функции get-page.
Наконец, поиграв с некоторыми значениями и результатами, скопируйте их из вашего REPL в тестовый файл, чтобы у вас были постоянные утверждения о том, как ведет себя ваш код.
Если ничего не помогает, размещение ссылки на ваш проект на github поможет вам лучше - или, если это частный проект, создайте минимальный пример проекта, чтобы люди могли помочь вам более точно.