我正在尝试使用clj-http / client来检索网页。看起来它有点工作,但有时我会收到这种异常
线程中的异常" main" java.lang.ClassCastException:clojure.lang.Var $ Unbound无法强制转换为clojure.lang.Named,编译:(/ tmp / form-init8570082100332402765.clj:1:72)
这是一个简单的函数,它从数据库中检索url(来自jdbc / query:row-fn),请求url的内容并将其写入数据库。代理数据是随机的,仅供参考。
(defn get-source
"get content of an url"
[row]
(def my-proxy "72.159.148.20")
(def my-port 10000)
(def my-url (:url row))
(def h {"User-Agent" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/34.0"})
(try
(def my-body (:body (client/get my-url {:proxy-host my-proxy :proxy-port my-port :follow-redirects false :headers h :conn-timeout 100000})))
(catch clojure.lang.ExceptionInfo e
(prn "caught" e))
)
(write-data-to-db my-url my-body))
row的值来自简单的数据库查询:
(defn -main
"I don't do a whole lot ... yet."
[& args]
(def db-spec
{
:subprotocol "mysql"
:subname "//localhost:3306/a"
:user "user"
:password "pass"})
((jdbc/query db-spec ["SELECT url FROM main where html is null and url is not null limit 2"] :row-fn get-source)))
感谢您的健康批评,我已经修复了我的榜样以使其更加正确。
(defn get-source
"get list of urls to grab in"
[row]
(let [proxy "107.161.31.220" port 8080 url (:url row)
h {"User-Agent" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/34.0"}]
(:status (client/get url {:proxy-host proxy :proxy-port port :follow-redirects false :headers h :conn-timeout 100000}))))
我希望这种方式好多了,而且我再也无法得到那个例外,所以它可能被埋没在我最初带来的混乱之中。
答案 0 :(得分:3)
我认为在Clojure中(或者它只是没有声明)在函数内部或者"阻止"中不是惯用的。 Def声明了全局变量。
来自http://clojure.org/special_forms:
(def symbol init?)
使用symbol的名称和当前名称空间的值的名称空间创建并实习或定位全局var。 < ...> def产生var本身(而不是它的值)。
我猜你必须把(写入数据到数据库)放在try-block中并使用let而不是def。现在你正试图获取可能失败的东西的价值。