136 lines
6.0 KiB
Bash
136 lines
6.0 KiB
Bash
#!/bin/bash
|
|
# Scrape all 58 scales from minke8.cn
|
|
# Usage: bash scrape_scales.sh
|
|
set -e
|
|
BASE="https://minke8.cn"
|
|
OUT="/www/Project/digital-psychology/scales_data.json"
|
|
TMP="/tmp/scales_tmp"
|
|
mkdir -p "$TMP"
|
|
|
|
echo '[' > "$OUT"
|
|
first=true
|
|
count=0
|
|
|
|
# Full list of scales
|
|
declare -A CATS=(
|
|
["xl1"]="心理测试综合" ["xl10"]="心理测试综合" ["xl11"]="心理测试综合"
|
|
["xl2"]="心理测试综合" ["xl4"]="心理测试综合" ["xl7"]="心理测试综合"
|
|
["xl12"]="心理测试综合" ["xl14"]="心理测试综合"
|
|
["mbti"]="人格测试" ["jxrg"]="人格测试" ["xl3"]="人格测试" ["xl6"]="人格测试"
|
|
["xl5"]="人格测试" ["xl16"]="人格测试" ["gd7"]="人格测试"
|
|
["yyzcs"]="抑郁症测试" ["yyz"]="抑郁症测试" ["yy9"]="抑郁症测试" ["yy4"]="抑郁症测试"
|
|
["yy6"]="抑郁症测试" ["yy7"]="抑郁症测试" ["yy8"]="抑郁症测试" ["yy10"]="抑郁症测试"
|
|
["yy11"]="抑郁症测试" ["yy12"]="抑郁症测试" ["yy13"]="抑郁症测试"
|
|
["jlz"]="焦虑症测试" ["jl1"]="焦虑症测试" ["jl2"]="焦虑症测试" ["jl3"]="焦虑症测试"
|
|
["jl5"]="焦虑症测试" ["jl6"]="焦虑症测试" ["jl8"]="焦虑症测试"
|
|
["qp1"]="强迫症测试" ["qp3"]="强迫症测试" ["qp4"]="强迫症测试"
|
|
["zk1"]="躁狂症测试" ["zk2"]="躁狂症测试" ["zk3"]="躁狂症测试"
|
|
["sx1"]="双向情感障碍" ["sx2"]="双向情感障碍"
|
|
["sk3"]="恐惧症测试" ["sk4"]="恐惧症测试" ["sk5"]="恐惧症测试" ["sk6"]="恐惧症测试"
|
|
["iq2"]="智商测试" ["iq3"]="智商测试"
|
|
["eq1"]="情商测试" ["eq2"]="情商测试"
|
|
["sm2"]="其它测试" ["sm1"]="其它测试" ["qt1"]="其它测试" ["gd6"]="其它测试"
|
|
["xl13"]="其它测试" ["gd4"]="其它测试" ["gd1"]="其它测试" ["gd2"]="其它测试" ["gd3"]="其它测试"
|
|
)
|
|
|
|
declare -A NAMES=(
|
|
["xl1"]="症状自评量表(SCL-90)" ["xl10"]="中学生心理健康量表(MSSMHS)"
|
|
["xl11"]="小学生心理健康评定量表(MHRSP)" ["xl2"]="明尼苏达多项人格测验(MMPI)"
|
|
["xl4"]="艾森克情绪稳定性测验(EES)" ["xl7"]="康奈尔医学指数(CMI)"
|
|
["xl12"]="青少年焦虑障碍筛查量表(SCARED)" ["xl14"]="简明精神病评定量表(BPRS)"
|
|
["mbti"]="人格测试(MBTI)" ["jxrg"]="九型人格测试" ["xl3"]="艾森克人格问卷(EPQ)"
|
|
["xl6"]="卡特尔十六型人格测试(16PF)" ["xl5"]="人格障碍诊断问卷(PDQ4+)"
|
|
["xl16"]="大五人格测试(NEO-FFI)" ["gd7"]="霍兰德职业兴趣测试(SDS)"
|
|
["yyzcs"]="抑郁自评量表(SDS)" ["yyz"]="贝克抑郁量表(BDI-II)"
|
|
["yy9"]="中学生抑郁自评量表" ["yy4"]="流调用抑郁量表(CES-D)"
|
|
["yy6"]="抑郁症筛查量表(PHQ-9)" ["yy7"]="儿童青少年抑郁量表(CDI)"
|
|
["yy8"]="儿童抑郁障碍自评量表(DSRSC)" ["yy10"]="老年抑郁量表(GDS)"
|
|
["yy11"]="爱丁堡产后抑郁量表(EPDS)" ["yy12"]="焦虑抑郁量表(HAD)"
|
|
["yy13"]="汉密尔顿抑郁量表(HAMD)" ["jlz"]="贝克焦虑测试量表(BAI)"
|
|
["jl1"]="焦虑自评量表(SAS)" ["jl2"]="汉密尔顿焦虑量表(HAMA)"
|
|
["jl3"]="状态-特质焦虑问卷(STAI)" ["jl5"]="焦虑症筛查量表(GAD-7)"
|
|
["jl6"]="考试焦虑量表(TAS)" ["jl8"]="中学生焦虑自评量表"
|
|
["qp1"]="耶鲁布朗强迫标准量表(YBOCS)" ["qp3"]="强迫信念问卷(OBQ-44)"
|
|
["qp4"]="强迫量表修订版(OCI-R)" ["zk1"]="贝克-拉范森躁狂量表(BRMS)"
|
|
["zk2"]="轻躁狂自评量表(HCL-32)" ["zk3"]="杨氏躁狂评定量表(YMRS)"
|
|
["sx1"]="心境障碍问卷(MDQ)" ["sx2"]="双相情感障碍自评量表(BSQ)"
|
|
["sk3"]="交往焦虑量表(IAS)" ["sk4"]="社交回避及苦恼量表(SAD)"
|
|
["sk5"]="社交焦虑量表(SIAS)" ["sk6"]="社交恐惧量表(SPS)"
|
|
["iq2"]="瑞文智商测试(60题)" ["iq3"]="智力测试(增强版)"
|
|
["eq1"]="情商测试量表(BARON)" ["eq2"]="情绪智力量表(EIS)"
|
|
["sm2"]="匹兹堡睡眠质量指数(PSQI)" ["sm1"]="阿森斯失眠量表(AIS)"
|
|
["qt1"]="躯体化症状自评量表(SSS)" ["gd6"]="创伤后应激障碍量表(PCL-C)"
|
|
["xl13"]="防御方式自评量表(DSQ)" ["gd4"]="家庭环境量表(FES)"
|
|
["gd1"]="婚姻质量问卷(ENRICH)" ["gd2"]="爱情态度测试(LAS)" ["gd3"]="心理压力测试(PSTR)"
|
|
)
|
|
|
|
for slug in "${!NAMES[@]}"; do
|
|
name="${NAMES[$slug]}"
|
|
cat="${CATS[$slug]}"
|
|
url="${BASE}/${slug}.html"
|
|
echo ">> [$slug] $name ($cat)"
|
|
|
|
# First question to learn count
|
|
resp0=$(curl -sL -X POST "$url" -d 'action=process&index=0' 2>/dev/null)
|
|
qcount=$(echo "$resp0" | python3 -c "import json,sys; print(json.load(sys.stdin).get('length',0))" 2>/dev/null || echo 0)
|
|
|
|
if [ "$qcount" -eq 0 ] 2>/dev/null; then
|
|
echo " SKIP (0 questions or error)"
|
|
continue
|
|
fi
|
|
|
|
# Build questions+options arrays as JSON
|
|
qjson='['
|
|
ojson='['
|
|
for i in $(seq 0 $((qcount-1))); do
|
|
resp=$(curl -sL -X POST "$url" -d "action=process&index=$i" 2>/dev/null)
|
|
q=$(echo "$resp" | python3 -c "
|
|
import json,sys
|
|
d=json.load(sys.stdin)
|
|
print(json.dumps(d.get('tm',''), ensure_ascii=False))
|
|
" 2>/dev/null)
|
|
o=$(echo "$resp" | python3 -c "
|
|
import json,sys
|
|
d=json.load(sys.stdin)
|
|
xx=d.get('xx',[])
|
|
print(json.dumps(xx, ensure_ascii=False))
|
|
" 2>/dev/null)
|
|
if [ $i -gt 0 ]; then
|
|
qjson+=','
|
|
ojson+=','
|
|
fi
|
|
qjson+="$q"
|
|
ojson+="$o"
|
|
|
|
if [ $((i % 20)) -eq 19 ]; then
|
|
echo -n "."
|
|
fi
|
|
done
|
|
qjson+=']'
|
|
ojson+=']'
|
|
|
|
# Description from HTML (fast, just first 30 lines)
|
|
desc=$(curl -sL "$url" 2>/dev/null | head -30 | grep -oP '(?<=<div class="cs">).*?(?=<hr>)' | sed 's/<[^>]*>//g' | head -1 | python3 -c "import sys; print(json.dumps(sys.stdin.read().strip()[:500], ensure_ascii=False))" 2>/dev/null || echo '""')
|
|
|
|
# Write entry
|
|
[ "$first" = true ] && first=false || echo ',' >> "$OUT"
|
|
cat >> "$OUT" << ENTRY
|
|
{
|
|
"slug": "$slug",
|
|
"name": $(echo "$name" | python3 -c "import sys; print(json.dumps(sys.stdin.read().strip(), ensure_ascii=False))"),
|
|
"category": "$cat",
|
|
"url": "$url",
|
|
"description": $desc,
|
|
"question_count": $qcount,
|
|
"questions": $qjson,
|
|
"options": $ojson
|
|
}
|
|
ENTRY
|
|
|
|
count=$((count+1))
|
|
echo " ✓ ($qcount题)"
|
|
done
|
|
|
|
echo ']' >> "$OUT"
|
|
echo "Done! $count scales saved to $OUT"
|