Perl - geturls with WWW::Mechanize



我正在尝试提交一份关于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视为一种联系。

我们不知道这是后端过程需要多长时间。如果是几分钟,您可以让程序等待。即使是几个小时,等待也是合理的。

在浏览器中,页面将自行刷新。在显示的响应中实现了两种自动刷新机制。

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

javascriptsetTimeout以毫秒为单位获取参数,因此这将在 9 秒后完成。

还有一个元标记告诉浏览器自动刷新:

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

在这里,content中的4表示 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=Ed+)</strong>};
my $url = $1; # in this case, regex on HTML is fine
print "Waiting for $urln";
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>标记。一般来说,使用正则表达式来解析 HTML 不是一个好主意,但我们并不是真的在解析,我们只是在截屏单个值。QEquotemeta相同,并确保我们不必转义.?,这比在模式中一堆反斜杠更容易阅读。

脚本将在每次尝试后sleep十秒钟,然后重试。一旦匹配,它就会脱离无限循环,因此您可以将具有所需数据的实际响应的处理放在该循环后面。

将一些输出添加到循环中可能是有意义的,这样您就可以看到它仍在运行。

请注意,这需要真正保持运行,直到完成。不要停止该过程。

最新更新