2010-09-14 7 views
5

La documentazione Network.Browser dice che il modulo supporta le seguenti:Il modulo Network.Browser di Haskell è simile a LWP di Perl o Python's mechanize?

  • HTTP movimentazione
  • gestione trasparente di reindirizzamenti
  • cookie memorizza + trasmissione di autenticazione.
  • Registrazione transazioni Connessione mediata da proxy.

Per me, suona come l'inizio di un browser che mi permette di scansione di pagine web, la gestione authenciation all'interno di siti web, biscotti, ecc

Tuttavia, il modulo viene fornito con lo zero codice di esempio, istruzioni o esercitazioni. Non riesco a capire come usarlo.

Qualcuno può dare un esempio di come potrebbe essere usato per 1) andare su un sito web, 2) collegarsi ad esso, e 3) scaricare un file che richiede di essere loggato?

risposta

3

Suggerirei di dare un'occhiata anche a Network.Curl.

Per rispondere alla tua domanda, ecco un esempio (tratto da http://haskell.pastebin.com/9kPiGxiH):

import Data.IORef 
import Network.HTTP 
import Network.Browser 
import Network.URI 
import Data.Maybe 
import Control.Monad 
import Data.List 
import Text.Regex.TDFA 
import Control.Concurrent 

pageUrl off = URI "http:" (Just $ URIAuth "" "www.interpals.net" "") "/dosearch.php" ("?todo=search&sec=adv&age1=15&age2=18&sex[]=FEMALE&lfor[]=lfor_email&lfor[]=lfor_snail&lfor[]=lfor_langex&lfor[]=lfor_friend&lfor[]=lfor_flirt&lfor[]=lfor_relation&countries[]=AT&countries[]=DE&countries[]=CH&state=&languages[]=any&keywords=&sort=p.last_login+DESC&offset="++(show off)) "" 

getPage  :: URI -> BrowserAction (HandleStream [Char]) String 
getPage uri = do 
    setErrHandler $ const $ return() 
    setOutHandler $ const $ return() 
    (_,s) <- request $ Request (uri) GET 
     [Header HdrCookie "__ubic1=MTE3ODM0NDM0MTRjN2RkYTA1OTAzMmU4LjkxODE1Njk2; __utma=46363135.421215970.1283316265.1283538085.1283541700.10; __utmz=46363135.1283316265.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); __utmc=46363135; PHPSESSID=59a130c66d4853f85289852f15cefa3a; resolution=1920x1080; ip_auto_login[login]=cap11235; ip_auto_login[password_md5]=NDM0NWM0NDlkZTg4MjRkMWVhZmJmZWNiZTQwOWQ4YTE%3D; __utmb=46363135"] "" 
    return $ rspBody s 

getPeople :: Int -> BrowserAction (HandleStream [Char]) ([String], Int) 
getPeople off = do 
    s <- getPage (pageUrl off) 
    let t = (s=~"<a href='/([^?.]+)\\?")::[[String]] 
    let next = if length t > 0 then off+10 else 0 
    return (nub $ map (!!1) t, next) 

personUrl :: String -> URI 
personUrl name = fromJust $ parseURI ("http://www.interpals.net/"++name) 

viewPerson :: String -> BrowserAction (HandleStream [Char])() 
viewPerson name = do 
    _ <- getPage $ personUrl name 
    return() 

doCycle :: IORef (Int, Int) -> IO() 
doCycle r = do 
    (count, off) <- readIORef r 
    (people, newOff) <- browse $ getPeople off 
    mapM_ (forkIO . browse . viewPerson) people 
    let newCount = count + (length people) 
    writeIORef r (newCount, if newOff<2000 then newOff else 0) 
    print newCount 
    doCycle r 

main = do 
    t <- newIORef (0,0) 
    doCycle t 
Problemi correlati