2017-04-17 79 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