技術記事を一箇所で。Zenn、Qiita、はてなブログの最新記事を集約して表示する Web アプリケーションです。
- 複数サイトの記事を集約 - Zenn、Qiita、はてなブログの最新記事を一括表示
- リアルタイムフィルタリング - ソースごとに記事を絞り込み
- レスポンシブデザイン - モバイル・タブレット・デスクトップに対応
- ダークモード対応 - システム設定に応じて自動切り替え
- Python スクレイピング - RSS フィードと API を活用したデータ収集
- Next.js 16 (App Router)
- TypeScript
- Tailwind CSS 4
- React 19
- Next.js API Routes - サーバーサイド API
- Python - スクレイピングスクリプト
requests- HTTP 通信beautifulsoup4- HTML/XML パース
- Vercel - ホスティング
git clone https://github.com/yourusername/devfeed.git
cd devfeedNode.js(フロントエンド):
npm installPython(スクレイピング):
cd scripts
python3 -m venv venv
source venv/bin/activate # macOS/Linux
# または
venv\Scripts\activate # Windows
pip install -r requirements.txt
cd ..# Python仮想環境を有効化してから実行
python scripts/scraper.pyこれで data/articles.json が生成されます。
npm run devブラウザで http://localhost:3000 を開きます。
devfeed/
├── app/
│ ├── api/
│ │ └── articles/
│ │ └── route.ts # 記事取得API
│ ├── components/
│ │ └── ArticleList.tsx # 記事リスト(フィルター付き)
│ ├── globals.css
│ ├── layout.tsx
│ └── page.tsx # メインページ
├── scripts/
│ ├── scraper.py # Pythonスクレイピングスクリプト
│ ├── requirements.txt # Python依存関係
│ └── README.md # スクレイピングの詳細
├── data/
│ └── articles.json # 取得した記事データ
├── public/
├── next.config.ts
├── tailwind.config.ts
├── tsconfig.json
└── README.md
┌─────────────────────────────────────────┐
│ 1. Pythonスクレイピング(ローカル) │
│ scripts/scraper.py │
│ ↓ │
│ Zenn/Qiita/はてなブログから記事取得 │
│ ↓ │
│ data/articles.json に保存 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 2. Next.js API Route(Vercel) │
│ app/api/articles/route.ts │
│ ↓ │
│ articles.json を読み込み │
│ ↓ │
│ JSON形式でレスポンス │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 3. フロントエンド(ブラウザ) │
│ app/page.tsx │
│ ↓ │
│ /api/articles を取得 │
│ ↓ │
│ 記事を表示 │
└─────────────────────────────────────────┘
- すべて - 全記事を表示
- Zenn - Zenn の記事のみ
- Qiita - Qiita の記事のみ
- はてなブログ - はてなブログの記事のみ
各フィルターには記事数が表示されます。
- タイトル
- 説明文(最初の 200 文字)
- ソース(Zenn/Qiita/はてなブログ)
- 公開日
scripts/scraper.py の fetch_all() メソッド内の limit を変更:
zenn_articles = self.fetch_zenn_articles(limit=20) # 10 → 20scripts/scraper.py に新しいメソッドを追加し、fetch_all() で呼び出します。
記事一覧を取得します。
クエリパラメータ:
source(オプション) - フィルタリングするソース(Zenn,Qiita,はてなブログ)limit(オプション) - 取得件数の上限
例:
# すべての記事
curl http://localhost:3000/api/articles
# Zennの記事のみ
curl http://localhost:3000/api/articles?source=Zenn
# 最初の5件のみ
curl http://localhost:3000/api/articles?limit=5- Vercel にサインアップ
- GitHub リポジトリを接続
- プロジェクトをインポート
- 自動的にビルド&デプロイ
注意: data/articles.json を Git にコミットしておく必要があります。
デプロイ後に記事を更新したい場合:
# ローカルで実行
python scripts/scraper.py
# Gitにコミット&プッシュ
git add data/articles.json
git commit -m "Update articles"
git pushVercel が自動的に再デプロイします。
- GitHub Actions で定期的な自動スクレイピング
- 検索機能
- ソート機能(日付順/人気順)
- お気に入り機能(LocalStorage)
- ページネーション
- RSS 配信
MIT
⭐ このプロジェクトが気に入ったら、スターをつけてください!