Загрузите разметку Википедии, используя Haskell

С помощью http-conduit Я хочу загрузить необработанную разметку Викимедиа для любой страницы, например страницы Википедии Stack Overflow,

Кроме того, я хотел бы, чтобы решение было применимо к страницам Викимедиа, кроме en.wikipedia.org, например de.wikibooks.org,

Примечание: на этот вопрос сразу же был дан ответ в форме вопросов и ответов, и поэтому он намеренно не показывает исследовательскую работу!

1 ответ

Решение

Этот вопрос использует параметры запроса в http-каналах, как описано в предыдущем ответе SO.

Мы будем использовать метод, описанный здесь в SO, чтобы загрузить содержимое разметки страницы.

Хотя эта задача может быть возможна с помощью MediaWiki, кажется, значительно проще использовать ?action=raw метод без явного использования API.

Для поддержки разных страниц (например, en.wikimedia.org) Я написал две функции getWikipediaPageMarkup а также getEnwikiPageMarkupпервый является более общим и позволяет использовать пользовательские домены (любой домен должен работать, при условии, что Mediawiki установлена ​​под /wiki).

{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Conduit
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString.Lazy.Char8 as LB
import Network.HTTP.Types (urlEncode)
import Data.Monoid ((<>))

-- | Get the Mediawiki marup
getWikipediaPageMarkup :: ByteString -- ^ The wikipedia domain, e.g. "en.wikipedia.org"
                       -> ByteString -- ^ The wikipedia page title to download
                       -> IO LB.ByteString -- ^ The wikipedia page markup
getWikipediaPageMarkup domain page = do
    let url = "https://" <> domain <> "/wiki/" <> urlEncode True page
    request <- parseUrl $ B.unpack url
    let request' = setQueryString [("action", Just "raw")] request
    fmap responseBody $ withManager $ httpLbs request'

-- | Like @getWikipediaPageMarkup@, but hardcoded to 'en.wikipedia.org'
getEnwikiPageMarkup :: ByteString -> IO LB.ByteString
getEnwikiPageMarkup = getWikipediaPageMarkup "en.wikipedia.org"

Обратите внимание, что недавний http-conduit требуется версия (минимум: 2.1, протестировано с 2.1.4) для того, чтобы скомпилировать код.

Другие вопросы по тегам