suryaniwati
Crawler Data
Hi
How can I crawl a website content and save the contents to database?
Any favorite library?
Thanks,
Ani
Most Liked
idi527
I usually use httpoison with floki. There has been some discussion about it
You can replace floki with
For any interaction with a database (postgres by default) you can use ecto.
So my approach would be (roughly) like this:
defmodule Crawler do
def crawl!(url) do
%HTTPoison.Response{body: body, status: 200} = HTTPoison.get!(url)
html = Floki.parse(body)
contents = Floki.find(html, "article") # or whatever you are interested in
# see ecto docs to understand what Repo does
Crawler.Repo.insert!(%Article{contents: contents})
urls =
html
|> Floki.find("a")
|> Enum.map(fn anchor -> Floki.attribute(anchor, "href") end)
# spawn more tasks to crawl other pages, or keep crawling in the current process
end
end
Eiji
It’s not a “tool from god”, but it’s very easy to setup and it have very simple commands, so I think that’s best answer for all members (including beginners).
Eiji
@suryaniwati: Let me summary everything:
Similar topic
We have already talked about tools for collect (scrape) data from web pages here:
Database
Easiest way to validate and save data into database is using Ecto library:
Rust dependencies
And for your last question:
It’s as simple as install rust stable (using asdf tool). The rest is as easy as add elixir dependencies and compile project. ![]()
Full setup
- Ensure you have dependencies for compile sources (depends on your OS/distro)
- Install asdf
- Install Erlang plug-in for
asdf - Install Erlang
- Set Erlang version
- Install Elixir plug-in for
asdf - Install Elixir
- Set Elixir version
- Add Rust plug-in for
asdf - Install Rust
- Set Rust version
- Add PostgreSQL plug-in for
asdf - Install PostgreSQL database
- Set PostgreSQL version
Example script
# Contents of file: "setup_environment.sh"
#!/bin/bash
# asdf
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.0
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
source ~/.bashrc
# Erlang
asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
asdf install erlang 20.2.2
asdf global erlang 20.2.2
# Elixir
asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
asdf install elixir 1.6.1
asdf global elixir 1.6.1
# Rust
asdf plugin-add rust https://github.com/code-lever/asdf-rust.git
asdf install rust stable
asdf global rust stable
# PostgreSQL
asdf plugin-add postgres https://github.com/smashedtoatoms/asdf-postgres.git
asdf install postgres 10.1
asdf global postgres 10.1
Notes
- Feel free to modify script and install different versions of packages or different databases.
Other helpful resources
Finally this article should be helpful for setup Ecto 2 based project:
Last Post!
axelson
Plus it supports so many different languages. I was so tired of having separate version managers for each language, it’s super nice to have just one version manager.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









