欢迎访问宙启技术站
智能推送

使用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-clienttagsoup 这两个库。您可以使用 cabalstack 来安装这些库:

$ cabal update
$ cabal install http-client tagsoup

然后,您可以使用 Haskell 的编译器(如 ghc)编译并运行程序:

$ ghc --make crawler.hs
$ ./crawler

请注意,这个例子只是一个简单的网络爬虫,可能无法处理复杂的网站结构或大规模的爬取任务。在实际应用中,您还需要考虑网络请求失败的情况、处理重复的链接、设置合适的爬取延时等问题。