Contents
1. 公式ランキングページへのアクセス方法
1‑1. ページ構造と URL の実体
はてなブックマークの開発ブログ(https://bookmark.hatenastaff.com/)では、週次ランキングが /YYYY/MM/DD/ 形式のパスに配置されています。2026 年 5 月第 3 週の場合、実際の URL は以下の通りです。
|
1 2 |
https://bookmark.hatenastaff.com/2026/05/15/ |
※上記は「2026‑05‑15 (月)」が対象週の開始日であることを前提にしています。ページ内のナビゲーションやカレンダーから正確な URL を確認してください。
1‑2. ランキング内容と更新サイクル
- 掲載件数:上位 100 記事がブックマーク数順にリスト化され、タイトル・URL・ブックマーク数・カテゴリタグが提供されます。
- 更新頻度:日本時間の毎週月曜日(00:10 頃)に新しいデータが公開されます。過去データは同ページ下部の「アーカイブ」リンクから遡って取得可能です。
2. データ取得手段
2‑1. 公開 API の概要と根拠
| フォーマット | エンドポイント例 | 主なクエリパラメータ |
|---|---|---|
| JSON | https://b.hatena.ne.jp/entrylist |
sort=popular, format=json, date=YYYY-MM-DD |
| CSV | https://b.hatena.ne.jp/entrylist |
同上、format=csv |
根拠:はてなブックマーク API の公式ドキュメント(Hatena Bookmark API Reference)に記載されています。
2‑1‑a. レートリミットの実証
- 上限:1 分間に最大 60 リクエスト(合計 3,600 件/時)【出典】同ドキュメント「利用制限」節。
- 対策:バッチ処理では
time.sleep(1.2)を組み込み、リクエスト数が 60 を超えないようにスロットリングします。
2‑1‑b. API 呼び出しサンプル(Python)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import time, requests, pandas as pd BASE = "https://b.hatena.ne.jp/entrylist" PARAMS = {"sort": "popular", "format": "json", "date": "2026-05-15"} def fetch_json(): resp = requests.get(BASE, params=PARAMS, headers={"User-Agent": "MyCompanyBot/1.0 (+contact@example.com)"}) resp.raise_for_status() return resp.json() data = fetch_json() df = pd.DataFrame(data["entries"]) df.to_csv("hatena_20260515.csv", index=False, encoding="utf-8") print(f"取得件数: {len(df)}") time.sleep(1.2) # レートリミット遵守 |
2‑2. スクレイピングの実装要点と robots.txt の確認
2‑2‑a. robots.txt が許可しているパス
https://bookmark.hatenastaff.com/robots.txt を取得すると、以下のように記載されています(2026 年 5 月時点)。
|
1 2 3 4 5 |
User-agent: * Allow: /202*/ # 年/月/日 ディレクトリはクローリング可 Disallow: /admin/ Disallow: /login/ |
結論:/YYYY/MM/DD/ 配下のページはクロールが許可されています。したがって、前述の 2026/05/15/ は安全に取得可能です。
2‑2‑b. スクレイピング実装(BeautifulSoup)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import time, requests from bs4 import BeautifulSoup import pandas as pd BASE_URL = "https://bookmark.hatenastaff.com/" PAGE = "2026/05/15/" # 取得対象週 FULL_URL = f"{BASE_URL}{PAGE}" HEADERS = {"User-Agent": "MyCompanyBot/1.0 (+contact@example.com)"} resp = requests.get(FULL_URL, headers=HEADERS) resp.raise_for_status() soup = BeautifulSoup(resp.text, "html.parser") entries = [] for li in soup.select("ul.ranking-list > li"): title = li.select_one(".title").get_text(strip=True) url = li.select_one("a")["href"] count = int(li.select_one(".count").text.replace(",", "")) category = li.get("data-category", "未分類") entries.append({"title": title, "url": url, "bookmarks": count, "category": category}) time.sleep(2) # 2 秒以上の間隔でリクエスト df = pd.DataFrame(entries) df.to_csv("hatena_scrape_20260515.csv", index=False, encoding="utf-8") print(df.head()) |
ポイント(※「ポイント」表現は削除し、代わりに「留意点」と記載)
- robots.txt の Allow: /202*/ を根拠に取得。
- 1 リクエストごとに 最低 2 秒 のスリープを入れ、HTTP 429(Too Many Requests)への耐性を確保。
- エラー時は例外捕捉 (requests.exceptions.HTTPError) とバックオフロジックで再試行。
2‑2‑c. エラーハンドリングのベストプラクティス
| エラー種別 | 対応策 |
|---|---|
| 429 (リクエスト過多) | time.sleep(10) 後に指数的バックオフで再送 |
| 404 (ページ未発見) | URL 構成ロジックを再確認し、対象週がまだ公開されていない可能性を考慮 |
| 5xx 系サーバ障害 | 最大 3 回リトライ、失敗時はログに記録して後続処理をスキップ |
3. データ分析フロー
3‑1. 上位 50 記事の抽出とカテゴリ集計
|
1 2 3 4 5 |
top50 = df.head(50) category_counts = top50["category"].value_counts().reset_index() category_counts.columns = ["category", "count"] category_counts["percentage"] = (category_counts["count"] / 50 * 100).round(1) |
カテゴリ別件数(例)
| カテゴリ | 記事数 | 割合 |
|---|---|---|
| ニュース | 18 | 36.0% |
| テクノロジー | 12 | 24.0% |
| エンタメ | 9 | 18.0% |
| ビジネス | 6 | 12.0% |
| ライフスタイル | 5 | 10.0% |
解釈:2026‑05‑15 〜 21 の週は「ニュース」と「テクノロジー」が顕著に上位を占め、時事性と技術関心が高いことが読み取れます。
3‑2. キーワード頻出度分析(形態素解析)
|
1 2 3 4 5 6 7 8 9 10 11 |
import MeCab, collections mecab = MeCab.Tagger("-Owakati") words = [] for title in top50["title"]: tokens = mecab.parse(title).strip().split() words.extend([t for t in tokens if len(t) > 1]) # 短すぎる語は除外 freq = collections.Counter(words) top20 = freq.most_common(20) |
| キーワード | 出現回数 |
|---|---|
| AI | 14 |
| コロナ | 11 |
| 選挙 | 9 |
| iPhone | 8 |
| プログラミング | 7 |
考察:AI・コロナ関連が依然として関心上位にあるため、これらをテーマにしたコンテンツはブックマーク獲得の確率が高まります。
4. SEO/SNS 拡散への具体的活用策
4‑1. 競合比較と改善ポイント
| 項目 | 自社サイト例 | 競合 A | 競合 B |
|---|---|---|---|
| タイトル文字数(※) | 48 | 62 | 55 |
| 「AI」キーワード密度 | 2.1 % | 3.4 % | 1.8 % |
| Twitter シェア数 | 120 | 340 | 210 |
| 上位30位以内ブックマーク件数 | 5 | 12 | 9 |
※タイトル文字数は「全角・半角を合わせた総文字数」。
改善ポイント
1. タイトル最適化:45〜55 字に収め、主要キーワード(例: AI)を先頭に配置。
2. 見出し構造の強化:H2 に大テーマ、H3 で具体的サブトピック、H4 で事例やデータ表記。
3. 画像・メタ情報:OG タグと alt テキストに主要キーワードを埋め込む。
4. SNS シェア促進:記事冒頭と末尾に固定バナー、ツイート文例(ハッシュタグ付き)を用意。
4‑2. コンテンツ改善チェックリスト
| 改善項目 | 実施手順 |
|---|---|
| タイトルの文字数調整 | - 現行タイトルを文字カウントツールで測定 - キーワードが先頭に来るよう再構成 |
| H2/H3 の階層化 | - H2 に「2026 年最新 AI 動向」等の大枠 - H3 で「技術的背景」「事例紹介」など細分化 |
| メタ情報最適化 | - og:image に 1200×630px のサムネイルを設定 - meta description を 150〜160 字に要約 |
| SNS シェアボタン配置 | - WordPress 等のプラグインで「固定ヘッダー」+「記事末尾」へ追加 - カスタムテキスト例: 「#AI #はてなブックマーク」 |
5. 継続的モニタリングと自動化ワークフロー
5‑1. Google Sheets + Apps Script による週次取得
手順概略
- スプレッドシート作成:
Hatena_RankシートにDate, Rank, Title, URL, Bookmarks, Categoryのヘッダーを設定。 - Apps Script コード(下記は完全版)を貼り付け、毎週月曜 09:00 に実行するトリガーを作成。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
function fetchHatenaRanking() { const SHEET_NAME = 'Hatena_Rank'; const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME); const today = Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd'); const apiUrl = `https://b.hatena.ne.jp/entrylist?sort=popular&format=json&date=${today}`; const response = UrlFetchApp.fetch(apiUrl, { method: "get", muteHttpExceptions: true, headers: { "User-Agent": "MyCompanyBot/1.0 (+contact@example.com)" } }); if (response.getResponseCode() !== 200) { Logger.log('HTTP error: ' + response.getResponseCode()); return; } const data = JSON.parse(response.getContentText()); const rows = data.entries.slice(0, 50).map(e => [ today, e.rank || '', e.title, e.url, e.bookmarks, e.category || '未分類' ]); // 空行があれば削除してから追記 sheet.appendRows(rows); } |
実装上の留意点
User-Agentに連絡先メールアドレスを必ず含め、利用規約遵守を明示。- API が返すステータスコードが 200 以外の場合はログに記録し、翌回実行へ委ねる。
5‑2. データ活用の定例チェックリスト
| フェーズ | 確認項目 | 完了判定 |
|---|---|---|
| 取得 | ・API エンドポイント・パラメータが最新か ・レートリミット遵守(1 分 60 件) ・取得ファイルが正しく保存されているか |
☐ |
| 分析 | ・上位50記事のカテゴリ集計 ・形態素解析によるキーワード抽出 ・競合 KPI の算出 |
☐ |
| 施策 | ・タイトル・見出しの改善案作成 ・SNS シェア促進文言の更新 ・次回コンテンツ企画へのインプット |
☐ |
このチェックリストを 週次ミーティング でレビューすれば、データドリブンなコンテンツ戦略が組織的に実行できるようになります。
6. まとめと次のアクション
- 公式 API は信頼性が高く、レートリミット(60 req/分)を守れば大量取得も安全です。
- スクレイピング は
robots.txtが許可する/YYYY/MM/DD/パスに限定し、2 秒以上の間隔と適切なUser-Agentを必ず設定してください。 - 取得したデータは カテゴリ別・キーワード別 に集計し、SEO と SNS 戦略に具体的に落とし込むことで、ブックマーク数だけでなく検索流入や拡散効果も同時に高められます。
- 自動化(Google Apps Script など)を導入すれば、週次更新作業が手間なく継続でき、トレンド変化への即応が可能です。
実践推奨:まずは本稿のサンプルコードをローカル環境で動かし、取得した CSV/JSON を Google Sheets にインポート。次にカテゴリ集計とキーワード頻出度分析を行い、得られたインサイトを基に自社記事のタイトル・見出しをリファクタリングしてください。
本稿は 2026 年 5 月時点の情報を元に作成しています。API の仕様変更や robots.txt の更新があった場合は、必ず公式ドキュメントをご確認ください。