3

私は単純なWebクローラーでコーディングしていて、下部のコードでクロールしようとする大量のgf静的ファイルを生成しました。私には2つの問題/質問があります。私には考えがありません。

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

1 に答える 1

6

1.エラーメッセージ

socket_closed_remotelyサーバーが接続を閉じたことを示します。これは、短い期間に要求が多すぎることが原因である可能性があります。

2.並列化

20個のワーカープロセスと、URLキューを保持する1個のプロセスを作成します。各プロセスがキューにURLを要求するようにします(メッセージを送信します)。このようにして、ワーカーの数を制御できます。

さらに「Erlangy」の方法は、URLごとに1つのプロセスを生成することです。これの利点は、コードが非常に単純になることです。欠点は、帯域幅の使用量や同じリモートサーバーへの接続数を簡単な方法で制御できないことです。

于 2012-09-10T15:11:08.937 に答える