Elixir爬蟲 — crawlie簡介

https://github.com/nietaki/crawlie

Crawlie 使用了 Elixir 的 GenStage 功能實現(xiàn)了并行爬蟲。大部分工作通過 Crawlie.Stage.UrlManager 來完成。consume 用戶提供的 url 列表,receive 接下來處理得到的 url,并保證每個 url 只被處理一次,保證 discovered urls 集合盡可能小,通過深度優(yōu)先查找 url 樹。

urls 通過 Crawlie.Stage.UrlManager 獲取,GenStage Flow,然后使用 HTTPoison 并行獲取 urls,并使用用戶提供的回調(diào)函數(shù)處理響應。被發(fā)現(xiàn)的 urls 被發(fā)回 UrlManager。

下面是它的流程圖

如果你對爬蟲的統(tǒng)計數(shù)據(jù)感興趣,可以查看Crawlie.crawl_and_track_stats/3
。它開啟了一個Stats GenServer
在 Crawlie's supervision tree。收集爬蟲過程的數(shù)據(jù)。

這個擴展通過如下方式使用:

Add crawlie to your list of dependencies in mix.exs:

def deps do
  [{:crawlie, "~> 0.6.0"}]
end

Ensure crawlie is started before your application:

def application do
  [applications: [:crawlie]]
end

看看示例

https://github.com/nietaki/crawlie_example

$ mix deps.get
$ mix crawlie.example
most popular words longer than 5 letters in the vicinity of ["https://en.wikipedia.org/wiki/Elixir_(programming_language)", "https://en.wikipedia.org/wiki/Mainframe_computer"]:
{word, count}
=============
{"system", 1973}
{"computer", 1618}
{"systems", 1257}
{"programming", 1165}
{"language", 1147}
{"software", 1052}
{"operating", 1022}
{"computers", 887}
{"languages", 873}
{"program", 825}
{"memory", 814}
{"number", 798}
{"called", 767}
{"between", 724}
{"company", 693}
{"support", 678}
{"different", 649}
{"including", 623}
{"however,", 620}
{"control", 590}

運行結(jié)果

源代碼主要看這兩個文件:
lib/mix/tasks/crawlie/example.ex and lib/crawlie_example/word_count_logic.ex.

https://github.com/nietaki/crawlie

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,492評論 2 45
  • 今夜如夢前 你在我睫毛上蕩秋千 那笑聲輕撫著我的指尖 雨落下來,打濕了我的記憶 漫漶了你的顏色 你在這迷蒙的山間隱...
    艾澤拉斯的霞光閱讀 228評論 0 0
  • 我從小到現(xiàn)在,在語文課的分析文章方面都比較愚鈍。因為我確實揣摩不出某些大家在做那篇文章時,某些標點符號,某些詞語...
    灬荏苒灬閱讀 565評論 1 0