使用Haskell实现一个简单的网络爬虫
发布时间:2023-12-10 01:24:59
使用Haskell编写一个简单的网络爬虫可以使用一些常见的库,比如http-client和http-conduit来发送HTTP请求,以及html-conduit和xml-conduit来解析HTML和XML。
下面是一个简单的网络爬虫示例,它可以获取百度首页的标题和所有链接的URL:
import Network.HTTP.Conduit (simpleHttp)
import Text.HTML.TagSoup (parseTags, Tag(..), fromAttrib)
import Data.List (isPrefixOf)
import Control.Monad (forM_)
-- 爬取网页内容
fetchURL :: String -> IO String
fetchURL url = do
response <- simpleHttp url
return $! response
-- 解析HTML,获取页面标题和链接
parseHTML :: String -> (String, [String])
parseHTML html = (title, links)
where tags = parseTags html
title = innerText $ takeWhile (~/= "<title>") tags
links = map (fromAttrib "href") $ filter (isTagOpenName "a") tags
-- 提取Tag中的文本
innerText :: [Tag String] -> String
innerText [] = ""
innerText (TagText text:tags) = text ++ innerText tags
innerText (_:tags) = innerText tags
-- 爬取并打印页面标题和链接
crawl :: String -> IO ()
crawl url = do
html <- fetchURL url
let (title, links) = parseHTML html
putStrLn $ "Title: " ++ title
putStrLn "Links:"
forM_ links putStrLn
-- 使用示例
main :: IO ()
main = crawl "https://www.baidu.com"
这个示例中,我们首先使用fetchURL函数从指定的URL获取网页内容。然后,我们使用parseHTML函数来解析HTML,提取页面标题和链接。parseTags函数将HTML字符串解析为一个[Tag String]类型的列表,其中每个Tag表示HTML中的一个标签。我们可以使用Tag类型的各种函数来操作和查询标签,比如isTagOpenName和fromAttrib函数。最后,我们使用crawl函数来爬取指定URL的网页,并打印页面标题和链接。
以上示例只是一个简单的爬虫示例,它只能提取一个页面的标题和链接。如果要构建更复杂的爬虫,可能需要处理更多的HTML标签,处理网页内容的方式可能会更加复杂。此外,爬虫还需要处理跟踪链接、处理重定向、处理页面中的表单等等。但是,这个示例可以为你提供一个起点,帮助你理解如何使用Haskell来编写一个简单的网络爬虫。
