IDに基づいてPubMedからPDFをダウンロードするには?

IDに基づいてPubMedからPDFをダウンロードするには?

PubMed Webサイトからダウンロードする必要があるファイルのPubMed ID形式があります.pdf。私は次のスクリプトを試しました。

#!/usr/bin/env bash

Link="http://www.ncbi.nlm.nih.gov/pubmed/"

ID=(10021369         
10051005
10051007
100562
10064668
10071185
)

for f in ${ID[]};
do
   wget  --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" \
         -l1 --no-parent -A.pdf ${Link}${f}/pdf/ -O ${f}.pdf
done

PDFファイルが提供されていますが、開くことはできません。私は何が間違っていましたか?

ベストアンサー1

このURLからPDFをダウンロードできるようにしたいのはなぜですか? PubMedは通常PDFを提供せず、PDFを取得するためのジャーナルWebページへのリンクを提供します。

とにかくあなたのスクリプトは大丈夫です。問題は、あなたが提供したリンクがPDFファイルではなくXMLファイルへのものであり、それがダウンロードされることです。

$ ls
10021369.pdf  10051007.pdf  10064668.pdf
10051005.pdf  100562.pdf    10071185.pdf

$ file *
10021369.pdf: XML document text
10051005.pdf: XML document text
10051007.pdf: XML document text
100562.pdf:   XML document text
10064668.pdf: XML document text
10071185.pdf: XML document text

PDFをダウンロードするには、PDFファイルへのリンクを提供する必要があります。スクリプトが訪問したリンクの1つをブラウザに割り当てることでこれをテストできます。例えば、http://www.ncbi.nlm.nih.gov/pubmed/10051005/pdf/。リンクに入るとPDFファイルではないことがわかります。

すべてのPMIDがPubMed Centralの論文へのリンクである場合は、まずPubMed IDをPubMed Central IDに変換してからPDFを取得できます。

#!/usr/bin/env bash

Link="http://www.ncbi.nlm.nih.gov/pubmed/"
PMCLink="http://www.ncbi.nlm.nih.gov/pmc/articles/"
ID=(10021369         
10051005
10051007
100562
10064668
10071185
)

for f in ${ID[@]};
do
  PMCID=$(wget  --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" \
   -l1 --no-parent ${Link}${f} -O - 2>/dev/null | grep -Po 'PMC\d+' | head -n 1)
    if [ $PMCID ]; then
       wget  --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" \
            -l1 --no-parent -A.pdf ${PMCLink}${PMCID}/pdf/ -O ${f}.pdf 2>/dev/null
    else
       echo "No PMC ID for $f"
    fi

done

このスクリプトを実行すると、指定したID(10051005.pdfおよび)から10051007.pdf無料で利用可能な2つのPDFがダウンロードされ、残りはエラーで印刷されます。

No PMC ID for 10021369
No PMC ID for 100562
No PMC ID for 10064668
No PMC ID for 10071185

残りは手動でインポートするか、関連するURLを解析する方法を理解する必要があります。

おすすめ記事