2012-02-19 2 views
3

문제점 : 2500 개의 웹 사이트 목록이있어 그 중 작은 이미지 스크린 샷을 가져와야합니다. 어떻게해야합니까? Perl과 함께 사이트를 구문 분석 할 수 있습니다 .- Mechanize는 좋은 것입니다. 참고 : 결과는 긴 치수에서 최대 240 픽셀 인 미리보기 이미지로만 필요합니다. 순간 나는 느리고 작은 이미지를 다시 제공하지 않습니다 솔루션이 어떻게 스크립트가 빠르고 적은 오버 헤드로 실행 만드는 방법 - 축소판Perl Mechanize - 더 적은 오버 헤드로 스크립트를 빠르게 실행하는 방법

을 spiting을

전제 조건 : 부가 기능/mozrepl/ 모듈 WWW : : 기계 장치 :: Firefox; 모듈 이미 저

첫번째 방법 :

use WWW::Mechanize::Firefox; 
my $mech = WWW::Mechanize::Firefox->new(); 
$mech->get('http://google.com'); 
my $png = $mech->content_as_png(); 

개요 :이 지정된 탭 또는 PNG 이미지로 렌더링 현재 페이지를 리턴 여기는 제 펄 솔루션이다. 모든 매개 변수는 선택 사항입니다. $ tab의 기본값은 현재 탭입니다. 좌표가 주어지면, 그 사각형은 잘려나갑니다. 좌표는 왼쪽, 위, 너비, 높이의 네 가지 일반적인 항목이있는 해시 여야합니다. 이것은 WWW :: Mechanize :: Firefox에만 해당됩니다.

나는 perldoc에서 좌표 옵션을 알고 있기 때문에 전체 페이지의 크기가 아니라 그냥 사각형으로 잘라낸 것입니다 .... WWW :: Mechanize :: Firefox는 어떻게 처리하나요? 스크린 샷을 저장합니다. 글쎄, 작은 축소판 이미지 만 있으면된다는 것을 잊어 버렸습니다. 그래서 우리는 매우 큰 파일을 가질 필요가 없습니다. 단지 축소판 스크린 샷 만 잡으면됩니다. $ png를 축소하고 이미 저를 발견 한 모듈을 cpan에서 조회했습니다.

메카 모듈은 이미지 크기 조정과 관련이 없습니다. 여기 Imager와 같은 CPAN에 다양한 이미지 모듈이 있습니다. 이미지 - 24 비트 이미지 생성을위한 Perl 확장 프로그램 : 이미 저는 이미지를 만들고 변경하기위한 모듈입니다. 다양한 이미지 형식을 읽고 쓸 수 있으며 선과 다각형 같은 기본 모양을 그리거나 다양한 방법으로 여러 이미지를 혼합하거나 크기를 조절하고 자르기, 텍스트 렌더링 등의 작업을 수행 할 수 있습니다. 모듈을 설치했는데 기본 접근법을 확장하지 못했습니다.

나는 allready를 시도했습니다. 여기있다 :의 조각 [예]를 참조 ... 이것은 내 소스입니다

linux-vi17:/home/martin/perl # perl mecha_test_1.pl 
    www.google.com 
    www.cnn.com 
    www.msnbc.com 
command timed-out at /usr/lib/perl5/site_perl/5.12.3/MozRepl/Client.pm line 186 
linux-vi17:/home/martin/perl # 

:

가 출력 커맨드를 참조하십시오

#!/usr/bin/perl 

use strict; 
use warnings; 
use WWW::Mechanize::Firefox; 

my $mech = new WWW::Mechanize::Firefox(); 

open(INPUT, "<urls.txt") or die $!; 

while (<INPUT>) { 
     chomp; 
     print "$_\n"; 
     $mech->get($_); 
     my $png = $mech->content_as_png(); 
     my $name = "$_"; 
     $name =~s/^www\.//; 
     $name .= ".png"; 
     open(OUTPUT, ">$name"); 
     print OUTPUT $png; 
     sleep (5); 
} 

음이 크기에 대해 상관하지 않는다 내가 url-list에 가지고있는 사이트들.

urls.txt [소스 목록]

www.google.com 
www.cnn.com 
www.msnbc.com 
news.bbc.co.uk 
www.bing.com 
www.yahoo.com 

질문 : 솔루션을 확장 할 수 중 하나가 타임 아웃에 중단하지 않도록하는 방법을. 그리고 작은 섬네일 만 저장합니다. 참고 : 다시 : 나는 긴 치수에서 최대 240 픽셀 인 축소판으로 결과가 필요합니다.축소판

사랑은 당신에게서 듣고

을 spiting - 필수 조건으로, 나는 allready 모듈 이미 저

스크립트가 적은 오버 헤드로 빠른 실행 만드는 방법

를 설치 한! 인사 제로

업데이트 :

는 WWW와 인터넷 :: 텔넷 제한 시간을 지정하는 방법이 있나요 : 내가 같은 시간 제한에 대해 회담 intersting Monkthread을 발견 아주 아주 intersting 있습니다 Schwerms 아이디어뿐만 아니라 : : Mechanize :: Firefox? 순간 내 인터넷 연결이 매우 느리고 가끔

