2017-04-17 8 views
-1

펄 - WWW와 geturls는 :: 내가 <code>http://bioinfo.noble.org/TrSSP/</code>에 양식을 제출하려고 노력하고 결과를 추출 할하고

기계화.

내 쿼리 데이터가 내 스크립트가이

use strict; 
use warnings; 

use File::Slurp; 
use WWW::Mechanize; 

my $mech = WWW::Mechanize->new; 

my $sequence = $ARGV[0]; 

$mech->get('http://bioinfo.noble.org/TrSSP'); 
$mech->submit_form(fields => { 'query_file' => $sequence, },); 

print $mech->content; 

#sleep (10); 

open(OUT, ">out.txt"); 

my @a = $mech->find_all_links(); 

print OUT "\n", $a[$_]->url for (0 .. $#a); 

print $mech->content처럼 보이는이

>ATCG00270 
MTIALGKFTKDEKDLFDIMDDWLRRDRFVFVGWSGLLLFPCAYFALGGWFTGTTFVTSWYTHGLASSYLEGCNFLTAA VSTPANSLAHSLLLLWGPEAQGDFTRWCQLGGLWAFVALHGAFALIGFMLRQFELARSVQLRPYNAIAFSGPIAVFVSVFLIYPLGQSGWFFAPSFGVAAIFRFILFFQGFHNWTLNPFHMMGVAGVLGAALLCAIHGATVENTLFEDGDGANTFRAFNPTQAEETYSMVTANRFWSQIFGVAFSNKRWLHFFMLFVPVTGLWMSALGVVGLALNLRAYDFVSQEIRAAEDPEFETFYTKNILLNEGIRAWMAAQDQPHENLIFPEEVLPRGNAL 

처럼 보이는 내가이 링크

를 추출 할이

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 

    <head> 
     <title>The job is running, please wait...</title> 
     <meta http-equiv="refresh" content="4;url=/TrSSP/?sessionid=1492435151653763"> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
    <link rel="stylesheet" href="interface/style.css" type="text/css"> 
</head> 

<body> 
<table width="90%" align="center" border="0" cellpadding="0" cellspacing="0" class="table1"> 

    <tr align="center"> 
    <td width="50">&nbsp;</td> 
    <td></td> 
    <td>&nbsp;</td> 
    </tr> 

    <tr align="left" height="30" valign="middle"> 
    <td width="30">&nbsp;</td> 
    <td bgColor="#CCCCFF">&nbsp;Your sequences have been submitted to backend pipeline, please wait for result:</td> 
    <td width="30">&nbsp;</td> 
    </tr> 

    <tr align="left"> 
    <td>&nbsp;</td> 
    <td> 

<br><br><font color="#0000FF"><strong> 
&nbsp;</strong></font> 
<BR><BR><BR><BR><BR><BR><br><br><BR><br><br><hr> 
If you don't want to wait online, please copy and keep the following link to retrieve your result later:<br> 

<strong>http://bioinfo.noble.org/TrSSP/?sessionid=1492435151653763</strong> 

<script language="JavaScript" type="text/JavaScript"> 
function doit() 
{ 
    window.location.href="/TrSSP/?sessionid=1492435151653763"; 
} 
setTimeout("doit()",9000); 
</script> 

    </td> 
    <td>&nbsp;</td> 
    </tr> 
</table> 
</body> 
    </html> 

같은 결과를 제공

http://bioinfo.noble.org/TrSSP/?sessionid=1492435151653763 

및 작업 완료시 결과를 다운로드하십시오. 그러나 find_all_links()은 링크로 /TrSSP/?sessionid=1492434554474809을 인식하고 있습니다.

+0

* "작업 완료시 결과 다운로드"* 완료된 결과가 제공 될 때까지 해당 주소를 폴링하고 싶습니까? – Borodin

+0

사실 내 최종 목표는 해당 주소에 나타나는 결과를 추출하는 것입니다. 그러나 얼마나 오래 걸릴 지 확신하지 못합니다. 따라서 주소 (http://bioinfo.noble.org/TrSSP/?sessionid=1492435151653763)를 추출한 다음 언젠가는 나중에 결과를 가져 오는 것이 좋습니다. 그러나 나는 이것이 이것이이 직업을 수행하는 가장 좋은 방법이 될 것이라고 확신하지 못한다. 감사. – pali

답변

1

우리는 이것이 얼마나 오래 걸릴지 백엔드 프로세스인지 알지 못합니다. 몇 분이면 프로그램을 기다릴 수 있습니다. 몇 시간이라도 기다리는 것이 합리적입니다.

브라우저에서 페이지가 자체적으로 새로 고침됩니다. 표시중인 응답에는 두 가지 자동 새로 고치기 메커니즘이 구현되어 있습니다.

<script language="JavaScript" type="text/JavaScript"> 
function doit() 
{ 
    window.location.href="/TrSSP/?sessionid=1492435151653763"; 
} 
setTimeout("doit()",9000); 
</script> 

자바 스크립트 setTimeout (밀리 초) 인수를 취하므로이 9 초 후에 수행됩니다. 자동 새로 고침에 브라우저를 알려주는 메타 태그도있다

:

<meta http-equiv="refresh" content="4;url=/TrSSP/?sessionid=1492435151653763"> 
여기

content4 4 초 것을 의미한다. 그래서 이것은 일찍 끝날 것입니다.

물론 세션을 얼마나 오랫동안 유지하는지 알 수 없습니다. 10 초마다 해당 페이지를 다시로드하는 것이 안전 할 수 있습니다 (또는 원하는 경우 더 자주 수행 할 수도 있음).

간단한 while 루프를 작성하고 새로 고침이 응답에 있는지 계속 확인하면됩니다.

# do the initial submit here 

... 

# assign this by grabbing it from the page 
$mech->content =~ m{<strong>(\Qhttp://bioinfo.noble.org/TrSSP/?sessionid=\E\d+)</strong>}; 
my $url = $1; # in this case, regex on HTML is fine 

print "Waiting for $url\n"; 
while (1) { 
    $mech->get($url); 
    last unless $mech->content =~ m/refresh/; 
    sleep 10; # or whatever number of seconds 
} 

# process the final response ... 

먼저 데이터를 제출하십시오. 그런 다음 처리가 완료 될 때까지 호출해야하는 URL을 추출합니다. 이것은 매우 간단 명료 한 문서이기 때문에 패턴 일치를 안전하게 사용할 수 있습니다. URL은 항상 동일하며 명확하게 <strong> 태그로 표시되어 있습니다. general it's not a good idea to use regex to parse HTML에서 우리는 실제로 파싱을 수행하지 않지만 우리는 단지 screenscraping의 단일 값을 사용합니다. \Q\Equotemeta과 동일하며 .?을 이스케이프 할 필요가 없으므로 패턴에 백 슬래시가 포함 된 것보다 읽기가 쉽습니다. \

시도 할 때마다 스크립트는 sleep을 10 초 동안 다시 시도합니다. 일단 일치하면 끝없는 루프에서 빠져 나오므로 루프 뒤에 원하는 데이터가있는 실제 응답을 처리 할 수 ​​있습니다.

일부 출력을 루프에 추가하여 여전히 실행 중인지 확인할 수 있습니다.

이 작업이 완료 될 때까지 계속 실행해야합니다. 프로세스를 중단하지 마십시오.

+0

고마워요. 여러 스크립트로 여러 단계에서 전체 프로세스를 수행했습니다. 제출 후, 나는 적당한 URL을 추출하고 있었다. 그 후 웹 페이지를 다운로드하고 마침내 html 테이블 구문 분석을 다운로드했습니다. 너는 내 인생을 더 쉽게 만든다. 이제 나는 내 결과를 직접 파싱 할 수 있다고 생각한다. my $ text ='read_file ($ mech); my $ te = 새 HTML :: TableExtract(); $ te-> parse ($ text); foreach my $ ts ($ te -> table_states) { foreach my $ row ($ ts-> rows) { 인쇄 ""조인 (',', @ $ 행), "\ n"; } } ' – pali

+0

@pali 그것이 작동한다는 소식을 듣고 기꺼이 들었습니다. 사용자가있는 동안 간접적 인 객체 표기법 사용을 중지하십시오. 'new HTML :: TableExtract'을하지 마십시오. 대신'HTML :: TableExtract-> new'을하십시오. 간접적 인 객체 표기법은 perl이 혼란스럽게되는 모호한 구문으로 이어질 수 있습니다. :) – simbabque

+0

통찰력을 가져 주셔서 감사합니다. – pali