カクヨム(https://kakuyomu.jp/)の月間・週間ランキングから作品情報を取得するGoプログラムです。
カクヨムのランキングページから以下の情報を取得します:
- ランキング順位
- タイトル
- サブタイトル(キャッチコピー)
- 作品URL
- あらすじ
- 更新日時
- スター数
- タグ一覧
- 文字数
- 著者名
- 著者ページURL
- ジャンル
- 連載状況
- 話数情報
- 月間ランキング (monthly)
- 週間ランキング (weekly)
- all: 総合
- fantasy: 異世界ファンタジー
- action: 現代ファンタジー
- sf: SF
- love_story: 恋愛
- romance: ラブコメ
- drama: 現代ドラマ
- horror: ホラー
- mystery: ミステリー
- nonfiction: エッセイ・ノンフィクション
- history: 歴史・時代・伝奇
- criticism: 創作論・評論
- others: 詩・童話・その他
- Go 1.16以上
# カレントディレクトリにバイナリを生成
go build
# 実行
./foo --format json# $GOPATH/binにインストール
go install
# 実行($GOPATH/binにパスが通っている場合)
foo --format jsongo run ./出力例:
===== 月間ランキング (最初の3件) =====
【順位: 1】
タイトル: 転生先が無法都市だったけど、無口な修理屋やってたら何故か怖がられてる件
サブタイトル: ギャングも企業も警察も──この無口な修理屋には頭が上がらない。
著者: 鳥獣跋扈
URL: https://kakuyomu.jp/works/16818792440656241433
ジャンル: SF
状況: 連載中 44話
文字数: 130,030文字
更新日時: 2025年11月2日 20:00 更新
スター数: ★14,772
タグ: 転生, 現代風未来, 修理屋, ギャング, クラフト&スキル, 裏社会
あらすじ: 目覚めたら、そこはゲームみたいな"現代風異世界"──だけど、やたらと治安が悪すぎた。
...
go run ./ --format jsonJSON出力をファイルに保存:
go run ./ --format json > ranking.json 2>/dev/nullJSON形式の例:
{
"metadata": {
"genre": "fantasy",
"period": "weekly",
"pages": 2,
"format": "json",
"limit": 3
},
"data": [
{
"rank": "1",
"title": "転生先が無法都市だったけど、無口な修理屋やってたら何故か怖がられてる件",
"subtitle": "ギャングも企業も警察も──この無口な修理屋には頭が上がらない。",
"url": "https://kakuyomu.jp/works/16818792440656241433",
"synopsis": "目覚めたら、そこはゲームみたいな...",
"updated_at": "2025年11月2日 20:00 更新",
"stars": "★14,772",
"tags": ["転生", "現代風未来", "修理屋", "ギャング", "クラフト&スキル", "裏社会"],
"char_count": "130,030文字",
"author": "鳥獣跋扈",
"author_url": "https://kakuyomu.jp/users/tyoujyuubakko",
"genre": "SF",
"status": "連載中",
"episode_info": "44話"
}
]
}go build -o kakuyomu-scraper
./kakuyomu-scraper --format json| オプション | デフォルト | 説明 |
|---|---|---|
--format |
text |
出力形式。textまたはjsonを指定 |
--pages |
1 |
取得するページ数(各ページ約100件) |
--genre |
all |
ジャンル。all, fantasy, action, sf, love_story, romance, drama, horror, mystery, nonfiction, history, criticism, others |
--period |
monthly |
期間。daily, weekly, monthly, yearly, entire |
--limit |
3 |
テキスト形式での表示件数(0で全件表示、JSON形式では無視される) |
# 月間ランキングを3件表示(デフォルト)
go run ./
# 週間ランキングを10件表示
go run ./ --period weekly --limit 10
# 異世界ファンタジーの日間ランキングを取得
go run ./ --genre fantasy --period daily
# SFジャンルの年間ランキング2ページ分を全件表示
go run ./ --genre sf --period yearly --pages 2 --limit 0
# ミステリージャンルの月間ランキング3ページ分をJSON形式で出力
go run ./ --genre mystery --period monthly --pages 3 --format json > mystery_ranking.jsonテストやデバッグを行う際は、必ずローカルにダウンロードしたHTMLファイルを使用してください。
カクヨムのサービスに負荷を与えないため、以下の手順を遵守してください:
# 通常のテスト実行(testdata/のHTMLファイルを使用)
go test -v
# テストデータの更新(実際にHTTPリクエストを発行)
go test -update -vtestdata/には以下のゴールデンファイルが含まれています:
weekly.html: 週間ランキングmonthly.html: 月間ランキングmonthly_page2.html: 月間ランキング2ページ目
# 総合ランキング Page 1
curl -s "https://kakuyomu.jp/rankings/all/monthly?work_variation=all" \
-H "User-Agent: Mozilla/5.0" > monthly.html
# 総合ランキング Page 2
curl -s "https://kakuyomu.jp/rankings/all/monthly?work_variation=all&page=2" \
-H "User-Agent: Mozilla/5.0" > monthly_page2.html
# 異世界ファンタジーのランキング
curl -s "https://kakuyomu.jp/rankings/fantasy/monthly?work_variation=all" \
-H "User-Agent: Mozilla/5.0" > genre_fantasy.html
# SFのランキング
curl -s "https://kakuyomu.jp/rankings/sf/monthly?work_variation=all" \
-H "User-Agent: Mozilla/5.0" > genre_sf.htmlジャンルURLパターン: https://kakuyomu.jp/rankings/{genre}/{period}?work_variation=all
{genre}: all, fantasy, action, sf, love_story, romance, drama, horror, mystery, nonfiction, history, criticism, others{period}: daily, weekly, monthly, yearly, entire
ダウンロードしたHTMLファイルを使って、HTMLセレクタの確認やデバッグを行います:
# HTMLの構造を確認
grep -A 50 "widget-work" monthly.html | head -100
# 特定の要素を抽出して確認
grep "widget-workCard-title" monthly.html// test_local.go
func parseLocalHTML(filename string) []RankingItem {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close()
doc, err := goquery.NewDocumentFromReader(file)
if err != nil {
log.Fatal(err)
}
// パース処理...
}
func main() {
items := parseLocalHTML("monthly.html")
fmt.Printf("取得件数: %d\n", len(items))
// 結果の確認
}ローカルHTMLで正しく動作することを確認した後、実際のHTTPリクエストに対応します。
1. HTMLダウンロード (curl)
↓
2. ローカルファイルでパース処理を実装・テスト
↓
3. 動作確認・デバッグ (何度でもOK)
↓
4. 本番コードに統合
↓
5. 最終確認 (実際のHTTPリクエスト 1回のみ)
この手法により、開発・デバッグ中に何度もサイトにアクセスすることなく、サービスへの負荷を最小限に抑えながら開発できます。
- Rate Limiting: リクエスト間隔は1秒に設定されています
- レスポンスヘッダーに
Retry-Afterがある場合はそれに従います - ない場合はデフォルトの1秒待機します
- レスポンスヘッダーに
- ページネーション: 複数ページ取得時は各ページ間で適切に待機します
- カクヨムの利用規約を遵守してご利用ください
- スクレイピングの頻度は適切に保ってください
- 開発・テスト時は必ずローカルHTMLファイルを使用してください
プロジェクトには、HTMLパース機能のテストが含まれています。
# テスト実行(ローカルのtestdata/を使用)
go test -v
# testdata/のHTMLファイルを更新(実際にHTTPリクエストを発行)
go test -update -v注意: -updateフラグを使用すると、実際にカクヨムにアクセスします。通常のテストではローカルのHTMLファイルのみを使用します。
このプロジェクトはサンプルコードとして提供されています。