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

使用Haskell实现一个简单的网络爬虫

发布时间:2023-12-10 01:24:59

使用Haskell编写一个简单的网络爬虫可以使用一些常见的库,比如http-clienthttp-conduit来发送HTTP请求,以及html-conduitxml-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类型的各种函数来操作和查询标签,比如isTagOpenNamefromAttrib函数。最后,我们使用crawl函数来爬取指定URL的网页,并打印页面标题和链接。

以上示例只是一个简单的爬虫示例,它只能提取一个页面的标题和链接。如果要构建更复杂的爬虫,可能需要处理更多的HTML标签,处理网页内容的方式可能会更加复杂。此外,爬虫还需要处理跟踪链接、处理重定向、处理页面中的表单等等。但是,这个示例可以为你提供一个起点,帮助你理解如何使用Haskell来编写一个简单的网络爬虫。