2012-09-10 6 views
2

간단한 웹 크롤러에서 코딩 중이며 아래쪽 코드로 크롤링하려고하는 정적 파일을 생성했습니다.얼랑의 병렬 HTTP 웹 크롤러

** 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) 
: 순서 1..200 이상 반복

1.) 나에게 정확히 (100) 후 페이지를 크롤링 된 오류가 발생합니다 : 나는 내가 아이디어가없는/질문에 두 가지 문제가

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

어쩌면 서버가 요청을 매우 빠르게 만들고 DOS 공격처럼 보일 수 있으므로 서버가 모든 연결을 닫는 중입니까? – user601836

+0

나는 내 서버를 운영 중이며 상자에 대한 루트 액세스 권한이 있습니다. 방대한 양의 파일을 가져 오는 Ruby Scripts는 잘 동작하며, Erlang 스 니펫을 여러 번 실행하면 정상적으로 작동하지만 모든 인스턴스가 100 페이지 만 얻을 수 있습니다. 이상한 ... – ctp

답변

6

1. 오류 메시지

socket_closed_remotely는 서버가 짧은 시간 범위에서 너무 많은 요청을했다 아마도 때문에 연결을 닫았을 나타냅니다.

2 Parallellization

20 개 작업자 프로세스와 URL 큐를 잡고 하나 개의 프로세스를 만듭니다. 각 프로세스가 대기열에 URL을 요청하도록합니다 (메시지를 보내서). 이렇게하면 작업자 수를 제어 할 수 있습니다.

더 많은 "얼랭이"방법은 각각 에 대해 하나의 프로세스를 생성하는 것입니다. URL! 이것의 위쪽은 코드가 매우 간단하다는 것입니다. 단점은 대역폭 사용이나 동일한 원격 서버에 대한 연결 수를 간단한 방법으로 제어 할 수 없다는 것입니다.