CiNii Booksの所蔵館情報からメールアドレスリストをつくってみる
はじめに
某MLでこんな感じの話題が少し前にあったのでCiNiiの所蔵館情報から正規表現を使ってメールアドレスを抜き出すスクリプトをシェルスクリプトで書いてみました。
仕組み
FANOをつかってCiNiiにアクセスし所蔵館情報のページからメールアドレスを抜き出します。CiNiiでは幸いなことにRDFで提供しているのでそちらでもいいのですが、今回はなんとなくスクレイピングでやりました。
FANOが「FA007739」の場合、ベースURLは「http://ci.nii.ac.jp/library/」になりますので、
http://ci.nii.ac.jp/library/FA007739
が所蔵館情報のページになります。.rdfをつければ、RDFで取得できます*1。FANOのリストは千件以上あるので、何度かアクセスしたあと少し時間をおくように設定しています。
cat sosiki.txt | awk -F'\t' 'BEGIN{OFS=","} {print $1,$2}' > data.list EMAIL="" COUNTER=0 while read file do FANO=$(echo ${file} | awk -F',' '{print $1}') KIKAN_NAME=$(echo ${file} | awk -F',' '{print $2}') echo ${KIKAN_NAME} , ${FANO} CINII_DATA=$(curl -s "http://ci.nii.ac.jp/library/${FANO}" | grep -e 'writeAtMark()' -e '@') SOURCE_DATA=$(echo ${CINII_DATA} | grep -e 'writeAtMark()' -e '@' -e '[at]' | sed -e 's/<script>writeAtMark()<\/script><noscript>@<\/noscript>/\@/g'| uniq) EMAIL=$(echo ${CINII_DATA} | grep -e 'writeAtMark()' -e '@' | sed -e 's/<script>writeAtMark()<\/script><noscript>@<\/noscript>/\@/g'| perl -ne '/([-0-9a-zA-Z._+]*@[-0-9a-zA-Z._+]*)/ and print "$1\n"' | uniq | tr -d '\r\n') #抽出データを出力する echo ${FANO},${KIKAN_NAME},${EMAIL} >> email.data echo ${FANO},${KIKAN_NAME},${SOURCE_DATA} >> source.data if [ ${COUNTER} -eq 30 ]; then COUNTER=0 echo 'sleep' sleep 5 fi COUNTER=`expr $COUNTER + 1` done < data.list