CiNii Booksの所蔵館情報からメールアドレスリストをつくってみる

はじめに

某MLでこんな感じの話題が少し前にあったのでCiNiiの所蔵館情報から正規表現を使ってメールアドレスを抜き出すスクリプトシェルスクリプトで書いてみました。

用意するもの

  • NIIの提供する所蔵館情報、FANOのリスト

https://illoffset.nii.ac.jp/icos/MainFrame.do

仕組み

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>&#64;<\/noscript>/\@/g'| uniq)
		EMAIL=$(echo ${CINII_DATA} | grep -e 'writeAtMark()' -e '@' | sed -e 's/<script>writeAtMark()<\/script><noscript>&#64;<\/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

結果と感想

1222館*2から353件のメールアドレスが取得できました。Twitterアカウントのようなものも混ざっているので、全部ではないようですが。もう少し取得できるかなあ、と思っていたのですが。とり逃していることもあるかもしれません。メールアドレスの正規表現の部分は少しはまってしまったので結局Perlで書いてます。

*1:今回はやっていません

*2:FANOリストの行数