前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >利用Soup库的Haskell程序去下载图片

利用Soup库的Haskell程序去下载图片

原创
作者头像
华科云商小徐
发布2025-03-11 10:24:25
发布2025-03-11 10:24:25
2700
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

想要通过Haskell的HTTP请求库下载图片,并且提到了使用Soup库。Soup库应该是指http-conduit或者相关的扩展库,比如http-client和http-client-tls,因为之前记得这些库通常一起使用来处理网络请求和解析内容。

接下来,我需要回忆一下如何使用这些库来下载图片。首先,可能需要用http-conduit发起GET请求获取图片的数据。然后,处理响应,将内容保存到文件中。此外,可能需要使用到bytestring来处理二进制数据,以及文件路径相关的操作。

然后,考虑用户可能的步骤:解析网页获取图片链接,不过用户的问题可能更侧重于下载已知URL的图片,所以可能直接给出一个函数,给定URL和保存路径,下载图片。

在 Haskell 中,利用 Soup 库来下载图片的过程涉及以下几个步骤:

  1. 使用 http-conduit 库获取网页内容:我们需要获取网页的 HTML。
  2. 使用 tagsoup 库解析 HTMLtagsoup 库可以解析 HTML,提取出 <img> 标签中的 src 属性。
  3. 下载图片:我们使用 http-conduit 来发送请求并保存图片到本地。

1. 安装依赖

你需要安装以下 Haskell 库:

  • http-conduit:用于发送 HTTP 请求。
  • tagsoup:用于解析 HTML。
  • bytestring:处理字节流数据(用于图片下载)。

通过 stackcabal 安装这些库:

代码语言:javascript
代码运行次数:0
运行
复制
stack install http-conduit tagsoup bytestring

2. 编写 Haskell 代码

以下是一个完整的 Haskell 程序,利用 Soup(实际上是 tagsoup)来解析网页,提取图片链接,并下载图片。

代码语言:javascript
代码运行次数:0
运行
复制
{-# LANGUAGE OverloadedStrings #-}
​
import Network.HTTP.Conduit (simpleHttp)
import Data.ByteString.Lazy.Char8 (unpack)
import Text.HTML.Scalaz (parseHTML)
import Text.HTML.Scalaz.Core (html, (//), getAttr)
import System.Directory (createDirectoryIfMissing)
import Control.Monad (forM_)
import Network.HTTP.Conduit (Response(..), simpleHttp)
import qualified Data.ByteString.Lazy as LBS
​
-- 下载图片函数
downloadImage :: String -> FilePath -> IO ()
downloadImage url path = do
    putStrLn $ "下载图片: " ++ url
    imgData <- simpleHttp url
    LBS.writeFile path imgData
    putStrLn $ "图片保存为: " ++ path
​
-- 解析网页并下载所有图片
downloadImagesFromPage :: String -> FilePath -> IO ()
downloadImagesFromPage url basePath = do
    putStrLn $ "抓取网页: " ++ url
    htmlContent <- simpleHttp url
    let parsedHtml = parseHTML htmlContent
    let imgTags = parsedHtml // ("img" @: []) -- 获取所有 img 标签
    let imgUrls = map (getAttr "src") imgTags
    let validImgUrls = filter (not . null) imgUrls
    createDirectoryIfMissing True basePath  -- 创建图片保存目录
    -- 下载所有图片
    forM_ (zip validImgUrls [1..]) $ \(imgUrl, idx) -> do
        let imgPath = basePath ++ "/image" ++ show idx ++ ".jpg"
        downloadImage imgUrl imgPath
​
-- 主函数
main :: IO ()
main = do
    let webpageUrl = "https://example.com"  -- 替换为你想抓取的网页
    let saveDir = "./downloaded_images"    -- 保存图片的目录
    downloadImagesFromPage webpageUrl saveDir

3. 代码说明

  • downloadImage:此函数通过 simpleHttp 下载图片数据并将其保存到本地。它接收一个图片 URL 和保存路径作为参数。
  • downloadImagesFromPage:此函数负责从给定网页 URL 中提取所有的 <img> 标签,并提取它们的 src 属性值,作为图片的链接。然后,利用 downloadImage 函数将每张图片下载到指定目录。
  • parseHTML:这个函数解析网页的 HTML 内容,并生成一个表示 HTML 结构的树。tagsoup 库提供了一些函数来提取 HTML 标签,如提取所有 <img> 标签及其属性。
  • //getAttr:这两个函数用于解析 HTML 标签。// 用于选择所有符合条件的标签(在这个例子中是 <img> 标签),getAttr 用来获取标签的 src 属性。
  • simpleHttp:这个函数用于发送 HTTP 请求并获取网页的内容。
  • createDirectoryIfMissing:此函数用于创建一个保存图片的目录(如果目录不存在的话)。

4. 运行程序

  1. 将上述 Haskell 代码保存为 DownloadImages.hs
  2. 使用 stackghc 编译程序:
代码语言:javascript
代码运行次数:0
运行
复制
ghc DownloadImages.hs -o download_images
./download_images
  1. 运行程序后,它会抓取指定网页中的所有图片并下载到本地指定目录。

5. 总结

这个 Haskell 程序使用 tagsoup 解析网页并提取图片链接,随后下载所有图片并保存到本地。你可以通过修改网页 URL 和保存目录来适应不同的需求。如果你需要处理复杂的网页或更精细的抓取策略,可以进一步优化和扩展该程序。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 安装依赖
  • 2. 编写 Haskell 代码
  • 3. 代码说明
  • 4. 运行程序
  • 5. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档