2010-07-13 4 views
0

현재 특정 웹 사이트 크롤링과 관련된 프로젝트를 진행 중입니다. 그러나 때로는 내 Perl 프로그램이 어떤 이유로 웹 사이트에 "갇혀"(이유를 알 수 없으므로) 몇 시간 동안 프로그램이 멈추는 경우가 있습니다. 이 문제를 해결하기 위해 웹 페이지를 크롤링하는 서브 루틴에서 시간 초과를위한 코드를 삽입했습니다. 이 문제는, 내가 60 초, 대부분의 페이지가 올바르게 시간 초과됩니다 알람을 설정할 수 있습니다,하지만 때로는 프로그램이 시간이 끝나지 않고 단지 몇 시간 동안 앉아서 (어쩌면 영원히 내가 보통 죽일 이후 프로그램).간헐적으로 펄 알람 작동

정말 나쁜 웹 사이트에서 Perl 프로그램은 2.3GB의 RAM과 13GB의 스왑을 사용하여 내 메모리를 통해 먹을 것입니다. 또한 CPU 사용량이 높아지고 컴퓨터가 느려집니다. 다행히도 시간이 만료되면 모든 리소스가 빨리 릴리스됩니다.

내 코드 또는 Perl 문제입니까? 무엇을 수정해야하며이 문제의 원인은 무엇입니까? 당신은 크롤링 프로세스를 자세히 설명 할 수 있습니다

eval { 

    local $SIG{ALRM} = sub { die("alarm\n") }; 

    alarm 60; 
    &parsePageFunction(); 
    alarm 0; 
};#eval 

if([email protected]) { 

    if([email protected] eq "alarm\n") { print("Webpage Timed Out.\n\n"); }#if 
    else { die([email protected]"\n"); }#else 
}#if 
+0

파싱/크롤링/스크래핑 기능을 붙여주세요. 감사합니다. – miedwar

답변

4

LWP::UserAgent->new(timeout => 60)을, 당신이 사용하고있는 모듈의 표준 시간 제한 기능을 사용하여 조사한다 perl의 safe signals으로 문제가 발생할 수 있습니다. 대안에 대한 perlipc 문서 (예 : Perl::Unsafe::Signals)를 참조하십시오.

+0

나는 더 분명해야했음을 미안하다. 어쩌면 긁는 것이 크롤링 대신에 더 나은 용어 일 수 있습니다. 기본적으로 나는 페이지의 내용에서 적용 가능한 응용 프로그램을 얻으며 더 많은 적용 가능한 내용을 유도하는 URL로만 이동합니다. 따라서 많은 URL에 들어 가지 않을 것입니다. 그렇다면 깊이 제한은 항상 1입니다. 실제로 결과가 끝이없고 더 많은 메모리를 요청하는 REGEX 문제 일 수 있습니까? 이것은 내게는 보이지 않지만 거기 밖으로 던져 버릴 수 있습니다. 프로그램에서 사용중인 메모리 양에 따라 함수를 종료 할 수있는 방법이 있습니까? – user387049

+3

@ user387049 예, 이것은 완전히 정규식 일 수 있습니다. 안전 신호는 알람이 정규식과 같은 개별적인 Perl 연산을 방해하지 않는다는 것을 의미합니다. http://rt.perl.org/rt3//Public/Bug/Display.html?id=73464 – Schwern

+0

Perl :: Unsafe :: Signals를 사용하면 문제가 해결되었습니다.일부 REGEX가 잠겨 있었고 알람이 중단되지 않았습니다. 도와 주셔서 감사합니다! – user387049

1

:

덕분에 여기

내 코드입니다.

크롤링 된 각 페이지에 대해 모든 링크를 크롤링하고 해당 페이지의 모든 링크를 계속 크롤링하는 재귀 크롤링이라고 생각합니다.

  1. 는 깊이 제한의 일종을 만들고 각 재귀에 당신이 카운터를 증가 및 제한

  2. 에 도달하면 크롤링 중지 : 그런 경우에는

    , 두 가지 작업을 수행 할 수 있습니다

    순환 링크 감지, PAGE_B에 대한 링크가 포함 된 PAGE_A가 있고 PAGE_B에 PAGE_A에 대한 링크가있는 경우 메모리가 부족할 때까지 크롤링됩니다. 그 LWP::UserAgent을의 경우보다 다른

, 당신은 정확하게 코드가 갇히지 위치에 따라 당신이

+0

UserAgent에 대한 시간 제한을 사용하지만, 페이지를 가져온 후에 만 ​​페이지를 가져 오는 데 적용됩니다. 나는 문제가 페이지를 얻은 후에 발생한다고 생각한다. – user387049