使用perl的LWP读取网页 - 输出与下载的html页面不同

时间:2014-05-05 11:31:53

标签: html perl lwp ncbi

我尝试访问和使用NCBI中的不同页面,例如
http://www.ncbi.nlm.nih.gov/nuccore/NM_000036 但是,当我使用perl的LWP :: Simple' get'功能,当我手动保存页面时,我没有获得相同的输出(使用firefox浏览器'另存为html'选项)。我从“获得”中得到了什么?功能缺乏我需要的数据。

我做错了吗? 我应该使用其他工具吗?

我的脚本是:

use strict;
use warnings;
use LWP::Simple;


my $input_name='GENES.txt';

open (INPUT, $input_name ) || die "unable to open $input_name";
open (OUTPUT,'>', 'Selected_Genes')|| die;

my $line;


while ($line = <INPUT>)
{

    chomp $line;
    print OUTPUT '>'.$line."\n";
    my $URL='http://www.ncbi.nlm.nih.gov/nuccore/'.$line;
#e.g:
#$URL=http://www.ncbi.nlm.nih.gov/nuccore/NM_000036

    my $text=gets($URL);
    print $text."\n";   
    $text=~m!\r?\n\r?\s+\/translation="((?:(?:[^"])\r?\n?\r?)*)"!;
    print OUTPUT $1."\n";

}

提前致谢!

2 个答案:

答案 0 :(得分:3)

http://www.ncbi.nlm.nih.gov/nuccore/NM_000036的页面进行了大量的JavaScript处理,并动态加载了大量内容。 LWP :: UserAgent不会为您执行此操作,因为它无法运行JavaScript。

我建议您使用Firebug或Chrome开发者工具查看浏览器中发生的情况。您会看到它对此网址发出XHR请求:http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?val=289547499&db=nuccore&dopt=genbank&extrafeat=976&fmt_mask=0&retmode=html&withmarkup=on&log $ = seqview&amp; maxdownloadsize = 1000000

现在我不确定这些参数如何转换为NM_000036,但你应该能够通过查看页面上运行的一些JS代码或尝试多个页面来解决这个问题。查看XHR调用的URL。

由于这可能是一项公共服务,并且我假设您可以获取该数据,因此您应该考虑询问他们是否拥有适当的API,而不是屏幕从网站上删除这些内容

答案 1 :(得分:1)

您正在搜索的内容由JavaScript生成。您需要解析HTML(来自第一个响应)并找到所需数据的ID:

<meta name="ncbi_uidlist" content="289547499" />

接下来,您需要以以下格式向网址发出另一个请求:http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?val=ID_YOU_HAVE

像这样(未经测试!):     我的$ URL =&#39; http://www.ncbi.nlm.nih.gov/nuccore/&#39;。$ line;

my $html=gets($URL);

my ($id) = $html =~m{name="ncbi_uidlist" \s+ content="([^"]+)"}xi;
if ($id) {
    $html=gets( "http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?val=" . $id );
    $text=~m!\r?\n\r?\s+\/translation="((?:(?:[^"])\r?\n?\r?)*)"!;
    print OUTPUT $1."\n";
}