使用Haskell编写一个简单的网络爬虫
发布时间:2023-12-09 21:31:56
下面是用 Haskell 编写一个简单的网络爬虫的示例:
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Client
import Network.HTTP.Types.Status (statusCode)
import qualified Data.ByteString.Lazy.Char8 as LBS
import Text.HTML.TagSoup
-- 使用 HTTP 客户端库发送请求并获取响应内容的函数
getResponseBody :: String -> IO LBS.ByteString
getResponseBody url = do
manager <- newManager defaultManagerSettings
request <- parseRequest url
response <- httpLbs request manager
return $ responseBody response
-- 从 HTML 文档中提取链接的函数
extractLinks :: LBS.ByteString -> [String]
extractLinks body = case parseTags body of
[] -> []
tags -> [href | TagOpen "a" attrs <- tags, ("href", href) <- attrs]
-- 基于深度优先搜索递归爬取链接的函数
crawl :: String -> IO ()
crawl url = do
body <- getResponseBody url
putStrLn $ "Crawling: " ++ url
let links = extractLinks body
mapM_ crawl links
-- 主函数,从指定的起始网址开始爬取网站
main :: IO ()
main = crawl "https://example.com"
这个例子中,我们使用了 http-client 库来发送 HTTP 请求并获取响应内容。Text.HTML.TagSoup 库用于解析 HTML 文档并提取链接。在 crawl 函数中,我们首先通过 getResponseBody 函数获取指定网址的响应内容,然后使用 extractLinks 函数提取出所有的链接。最后,我们使用递归的方法遍历并爬取每个链接。
要运行这个网络爬虫程序,您需要安装 http-client 和 tagsoup 这两个库。您可以使用 cabal 或 stack 来安装这些库:
$ cabal update $ cabal install http-client tagsoup
然后,您可以使用 Haskell 的编译器(如 ghc)编译并运行程序:
$ ghc --make crawler.hs $ ./crawler
请注意,这个例子只是一个简单的网络爬虫,可能无法处理复杂的网站结构或大规模的爬取任务。在实际应用中,您还需要考虑网络请求失败的情况、处理重复的链接、设置合适的爬取延时等问题。
