我正在尝试在Racket中重写一些Common Lisp网络抓取代码。
在Common Lisp中,我正在发布登录请求,并为随后的GET存储cookie-jar:
(defun login (username password)
"Logs in to www.example.com. Returns a cookie-jar containing authentication details."
(let ((cookie-jar (make-instance 'drakma:cookie-jar)))
(drakma:http-request "http://www.example.com/login"
:method :post
:parameters `(("username" . ,username) ("password" . ,password))
:cookie-jar cookie-jar)
cookie-jar))
; snip
(defun get-page (page-num cookie-jar)
"Downloads a potentially invalid HTML page containing data to scrape. Returns a string containing the HTML."
(let ((url (concatenate 'string "http://www.example.com/data/" (write-to-string page-num))))
(let ((body (drakma:http-request url :cookie-jar cookie-jar)))
(if (search "No data found." body)
nil
body))))
但是,我找不到Racket中的等价物。 latest HTTP library根本没有提及Cookie,AFAICT cookie library似乎更关于正确序列化和反序列化它们。
有人能建议一种在Racket中重写上述CL的方法,而不必实现一堆头部解析的东西吗?
答案 0 :(得分:1)
Racket图书馆中没有这样的功能(在撰写本文时,2014年1月30日)。
Racket用户列表中有some discussion,并且有一个名为client-cookies的第三方库解决了这个问题。在撰写本文时,该库尚未投入生产,但正在积极开发中。