🍵
[息抜き]乃木坂工事中一覧を制限のある環境でスクレイピングとデータ整理
- 技術の発展に伴い様々な学習を続けているが、結局データの取得・整理・検索に魅力を感じる。
- その醍醐味であるスクレイピングを息抜きとして利用しているが、pythonやruby,node等のライブラリが豊富な言語がない環境でも利用したい。
- 今回は最低限のLinux環境での機能やコマンドを利用してスクレイピング及びデータ整理を行う。
環境
- Alpine Linux 3.14.0
- curl 7.77.0
- ※Macでも動作加納
手順
データの要件決め
- 取得したいデータ要件は以下。
- 形式 : TSV
- 1列目 : 日時(xxxx年xx月xx日)
- 2列目 : タイトル
ファイル用意
- 以下のように、任意のフォルダに新規のshellファイルを作成する。
mkdir ~/ng; cd $_
touch get_kojichu.sh
- 作成後、中身を以下のようにする。
#!/bin/sh
set -e
current_year=$(date '+%Y')
page_data=$(curl -s 'https://ja.wikipedia.org/wiki/乃木坂工事中の放送日程一覧')
search_command="grep -A 1 -E '<td style=.+>[0-9]+月[0-9]+日' | sed -r -e 's/<[^>]+>//g' -e 's/&#.+//g' -e '/--/d' | tr -d '\"' | awk '{if(NR%2)ORS=\"\t\"; else ORS=\"\n\"; print}'"
for i in `seq 2015 $current_year`; do
[ $i -ne $current_year ] && {
echo "$page_data" |
sed -n "/<span class=\"mw-headline\" id=\"$i年\">/,/<span class=\"mw-headline\" id=\"$((i+1))年\">/p" |
eval ${search_command} |
sed "s/^/$i年/"
} || {
echo "$page_data" |
sed -n "/<span class=\"mw-headline\" id=\"$i年\">/,/<span class=\"mw-headline\" id=\"脚注\">/p" |
eval ${search_command} |
sed "s/^/$i年/"
}
done
- 中身記述後、
chmod 755 get_kojichu.sh
で実行権限を与える。
結果
- 以下で結果を確認
# 最初の10件を表示
$ ./get_kojichu.sh | head
2015年4月20日 ななせまると愉快な仲間たち
2015年4月27日 狩野英孝のリアクション塾
2015年5月4日 生田絵梨花vs催眠術師
2015年5月11日 12thシングル選抜メンバー発表乃木坂46センター討論会
2015年5月18日 松井玲奈の世界一教えたい授業乃木坂監視中・特別編
# TSVデータに書き出す。過通信を防ぐため以下からはこちらを使用。
$ ./get_kojichu.sh > kojichu_list.tsv
# 最新日時順
$ cat kojichu_list.tsv | sort -Vr
2021年7月19日 上半期・私の反省大賞!
2021年7月12日 松村沙友理 卒業記念! 完結編
2021年7月5日 松村沙友理 卒業記念! 設楽王決定戦
2021年6月28日 奇想天外!与田クイズ
2021年6月21日 27thシングルヒット祈願! 完結編
*******
# タイトルのみ抜き出す
$ cat kojichu_list.tsv | awk -F '\t' '{print $2}'
ななせまると愉快な仲間たち
狩野英孝のリアクション塾
生田絵梨花vs催眠術師
12thシングル選抜メンバー発表乃木坂46センター討論会
******
# 検索
$ cat kojichu_list.tsv | grep '選抜メンバー'
2015年5月11日 12thシングル選抜メンバー発表乃木坂46センター討論会
2015年8月31日 13thシングル選抜メンバー発表初めてのWセンター西野・白石ガチンコチーム対決 前編
2016年2月1日 14thシングル選抜メンバー大発表
2016年6月6日 15thシングル選抜メンバー大発表
**********
まとめ
- 最低限の環境でも動作する記述を意識するようになった。
- 年情報も必要であり記述が冗長となったため、より良い記述を今後考える。
- 息抜きは重要。
Discussion