这可能是一个非常晦涩的案例,但请多多包涵。
我正在编写一个需要下载网页并将其保存到本地磁盘的网络爬虫。同时,作为爬虫,它需要在每个页面上找到超链接并下载这些链接的页面。
现在我正在查看此页面上给出的第一个示例代码。我正在尝试编写这种类型的管道:
processLink :: Conduit S.ByteString IO S.ByteString
然后我将替换示例代码中的这一行:
responseBody res $$+- sinkFile "foo.txt"
用这条线:
responseBody res $= processLinks $$+ sinkFile
所以我要做的是实现一个名为 processLink 的管道,它处理一个 ByteString,从中提取链接,然后将原始 ByteString 传递给 sinkFile 以便可以保存页面。然后我可以递归地调用这些链接上的函数来下载这些链接的页面。
但是,由于 processLink 是一个纯函数,我似乎无法在 processLink 中执行任何 IO 操作,因此无法执行我需要的操作,例如下载这些链接页面。或者我可以吗?我能做些什么来解决这个问题?