2010-09-14 8 views
5

La documentación Network.Browser dice que el módulo soporta los siguientes: manejo de¿Es el módulo Haskell's Network.Browser como el LWP de Perl o el mecanizado de Python?

  • manejo transparente de redirecciones
  • cookie almacena + transmisión de autenticación

    • HTTP.
    • Registro de transacciones Conexiones mediadas por proxy.

    Para mí, suena como el comienzo de un navegador que me permite rastrear páginas web, manejo authenciation en los sitios web, galletas, etc.

    Sin embargo, el módulo viene con código de ejemplo del cero, instrucciones o tutoriales. No puedo entender cómo usarlo.

    ¿Alguien puede dar un ejemplo de cómo podría usarse para 1) ir a un sitio web, 2) iniciar sesión en él, y 3) descargar un archivo que requiere que haya iniciado sesión?

  • Respuesta

    3

    Sugiero echar un vistazo a Network.Curl también.

    Para responder a su pregunta, aquí es un ejemplo (tomado de 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 
    
    Cuestiones relacionadas