They are an integral part of this whole process <| sep |> Rotersand are great ! <| sep |> No late hit ? I don ' t like these refs . <| sep |> Also physical abuse is not okay . Leave Red if he loves you he would not have hurt you . Don ' t be weak . <| sep |> Scalpel by default uses Curl to download pages , but you can use any other HTTP client to download the page and then feed that page to scalpel scrape ' s scrape s . TagSoup . parseTags getBody String IO Text getBody url d TE . decodeUtf 8 $ BL . toStrict d $ . responseBody $ Wreq . get url main do body getBody let result scrape ' myScraper body print result myScraper Scraper Text myScraper chroots Any $ text Any The example above uses wreq to download page . And you can use usual concurrency strategies . I myself use Scalpel with Fraxl , but it can be complicated to figure out . I ' ll post a tutorial someday about it , because the end result is pretty neat . One good thing about Fraxl is that you can a semaphore into state and then limit amount of concurrent requests globally for the whole app , so it behaves politely and does not spam the server with requests . Then through magic of ApplicativeDo , everything becomes concurrent when possible . Not only that , it ' s easy to add a cache layer , so that each unique url gets downloaded once and gets stored in the filesystem . This way pages are cached on the disk and interactive development is faster .