Erlang中的并行HTTP Web爬虫

ctp*_*ctp 2 erlang http

我在一个简单的网络爬虫编码,并生成了一堆gf静态文件,我试图通过底部的代码抓取.我有两个问题/问题,我不知道:

1.)循环序列1..200 在抓取100页后完全抛出错误:

** exception error: no match of right hand side value {error,socket_closed_remotely}
     in function  erlang_test_01:fetch_page/1 (erlang_test_01.erl, line 11)
     in call from lists:foreach/2 (lists.erl, line 1262)
Run Code Online (Sandbox Code Playgroud)

2.)如何并行化请求,例如20个cincurrent reqs

-module(erlang_test_01).
-export([start/0]).

-define(BASE_URL, "http://46.4.117.69/").

to_url(Id) ->
  ?BASE_URL ++ io_lib:format("~p", [Id]).

fetch_page(Id) ->
  Uri = to_url(Id),
  {ok, {{_, Status, _}, _, Data}} = httpc:request(get, {Uri, []}, [], [{body_format,binary}]),
  Status,
  Data.

start() ->
  inets:start(),
  lists:foreach(fun(I) -> fetch_page(I) end, lists:seq(1, 200)). 
Run Code Online (Sandbox Code Playgroud)

Emi*_*röm 6

1.错误信息

socket_closed_remotely 表示服务器关闭了连接,可能是因为您在短时间内发出了太多请求.

2.并行化

创建20个工作进程和一个持有URL队列的进程.让每个进程向队列询问URL(通过向其发送消息).这样您就可以控制工人的数量.

更"Erlangy"的方法是为每个 URL 生成一个进程!这样做的好处是你的代码非常简单.缺点是您无法以简单的方式控制带宽使用或与同一远程服务器的连接数.