$mech->get(): command timed-out at /usr/local/share/perl/5.10.1/MozRepl/Client.pm line 186 

아마도 내가 mozrepl-시간 초과 구성 후 loook 필요로 오류 얻을!? 하지만 결국 : 이상한 일이고 타임 아웃의 출처를 모르겠습니다. 어쩌면 파이어 폭스 시간 초과는 동기식으로 결과를 가져 오는 중입니다. 트레이스에서 볼 수 있듯이, WWW :: Mechanize :: Firefox는 매초마다 폴링하여 Firefox가 페이지를 가져 왔는지 여부를 확인합니다.

정말 순 :: 텔넷을 경우, 당신이 아래로 다이빙을해야합니다 :

$mech->repl->repl->client->{telnet}->timeout($new_timeout); 
가 ** 업데이트 ** 그래서 질문 있습니다

: 내가 ** 인터넷의 사용 마법사 :: 텔넷 : ** Perl-Core에 있음 **

@ Alexandr Ciornii : 힌트를위한 thx! 이후 나는 이것을 좋아할 것이다 사용 : Net :: Telnet;하지만 코어에 없다면 나는 이렇게 갈 수 없다. Daxim @ : $ corelist 순 :: Telnet␤␤Net :: 텔넷 CORE에 없었다 - 내가 BTW

위처럼 갈 수 없어 의미 : Øyvind Skaar 언급처럼 우리가 기대해야 할 많은 URL 년대로 일부는 실패하고 그것을 처리 할 것입니다. 예를 들어, 실패한 것들을 배열이나 해시에 넣고 X 번 다시 시도합니다.

+1

멀티 프로세싱을 위해 fork()를 사용하여 비트를 빠르게 처리 할 수 ​​있습니다 ... –

+0

안녕하세요 Alex - 매우 작은 이미지 (/ 축소판)를 잡아 먹으면 어떤 과정을 거치게됩니까? 참고 나는 큰 이미지가 필요하지 않습니다. 아주 아주 작은 이미지가 아주 잘 어울립니다 ... 당신은 무엇을 추측합니까? 참고 - 이미 저를 적용하는 방법이 필요합니다. – zero

+1

많은 URL을 통해 일부는 실패하고 처리 할 것으로 기대해야합니다. 예를 들어, 실패한 것들을 배열이나 해시에 넣고 X 번 다시 시도하십시오. –

답변

5

Perl에서 병렬 처리를보다 쉽고 안정적으로 수행 할 수있는 방법 중 하나 인 Parallel::ForkManager을 살펴보십시오. 대부분의 작업은 네트워크와 I/O 경계이며, CPU는 원격 웹 서버가 돌아 오기를 기다리고있을 것이며, 큰 승리를 거둘 것입니다.

시간 제한은 MozRepl의 어딘가에 있으며 기본값은 10 초입니다. 당신은 다른 타임 아웃을 가진 MozRepl :: Client 객체를 생성해야하고, 그것을 사용하기 위해 어떻게 든 WWW :: Mechanize :: Firefox를 얻거나, 문서화되지 않은 것들을 할 수 있습니다. This perlmonks thread은 타임 아웃을 변경하는 방법을 보여줍니다. 설정할 수있는 문서화되지 않은 MOZREPL_TIMEOUT 환경 변수가 있습니다.

+0

안녕하세요 Schwern, 힌트를 주신 많은 사람! 나는 조언했다! greetigns – zero

+0

안녕하세요 다시 schwern : btw : Monksthread가 있습니다. http://www.perlmonks.org/?node_id=901572 동일한 시간 제한에 대해 이야기합니다. WWW에서 Net :: Telnet 시간 초과를 지정하는 방법이 있습니까 :: Mechanize :: Firefox? 현재 나의 인터넷 연결은 매우 느리고 때로는 $ mech-> get() 에러가 발생합니다 : 명령이 /usr/local/share/perl/5.10.1/MozRepl/Client.pm 라인 186에서 시간 초과되었습니다. 글쎄, 나는 이것이 매우 이상하다고 생각하고 타임 아웃이 어디서 왔는지 모른다. 어쩌면 파이어 폭스 시간 초과는 동기식으로 결과를 가져 오는 중입니다. – zero

+0

당신은 무엇을 생각하십니까 - 승려들이 그렇게 이야기합니다 : 그것은 정말로 Net :: Telnet입니다, 그러면 당신은 잠수해야합니다 : $ mech-> repl-> repl-> client-> {telnet} -> 시간 초과 ($ new_timeout); 질문은 : Net : Telnet이 필요합니까? http://search.cpan.org/~jrogers/Net-Telnet-3.03/lib/Net/Telnet.pm 그게 전부입니까? 그게 필요합니까? 또는 아닙니다!? Net :: Telnet을 사용하거나 사용하지 않고 코드를 실행할 수 있습니까? – zero

관련 문제