在OCaml网络爬虫中跟随HTTP重定向

4

我正在做什么

我正在使用OCaml编写网络爬虫。利用下面定义的string_of_uri函数(由nlucaroni在我之前的一个问题的答案中定义),可以从Web上获取URL的HTML文本。

let string_of_uri uri = 
try let connection = Curl.init () and write_buff = Buffer.create 1763 in
    Curl.set_writefunction connection
            (fun x -> Buffer.add_string write_buff x; String.length x);
    Curl.set_url connection uri;
    Curl.perform connection;
    Curl.global_cleanup ();
    Buffer.contents write_buff;
with _ -> raise (IO_ERROR uri)

我已经编写了一些代码,用于提取获取的HTML中所有超链接的列表(即任何类似<A HREF="[LINK]">text</A>的部分)。这一切都很好地运作。
问题在于有些页面会重定向你,我不知道如何跟随重定向。例如,我的程序将在页面http://en.wikipedia.org中输出0个标签,因为维基百科实际上会将您重定向到http://en.wikipedia.org/wiki/Main_Page。如果我将最后一个页面提供给我的程序,它就可以正常工作。但是如果我提供初始页面,它只会返回0个<A>标签。
不幸的是,ocurl没有任何文档,除了接口中函数的名称外。有人有什么想法吗,我该如何改进上面的string_of_uri函数,使其跟随任何可能的重定向并输出它最后落入的页面的HTML
我注意到,在http://en.wikipedia.org上对连接应用Curl.get_redirectcount函数会返回0,这不是我期望的结果,因为该页面被重定向到其他页面...
感谢任何帮助!
最好的祝愿, Surikator。

Surikator,我建议您添加自己的答案(只需将第一段复制为答案),并将其标记为正确的答案,因为如果您从不这样做,该问题将永远出现在http://stackoverflow.com/questions/tagged/ocaml;)。 - ssice
1个回答

0

这个问题已经在这个答案的评论中得到了解答。解决方案是在Curl.perform connection上面添加Curl.set_followlocation connection true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接