2017-04-17 82 views
-1

的Perl - geturls與WWW ::機械化

我試圖提交http://bioinfo.noble.org/TrSSP/一種形式,要提取的結果。

我的查詢數據看起來像這樣

>ATCG00270 
MTIALGKFTKDEKDLFDIMDDWLRRDRFVFVGWSGLLLFPCAYFALGGWFTGTTFVTSWYTHGLASSYLEGCNFLTAA VSTPANSLAHSLLLLWGPEAQGDFTRWCQLGGLWAFVALHGAFALIGFMLRQFELARSVQLRPYNAIAFSGPIAVFVSVFLIYPLGQSGWFFAPSFGVAAIFRFILFFQGFHNWTLNPFHMMGVAGVLGAALLCAIHGATVENTLFEDGDGANTFRAFNPTQAEETYSMVTANRFWSQIFGVAFSNKRWLHFFMLFVPVTGLWMSALGVVGLALNLRAYDFVSQEIRAAEDPEFETFYTKNILLNEGIRAWMAAQDQPHENLIFPEEVLPRGNAL 

我的劇本是這樣的

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給出這樣

<!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.no​​ble.org/TrSSP/?sessionid=1492435151653763),然後稍後再提取結果。但是我不確定這是否是完成這項工作的最佳方式。謝謝。 – pali

回答

1

我們不知道這是後端過程需要多長時間。如果是幾分鐘,你可以讓你的程序等待。即使是幾個小時,等待也是合理的。

在瀏覽器中,頁面將自行刷新。在顯示的響應中實現了兩種自動刷新機制。

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

的JavaScript setTimeout發生在毫秒的參數,所以這將9秒之後進行。

還有一個meta標籤,告訴瀏覽器自動刷新:

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

這裏,content4裝置4秒。所以這個會在早些時候完成。

當然,我們也不知道他們保持會議多久。每十秒鐘重新載入一次該頁面可能是一種安全的方法(或者更常見,如果你願意的話)。

您可以通過構建簡單的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直到完成處理。由於這是一個非常簡單的文檔,我們可以安全地使用模式匹配。網址始終相同,並且標有<strong>標籤。在general it's not a good idea to use regex to parse HTML,但我們不是真的解析,我們只是screenscraping單個值。 \Q\Equotemeta相同,並確保我們不必轉義.?,這樣比在模式中使用反斜槓\更容易閱讀。

腳本將sleep在每次嘗試後再嘗試10秒鐘。一旦匹配,就會跳出無限循環,因此您可以將具有您想要的數據的實際響應處理到該循環後面。

將一些輸出添加到循環中可能會有意義,因此您可以看到它仍在運行。

請注意,這需要真正保持運行,直到完成。不要停止這個過程。

+0

非常感謝。我通過多個腳本以多個步驟完成整個過程。提交後,我正在提取正確的網址。之後,我正在下載網頁並最終進行html表格解析。你讓我的生活更輕鬆:)。現在我想我可以像這樣直接解析我的結果我的$ text ='read_file($ mech); my $ te = new HTML :: TableExtract(); $ te-> parse($ text); foreach my $ ts($ te - > table_states){ foreach my $ row($ ts-> rows) { print「」,join(',',@ $ row),「\ n」; } } ' – pali

+0

@pali很高興聽到它的作品。當你在它的時候,停止使用間接對象表示法。不要做'新的HTML :: TableExtract'。改爲使用'HTML :: TableExtract-> new'。間接對象​​符號可能會導致perl變得混亂的模糊語法等等。 :) – simbabque

+0

感謝您的見解。 – pali