An open API service indexing awesome lists of open source software.

https://github.com/helloruru/all-can-grab

萬用公開網頁擷取器 | Universal public web scraper with four-layer fallback strategy for AI agents
https://github.com/helloruru/all-can-grab

claude-code facebook notion ptt python skill web-scraper youtube

Last synced: 14 days ago
JSON representation

萬用公開網頁擷取器 | Universal public web scraper with four-layer fallback strategy for AI agents

Awesome Lists containing this project

README

          

All Can Grab


リンクを貼ったら、AI が「アクセスできません」と返す?

そのページ、実は公開されている。AI に鍵がないだけ。

このスクリプトが、その鍵束。


MIT License
Python 3.8+
Minimal Dependencies
Claude Code Skill


English  |  繁體中文  |  日本語

---

## 課題

Facebook のリンクを AI に貼った。

返ってきたのは:*「すみません、このページにアクセスできません」*

……その投稿、公開されてるのに。

仕方なくブラウザを開いて、コピーして、貼り直す。毎回これ。

正直、「コピペ」だけで一日の半分が消える。

AI がやる気がないわけじゃない。プラットフォームごとに鍵が違うのに、合う鍵を持っていないだけ。

## 解決策

Python スクリプト1本。4層フォールバック。AI に正しい鍵を渡す。

| 機能 | 説明 |
|------|------|
| スマート UA 切替 | Facebook/Threads は Googlebot UA、YouTube/GitHub は通常 UA |
| TLS フィンガープリント回避 | curl_cffi で Cloudflare 保護サイト(Medium など)に対応 |
| 有料 API フォールバック | Apify 連携、完全ロックされたプラットフォーム(Instagram など)用 |
| ブラウザレンダリング | ヘッドレス Playwright、JavaScript が必要なページ用 |
| 構造化出力 | 統一 JSON スキーマ、status・source・blocker フィールド付き |
| 正直な報告 | 成功を偽らない——なぜ失敗したか、次に何をすべきか明確に報告 |

## :package: インストール

```bash
# ステップ 1:コア依存パッケージをインストール
pip install requests beautifulsoup4

# ステップ 2:オプションのフォールバックをインストール(多いほど取得範囲が広がる)
pip install curl_cffi # TLS フィンガープリント回避(Cloudflare)
pip install playwright && playwright install chromium # ブラウザレンダリング

# ステップ 3:試してみる
python grab.py "https://www.facebook.com/share/p/xxxxx/"
```

## :brain: 仕組み

4層戦略、速いものから順に:

1. **素のHTTP**(HTTP request)——ブラウザを開かず、適切な User-Agent で直接 HTML を取得。ほとんどの公開ページはこれで十分。
2. **TLS フィンガープリント**(curl_cffi)——実際のブラウザの TLS フィンガープリントを模倣。Cloudflare 保護(Medium など)に対応。
3. **有料 API**(Apify)——プラットフォームが無料アクセスを完全にブロックした場合の最終手段(Instagram 単体投稿など)。
4. **ブラウザレンダリング**(Playwright)——上記すべてが失敗した場合、ヘッドレスブラウザで JavaScript をレンダリング。

ログインなし。Cookie 保存なし。ログインウォール回避なし。公開コンテンツのみ。

## :detective: プラットフォーム対応

| プラットフォーム | 素の取得戦略 | フォールバック | ステータス | 備考 |
|-----------------|-------------|---------------|-----------|------|
| Facebook | Googlebot UA | Playwright | Tested | 公開投稿・ページ安定;OG URL 検証含む |
| Threads | Googlebot UA | Playwright | Tested | |
| YouTube | Normal UA | - | Tested | タイトルと説明のみ;動画コンテンツは未対応 |
| GitHub | Normal UA | - | Tested | |
| PTT | Normal UA + over18 cookie | Playwright | Tested | over18 cookie 自動設定 |
| 104 Job Bank | Normal UA | - | Limited | 公開求人ページは取得可能;**プロフィール共有ページ(pda.104.com.tw)は Vue SPA で取得不可** |
| Notion(公開ページ) | Googlebot UA | - | Tested | 公開 Notion ページは Googlebot に完全なコンテンツをレンダリング |
| Astro / SSG サイト | Normal UA | - | Tested | サーバーレンダリング HTML、最も安定 |
| LinkedIn | Googlebot UA | - | Not supported | 全メソッドで 999 エラー;取得可能なコンテンツなし |
| Instagram | - | - | Partial | プロフィール(ユーザー名/フォロワー数)のみ;**単体投稿の無料手段なし** |
| X / Twitter | Normal UA | Playwright | Limited | ログイン要求が増加中;公開ツイートも取得不保証 |
| Medium | Normal UA | curl_cffi -> Playwright | Limited | Cloudflare + SPA 二重防御 |
| Dcard | Normal UA | Playwright | Limited | 一部投稿はログイン必要;匿名板はほぼロック |
| その他 | Googlebot UA | Playwright | Best effort | |

