     [Blog](https://scrapfly.io/blog)   /  [elixir](https://scrapfly.io/blog/tag/elixir)   /  [4 Top Elixir Web Scraping Libraries in 2026](https://scrapfly.io/blog/posts/best-elixir-web-scraping-libraries)   # 4 Top Elixir Web Scraping Libraries in 2026

 by [Mohab Yousry](https://scrapfly.io/blog/author/mohab-yousry-9396552a) Nov 03, 2026 8 min read [\#elixir](https://scrapfly.io/blog/tag/elixir) [\#tools](https://scrapfly.io/blog/tag/tools) [\#web-scraping](https://scrapfly.io/blog/tag/web-scraping) 

 [  ](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries "Share on LinkedIn") [  ](https://x.com/intent/tweet?url=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries&text=4%20Top%20Elixir%20Web%20Scraping%20Libraries%20in%202026 "Share on X") [  ](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries "Share on Facebook")    

 

 

Summarize this article with

 [  ](https://chat.openai.com/?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries) [  ](https://claude.ai/new?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries) [  ](https://x.com/i/grok?text=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries) [  ](https://www.perplexity.ai/search/new?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries) [  ](https://www.google.com/search?udm=50&aep=11&q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-elixir-web-scraping-libraries) 



         

   **Web Scraping API — Anti-Bot Bypass**Bypass any anti-scraper system and automatically resolve JavaScript and fingerprint challenges.

 

 [ Learn More  ](https://scrapfly.io/products/web-scraping-api#features) [  Docs ](https://scrapfly.io/docs/scrape-api/getting-started#features) 

 

 

You started web scraping with Elixir, made a request and it returns as success, but when you try parsing the body with Floki, you find nothing. The problem is not always your selector, but a success request does not mean the page you received is the page you would see in your browser.

Below, I'll rank 4 open-source Elixir libraries each one solving a problem along your pipeline. All of them checked in September 2026. Let's get into it.



## Key Takeaways

- Pick the simplest tool that solves your problem.
- When dealing with a static page Req with Floki as a parser is your way to go.
- Wallaby is the only library here that renders JavaScript.
- Instead of building your own queue of pages to scrape, use Crawly.

**Get web scraping tips in your inbox**Trusted by 100K+ developers and 30K+ enterprises. Unsubscribe anytime.







## Elixir Web Scraping Library VS API In 2026

Each tool in our list excels in a certain task that exists in every pipeline. Understand the problems facing your system then choose the solution here.



| Tool | Use it when | Min. Elixir | What you need to run it |
|---|---|---|---|
| Req | The page is plain HTML and doesn't fight back | 1.15 | Nothing extra, Finch ships with it |
| Floki | You already have the HTML and need to pull data out with CSS selectors | 1.15 | Nothing, the parser is built in |
| Crawly | You're crawling many pages and want queues, retries and pipelines handled for you | 1.14 | HTTPoison, runs as an OTP app |
| Wallaby | You need a real browser and can't use an API | 1.17 | Chrome and ChromeDriver installed locally |
| Scrapfly API (our product, not ranked) | The site blocks you or renders content with JS | None, it's an HTTP call | API key and any HTTP client (we use Req) |

Now let's go through them.



## 1. Req

Req is the first tool in our list and the way to go if you are just looking to send a simple request to a static site.

It is straight forward and easy to use, and you will find a working example combined with Floki in the next entry as it returns a `Req.Response` whose HTML body still needs a parser, but first let's know some important settings Req has:

- `http_errors: :raise` this does not let error pages surprise you when parsing. It sends you an error instead
- `receive_timeout`: sometimes you need to customize the timeout for certain workflows.

If you want to understand more about why client-rendered pages return half empty, see

[How Javascript is Used to Block Web Scrapers? In-Depth GuideIntroduction to how javascript is used to detect web scrapers. What's in javascript fingerprint and how to correctly spoof it for web scraping.](https://scrapfly.io/blog/posts/how-to-avoid-web-scraping-blocking-javascript)



## 2. Floki

Floki converts what Req hands over into a document you can search using CSS selectors. Let's understand its most used commands.

- `Floki.parse_document/1` parses the document
- `Floki.find/2`searches the document
- `Floki.text` returns the text nodes

These are the commands used in the following example for more check out their [Official documentation](https://floki.hexdocs.pm/Floki.html).



elixir

```elixir
Mix.install([
  {:req, "== 0.7.4"},
  {:floki, "== 0.38.4"}
])

response =
  Req.get!("https://web-scraping.dev/products",
    receive_timeout: 30_000,
    http_errors: :raise
  )

{:ok, document} = Floki.parse_document(response.body)

titles =
  document
  |> Floki.find(".product h3 a")
  |> Enum.map(&String.trim(Floki.text(&1)))

IO.inspect(titles)
```



This simple example returns:

text

```text
["Box of Chocolate Candy", "Dark Red Energy Potion", "Teal Energy Potion",
 "Red Energy Potion", "Blue Energy Potion"]
```



Remember it does not fetch or render JavaScript. You will need help for those tasks from other tools on our lists. If you are not familiar with CSS selectors, see our guide

[Parsing HTML with CSS SelectorsIntroduction to using CSS selectors to parse web-scraped content. Best practices, available tools and common challenges by interactive examples.](https://scrapfly.io/blog/posts/parsing-html-with-css)



## 3. Crawly

From its name, Crawly is not just a single tool like the rest of the list. It is a crawling layer, so it’s best used when you need to scrape multiple pages not just a single one.

Now let’s understand the main callbacks in it:

- `base_url/0` the "base" its the domain where crawly keep your spider
- `init/0` the starting URLs
- `parse_item/1` here is your parser lives, it runs on every response and it returns the data and the next pages to visit

Crawly's latest Hex release is 0.17.2, published in July 2024. The repository is not archived; its latest commit was on July 16, 2025 (checked October 30, 2026). That should not scare you away from it but you need to put it into consideration.

It does not render JavaScript and it also needs a lot of dependencies, so use it when it really solves your problem.



Scrapfly

#### Scale your web scraping effortlessly

Scrapfly handles proxies, browsers, and anti-bot bypass — so you can focus on data.

[Try Free →](https://scrapfly.io/register)## 4. Wallaby

I choose [Wallaby](https://wallaby.hexdocs.pm/Wallaby.html) when the page i need to scrape needs interaction or JavaScript rendering. It is a bit harder to setup, so i try calling the page with Req first if it returns an empty page or an error if i sat that up, i go with wallaby. This one is the only entry here that requires Elixir `1.17` or above this is worth mentioning also.

Wallaby loads the page in Chrome through ChromeDriver then reads the page after it loads. use `Wallaby.start_session/1` to open a browser session, `Wallaby.Browser.visit/2` to load a URL then pair `Wallaby.Browser.all/2` with `Wallaby.Query.css/1` to return elements that match with a certain CSS selector. Use `Wallaby.Element.text/1` when you want to read the text of an element and close the session with `Wallaby.end_session/1`.

If you do not know what is a headless browser, see our guide here

[What is a Headless Browser? Top 5 Headless Browser ToolsQuick overview of new emerging tech of browser automation - what exactly are these tools and how are they used in web scraping?](https://scrapfly.io/blog/posts/what-is-a-headless-browser)



## When the Site Blocks You: Scrapfly Web Scraping API

Scrapfly publishes this blog, and its API sits outside the ranking. Wallaby handles JavaScript rendering locally. For managed fetching of blocked or JavaScript-rendered pages, call the [Scrapfly Web Scraping API](https://scrapfly.io/products/web-scraping-api) through Req, then parse the response body with Floki.

How does it work? You send a request to Scrapfly `/scrape` endpoint, pass the required parameters then it returns the page, so you can continue your pipeline.

In the this example i used:

- `url` which is the target page
- `unblocker` for anti-bot protection, previously called ASP
- `render_js` uses a real browser
- `wait_for_selector` waits until a certain CSS selector appears
- `proxified_response` makes the reply look like a direct response from a website



elixir

```elixir
Mix.install([
  {:req, "== 0.7.4"},
  {:floki, "== 0.38.4"}
])

target = "https://web-scraping.dev/products"

response =
  Req.get!("https://api.scrapfly.io/scrape",
    params: [
      url: target,
      key: System.fetch_env!("SCRAPFLY_KEY"),
      unblocker: true,
      render_js: true,
      wait_for_selector: ".product h3 a",
      proxified_response: true
    ],
    receive_timeout: 155_000,
    http_errors: :raise
  )

{:ok, document} = Floki.parse_document(response.body)

titles =
  document
  |> Floki.find(".product h3 a")
  |> Enum.map(&String.trim(Floki.text(&1)))

IO.inspect(titles)
```



To run this, Setup your API key and here is the example output:

text

```text
["Box of Chocolate Candy", "Dark Red Energy Potion", "Teal Energy Potion",
 "Red Energy Potion", "Blue Energy Potion"]
```



If you need more controls or want to read about more parameters, you will find everything about it in [Scrapfly Web Scraping API Docs](https://scrapfly.io/docs/scrape-api/getting-started).

Did you notice the `155` seconds timeout i passed in this example. This is an important note to avoid your request getting canceled before receiving the response as Req defaults to `15` seconds, which is not enough.

If you want to learn more about blocking, see our guide here:

[How to Bypass Anti-Bot Protection in 2026: All 8 Major VendorsIdentify and bypass Cloudflare, DataDome, PerimeterX, Kasada, Akamai, Incapsula, F5, and AWS WAF with Python code examples and success rate data.](https://scrapfly.io/blog/posts/how-to-bypass-anti-bot-protection)



## Choosing an Elixir Web Scraping Stack

I summed all of the tools here to make it easier for you.



Check your response, identify what is missing then choose accordingly from this list.## FAQ

Can Floki Scrape JavaScript-Rendered Pages?No, it can not. Of the libraries here, only Wallaby renders JavaScript. The Scrapfly API covered after the ranking can also return the rendered page.







Is Crawly Still Maintained in 2026?It is not archived but the last commit was more than a year ago.









## Conclusion

Every tool here solves a problem. All you have to do is to understand what are you dealing with then you will find your solution in these.

There isn't a tool that has it all. You will have to pick your stack. If the page is static, Req and Floki are all you need. If you're crawling many pages, go with Crawly. If the data only shows up after JavaScript runs, use Wallaby, but if you keep getting blocked then its [Scrapfly Web Scraping API](https://scrapfly.io/products/web-scraping-api) for you.



### Web Scraping API

Scrape any website with our powerful API. Anti-bot bypass, JavaScript rendering, and rotating proxies built-in.



[Try Web Scraping API](https://scrapfly.io/docs/scrape-api/getting-started)



Legal Disclaimer and PrecautionsThis tutorial covers popular web scraping techniques for education. Interacting with public servers requires diligence and respect:

- Do not scrape at rates that could damage the website.
- Do not scrape data that's not available publicly.
- Do not store PII of EU citizens protected by GDPR.
- Do not repurpose *entire* public datasets which can be illegal in some countries.

Scrapfly does not offer legal advice but these are good general rules to follow. For more you should consult a lawyer.

 

   [  Add as a preferred source ](https://google.com/preferences/source?q=scrapfly.io) Table of Contents















 

  Table of Contents

- [Key Takeaways](#key-takeaways)
- [Elixir Web Scraping Library VS API In 2026](#elixir-web-scraping-library-vs-api-in-2026)
- [1. Req](#1-req)
- [2. Floki](#2-floki)
- [3. Crawly](#3-crawly)
- [4. Wallaby](#4-wallaby)
- [When the Site Blocks You: Scrapfly Web Scraping API](#when-the-site-blocks-you-scrapfly-web-scraping-api)
- [Choosing an Elixir Web Scraping Stack](#choosing-an-elixir-web-scraping-stack)
- [FAQ](#faq)
- [Conclusion](#conclusion)
 
    Join the Newsletter  Get monthly web scraping insights 

 

  



Scale Your Web Scraping

Anti-bot bypass, browser rendering, and rotating proxies, all in one API. Start with 1,000 free credits.

  No credit card required  1,000 free API credits  Anti-bot bypass included 

 [Start Free](https://scrapfly.io/register) [View Docs](https://scrapfly.io/docs/onboarding) 

 Not ready? Get our newsletter instead. 

 

 ## Related Articles

 [     

 tools web-scraping 

### 5 Top Rust Web Scraping Libraries in 2026

Five current Rust libraries for static HTML, article extraction, and browser control, plus managed page access for block...

 

 ](https://scrapfly.io/blog/posts/best-rust-web-scraping-libraries) [     

 python ai 

### What is Parsing? From Raw Data to Insights

Learn about the fundamentals of parsing data, across formats like JSON, XML, HTML, and PDFs. Learn how to use Python par...

 

 ](https://scrapfly.io/blog/posts/what-is-parsing-turning-data-into-insights) [     

### What is HTTP 405 Error? (Method Not Allowed)

HTTP error codes can be confusing, especially when they disrupt your web scraping or automation tasks. One such error is...

 

 ](https://scrapfly.io/blog/posts/what-is-http-405-error) 

  



   



 Scale your web scraping effortlessly, **1,000 free credits** [Start Free](https://scrapfly.io/register)