web-scraping は何をしますか?
アンチボット回避、コンテンツ抽出、非公開API、及びポイズンピル検出機能を備えたWebスクレイピング。Webサイトからのコンテンツ抽出、ペイウォールの処理、スクレイピングカスケードの実装、ソーシャルメディアの処理に使用します。requests、trafilatura、ステルスモードのPlaywright、yt-dlp、instaloaderパターンをカバーします。
機能
- アンチボットバイパス: PlaywrightのステルスモードやCookie/セッション管理を使用してCloudflare、DataDomeなどのボット対策を回避します。
- コンテンツ抽出: trafilaturaやBeautifulSoupを使用して、記事本文や主要コンテンツをノイズなく抽出します。
- 非公開API: ブラウザのネットワークアクティビティを監視することで、Webアプリケーションの内部APIエンドポイントを発見します。
- ポイズンピル検出: スクレイピングされたデータ内の偽のエントリ(例:隠しフィールド、ダミーデータ)を識別します。
- カスケードロジック: 堅牢な抽出のために複数の戦略を順番に試行します。
- ソーシャルメディア: yt-dlp(動画)およびinstaloader(Instagram)のラッパー。
使用方法
このスキルは、特定のタスクのための関数を提供します。以下のように使用します:
from skills.web_scraping import extract_content, scrape_with_playwright
# 記事の内容を抽出
content = extract_content("https://example.com/article")
# 動的なページに対してPlaywrightを使用
page_data = scrape_with_playwright("https://example.com/spa-page")
環境変数
SKILL_WEB_SCRAPING_PROXY: スクレイピングリクエストに使用するプロキシURL(例:http://user:pass@proxy:8080)。SKILL_WEB_SCRAPING_TIMEOUT: 各スクレイピング試行のデフォルトタイムアウト(秒)。デフォルトは30。SKILL_WEB_SCRAPING_USER_AGENT: カスタムユーザーエージェント文字列。
依存関係
- 必須:
requests,beautifulsoup4,lxml - オプション:
playwright(ステルスモード有効),trafilatura,yt-dlp,instaloader
インストール:
pip install requests beautifulsoup4 lxml
# オプション
git clone https://github.com/jamditis/web-scraping.git
cd web-scraping && pip install -e .
例
基本的なコンテンツ抽出
from skills.web_scraping import extract_content
url = "https://en.wikipedia.org/wiki/Web_scraping"
result = extract_content(url)
if result["success"]:
print(f"タイトル: {result['title']}")
print(f"本文(最初の500文字): {result['text'][:500]}")
else:
print(f"エラー: {result['error']}")
Playwrightを使用したSPAページのスクレイピング
from skills.web_scraping import scrape_with_playwright
# SPAあるいは重いJavaScriptを必要とするページ向け
data = scrape_with_playwright(
url="https://example.com/spa",
wait_for_selector=".main-content",
timeout=45000
)
カスケードスクレイピング(高度)
このスキルは、最初の方法が失敗した場合に自動的にフォールバックします:
requests+trafilatura(高速、静的なページ)Playwright+ ステルスモード(動的なページ、アンチボット対策)- 非公開API発見(XHR/Fetchリクエストの解析)
yt-dlpまたはinstaloader(ソーシャルメディアプラットフォーム)
ポイズンピルの検出
from skills.web_scraping import detect_poison_pills
data = "..." # スクレイピングしたHTML
pills = detect_poison_pills(data)
if pills:
print(f"警告: 検出されたポイズンピル: {pills}")
トラブルシューティング
- ブロックされたリクエスト: プロキシ (
SKILL_WEB_SCRAPING_PROXY) を設定するか、scrape_with_playwrightを使用してください。 - タイムアウト:
SKILL_WEB_SCRAPING_TIMEOUTを増やすか、timeoutパラメータを渡してください。 - 不足しているパッケージ: 欠けているオプションの依存関係は、実行時に無視されます。