Erlang中的并行HTTP web爬虫

Erlang中的并行HTTP web爬虫,http,erlang,Http,Erlang,我在一个简单的网络爬虫上编写代码,生成了一堆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

我在一个简单的网络爬虫上编写代码,生成了一堆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)
2.)如何并行化请求,例如20个当前请求

-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)). 

1。错误消息

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

2。并行化

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


更“Erlangy”的方法是为每个URL生成一个进程!这样做的好处是,您的代码将非常简单。缺点是,您无法用简单的方法控制带宽使用情况或到同一远程服务器的连接数。

可能服务器正在关闭来自您ip的任何连接,因为您的请求速度非常快,这可能看起来像是dos攻击?我正在运行自己的服务器,并且具有对该框的root访问权限。获取大量文件的Ruby脚本工作正常,同时多次运行上面的Erlang代码段也工作正常,但每个实例只能获得100页。奇怪的