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

使用Haskell编写一个简单的网络爬虫程序

发布时间:2023-12-10 04:31:45

下面是一个使用 Haskell 编写的简单网络爬虫程序的示例:

import Network.HTTP
import Text.HTML.TagSoup

-- 网页内容的类型
type WebPage = String

-- 通过给定的 URL 获取网页内容
getPageContent :: String -> IO WebPage
getPageContent url = do
    rsp <- simpleHTTP (getRequest url)
    getResponseBody rsp

-- 解析网页内容,提取所有链接
getLinks :: WebPage -> [String]
getLinks webpage = map extractLink $ filter isTagOpen $ parseTags webpage
    where
        extractLink (TagOpen "a" attrs) = getAttr "href" attrs
        extractLink _ = ""
        getAttr attrName attrs = case lookup attrName attrs of
            Just val -> val
            Nothing -> ""

-- 爬取指定网页,并递归爬取所有链接的网页内容
crawl :: String -> IO [WebPage]
crawl url = do
    content <- getPageContent url
    let links = getLinks content
    let pages = filter (not . null) links
    content <- mapM getPageContent pages
    return (content ++ [getPageContent url])

-- 使用示例
main :: IO ()
main = do
    let url = "http://example.com"
    pages <- crawl url
    mapM_ putStrLn pages

以上示例使用了 Network.HTTP 库来发送 HTTP 请求,以及 Text.HTML.TagSoup 库来解析 HTML 标签。它定义了 WebPage 类型来表示网页内容,使用 getPageContent 函数来获取指定 URL 的内容,用 getLinks 函数来解析网页内容,提取所有链接。crawl 函数使用递归的方式爬取指定网页及其链接的网页内容,并返回一个包含所有内容的列表。最后,使用 main 函数来演示如何使用爬虫程序,指定一个 URL 并打印爬取得到的所有网页内容。

请注意,这只是一个简单的示例,实际的网络爬虫程序可能需要更复杂的逻辑,例如处理不同类型的链接、限制爬取深度、处理页面编码等等。