### ステータス定義

- **Tested** ——安定動作、公開コンテンツはほぼ取得可能
- **Partial** ——一部機能は動作するが、コア機能に制限あり
- **Limited** ——プラットフォーム防御が厳しく、部分情報(タイトル・要約)は取得可能。失敗時は原因と提案を報告
- **Not supported** ——プラットフォームが全スクレイピング手法を積極的にブロック;取得可能なコンテンツなし
- **Best effort** ——専用戦略なし、汎用ロジックで最善を尽くす

### アクセス不可能なプラットフォーム

| プラットフォーム | 理由 |
|-----------------|------|
| LINE グループ / 投稿 | クローズドエコシステム、公開 URL なし |
| 小紅書(RED) | クローズド + 地域制限 |
| 有料コンテンツ | サブスクリプション必要;ペイウォール回避はしない |

### Instagram 単体投稿(2026-03-13 時点)

**無料で信頼できる手段なし。** Instagram は 2024 年末から未認証アクセスを完全ブロック。以下の方法はすべて失敗:Googlebot UA、通常/モバイル UA、`/embed/` エンドポイント、oEmbed API、未認証 Playwright、Google cache、IG 内部 API。

| 代替手段 | 説明 | 費用 |
|----------|------|------|
| 手動確認 | ユーザー自身が IG にログインし、スクリーンショットやテキストを提供 | 無料 |
| 公式埋め込み | Meta oEmbed で表示埋め込み可能(完全データ抽出は不可) | 無料 |
| Apify 有料フォールバック | grab.py に内蔵;`APIFY_TOKEN` 設定で有効化 | 従量課金 |

```bash
# トークン設定時のみ IG 単体投稿で Apify を使用;未設定なら他の機能に影響なし
export APIFY_TOKEN="apify_api_xxxxx"
```

## :open_file_folder: ファイル構成

```text
all-can-grab/
grab.py # メインスクリプト
SKILL.md # スキル説明(Claude Code 統合用)
README.md # 英語版ドキュメント
README.zh-TW.md # 繁体字中国語ドキュメント
README.ja.md # 日本語ドキュメント
LICENSE # MIT
```

**Claude Code スキルとして:** `~/.claude/skills/learned/all-can-grab/` に配置すると、Claude Code が自動判断して使用。
**スタンドアロン:** 任意のディレクトリで `python grab.py ` を実行。

## :wrench: カスタマイズ

- **プラットフォーム追加**:`grab.py` のプラットフォーム設定に戦略エントリを追加
- **カスタムパーサー**:`clinic_slots` フィールドがドメイン固有のパーサー追加方法を実演(歯科予約枠の例、コア機能ではない)
- **環境変数**:`APIFY_TOKEN` を設定して Instagram 有料フォールバックを有効化

## :bulb: なぜこう作ったか

**ブラウザを開かなくていいなら、開かない。**
HTTP で済むなら Playwright は不要。時間もリソースも節約。

**サイトごとに鍵を分ける。**
Facebook には Googlebot UA、PTT には over18 cookie。設定は1サイト1エントリ。追加は1行。

**取れなかったら、正直に言う。**
成功を偽らない。何が問題か、次に何をすべきか報告する。

**公開コンテンツだけ。**
ログインなし。パスワード保存なし。ペイウォール回避なし。見えるものだけ取る。

### 出力スキーマ

```json
{
"summary": "3~5文の要約",
"items": [
{
"title": "投稿タイトル",
"snippet": "コンテンツ抜粋...",
"datetime_str": "2026-03-13",
"author": "著者名",
"url": "https://..."
}
],
"clinic_slots": [],
"status": "success",
"blocker": "",
"raw_text": "完全な原文...",
"source": "http-googlebot"
}
```

| フィールド | 説明 |
|-----------|------|
| `status` | `success` / `partial` / `failed` |
| `source` | 使用した戦略:`http-googlebot` / `http-normal` / `curl_cffi` / `playwright` |
| `blocker` | 失敗原因(次のステップの判断用) |
| `clinic_slots` | 拡張例:カスタムパーサーのデモ(コア機能ではない) |

## 動作要件

- Python 3.8+
- `requests` + `beautifulsoup4`(必須)
- `curl_cffi`(オプション——Cloudflare 回避)
- `playwright`(オプション——ブラウザレンダリング)

## ライセンス

[MIT](LICENSE)

---


ドアは開いた。取りに行こう。