0


http://www.ncbi.nlm.nih.gov/nuccore/NM_000036などの NCBI の別のページにアクセスして使用しようとしていますが、 perl の LWP::Simple 'get' 関数を使用すると、同じ結果が得られません。ページを手動で保存したときに得られる出力(Firefoxブラウザーの「htmlとして保存」オプションを使用)。「get」関数から得たものには、必要なデータがありません。

私は何か間違ったことをしていますか?別のツールを使用する必要がありますか?

私のスクリプトは次のとおりです。

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";

}

前もって感謝します!

4

2 に答える 2

3

http://www.ncbi.nlm.nih.gov/nuccore/NM_000036のページは、多くの JavaScript 処理を行い、多数のものを動的にロードします。LWP::UserAgent は JavaScript を実行できないため、これを行いません。

Firebug または Chrome 開発者ツールを使用して、ブラウザで何が起こっているかを確認することをお勧めします。次の URL に対して 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&maxdownloadsize=1000000

これらのパラメータが にどのように変換されるかはわかりませんNM_000036が、ページで実行されている JS コードの一部を調べるか、複数のページを試して XHR 呼び出しの URL を調べることで、それを理解できるはずです。 .

これはおそらく公共サービスであり、そのデータを取得することが許可されていると想定しているため、Web サイトから画面をスクレイピングするのではなく、ヒットできる適切な API があるかどうかを尋ねることを検討する必要があります。

于 2014-05-05T11:45:19.210 に答える
1

検索しているコンテンツは JavaScript によって生成されています。HTML を (最初の応答から) 解析し、必要なデータの ID を見つける必要があります。

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

次に、次の形式で URL に別のリクエストを行う必要があります: http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?val=ID_YOU_HAVE

このようなもの (未テスト!): my $URL=' http://www.ncbi.nlm.nih.gov/nuccore/ '.$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";
}
于 2014-05-05T11:56:42.567 に答える