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

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

发布时间:2023-12-10 08:27:33

以下是使用Haskell编写一个简单的爬虫程序的示例代码:

import Network.HTTP.Conduit (simpleHttp)
import Text.HTML.TagSoup (parseTags, Tag(TagOpen))

-- 爬取指定URL的HTML内容
getPageContent :: String -> IO String
getPageContent url = do
  contents <- simpleHttp url
  return $ show contents

-- 从HTML内容中提取所有链接
extractLinks :: String -> [String]
extractLinks html = [link | TagOpen "a" attrs <- parseTags html, ("href", link) <- attrs]

-- 主函数,爬取指定URL的所有链接
main :: IO ()
main = do
  putStrLn "Enter the URL to crawl:"
  url <- getLine
  pageContent <- getPageContent url
  let links = extractLinks pageContent
  putStrLn "Found links:"
  mapM_ putStrLn links

该程序使用了第三方库http-conduit用于简化HTTP请求,以及tagSoup库解析HTML标签。

首先,我们定义了一个函数getPageContent,用于从指定URL获取页面的HTML内容。这里我们使用了http-conduit库提供的simpleHttp函数发送HTTP请求并获取响应内容。然后,我们将内容用show函数转换为字符串形式并返回。

接下来,我们定义了一个函数extractLinks,用于从HTML内容中提取出所有链接。这里我们使用了tagSoup库提供的parseTags函数将HTML内容解析为标签列表,然后通过列表推导式过滤出所有包含<a>标签的标签,再从标签的属性中提取出href属性的值作为链接。最终返回一个包含所有链接的列表。

最后,定义了一个main函数作为程序的入口。在该函数中,我们首先提示用户输入要爬取的URL,然后使用getLine函数获取用户输入的URL。接着,调用getPageContent函数获取页面的HTML内容,并将其传递给extractLinks函数提取所有链接。最后,使用putStrLn函数打印出找到的所有链接。

要运行该程序,需要安装http-conduit和tagSoup库。可以使用以下命令安装这些库:

$ stack install http-conduit tagSoup

然后,使用以下命令编译并运行程序:

$ stack runghc crawler.hs

程序将提示用户输入要爬取的URL,然后输出找到的所有链接。请注意,该爬虫程序仅仅输出了链接,没有进行更复杂的处理和深度爬取等功能,只是作为一个简单的示例。