web-scraper
Web Scraper Pro
Intelligent web page fetcher that converts any URL into clean, readable Markdown content. Uses a multi-layer fallback strategy to ensure maximum compatibility.
๐ฐ Pricing: 0.001 USDT per web fetch
โ ๏ธ CRITICAL: Payment Integration (MUST READ FIRST)
This skill is monetized via SkillPay. Before fetching ANY URL, you MUST execute the payment verification step.
Payment Configuration
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SkillPay Billing Integration
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
import requests
BILLING_API_URL = 'https://skillpay.me'
BILLING_API_KEY = 'sk_d6d26f291dafc43acc8c2b6215b87cbc9b19c7d093aebdb2deeba42a3a0fea4b'
SKILL_ID = '4fb2d57e-e583-4ca3-8170-52df37a6572b'
HEADERS = {'X-API-Key': BILLING_API_KEY, 'Content-Type': 'application/json'}
Billing API Functions (MANDATORY)
โ ๏ธ THIS CODE MUST BE EXECUTED BEFORE ANY WEB FETCH:
import requests
import os
BILLING_API_URL = 'https://skillpay.me'
BILLING_API_KEY = 'sk_d6d26f291dafc43acc8c2b6215b87cbc9b19c7d093aebdb2deeba42a3a0fea4b'
SKILL_ID = '4fb2d57e-e583-4ca3-8170-52df37a6572b'
HEADERS = {'X-API-Key': BILLING_API_KEY, 'Content-Type': 'application/json'}
# โ Check balance / ๆฅไฝ้ข
def check_balance(user_id: str) -> float:
resp = requests.get(
f'{BILLING_API_URL}/api/v1/billing/balance',
params={'user_id': user_id},
headers=HEADERS
)
return resp.json()['balance'] # USDT amount
# โก Charge per call / ๆฏๆฌก่ฐ็จๆฃ่ดน
def charge_user(user_id: str) -> dict:
resp = requests.post(
f'{BILLING_API_URL}/api/v1/billing/charge',
headers=HEADERS,
json={
'user_id': user_id,
'skill_id': SKILL_ID,
'amount': 0.001, # USDT per call
}
)
data = resp.json()
if data['success']:
return {'ok': True, 'balance': data['balance']}
# Insufficient balance โ auto returns BNB Chain USDT payment link
return {'ok': False, 'balance': data['balance'], 'payment_url': data.get('payment_url')}
# โข Generate payment link / ็ๆๅ
ๅผ้พๆฅ
def get_payment_link(user_id: str, amount: float) -> str:
resp = requests.post(
f'{BILLING_API_URL}/api/v1/billing/payment-link',
headers=HEADERS,
json={'user_id': user_id, 'amount': amount}
)
return resp.json()['payment_url'] # BNB Chain USDT
USER_ID = os.environ.get("SKILLPAY_USER_ID", "anonymous_user")
Payment Workflow Integration
# ========================================
# STEP 0: CHARGE USER (MANDATORY)
# ========================================
# This must be the FIRST step before ANY web fetch
charge_result = charge_user(USER_ID)
if not charge_result['ok']:
print(f"""
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ณ INSUFFICIENT BALANCE โ
โ โ
โ This web fetch costs 0.001 USDT. โ
โ Current balance: {charge_result['balance']:<41}โ
โ โ
โ Please top up at: โ
โ {charge_result['payment_url']:<56}โ
โ โ
โ After payment, please retry your request. โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
""")
raise SystemExit("Insufficient balance for web fetch")
print(f"โ
Charged 0.001 USDT. Remaining balance: {charge_result['balance']} USDT")
ๅคๅฑๆๅ็ญ็ฅ (Multi-Layer Fetch Strategy)
ๆฌ skill ้็จๆบ่ฝๅคๅฑๅ้็ญ็ฅ๏ผ็กฎไฟๆๅคงๅ ผๅฎนๆง๏ผ
| ๅฑ็บง | ๆๅก | URL ๅ็ผ | ็น็น | ้็จๅบๆฏ |
|---|---|---|---|---|
| Layer 1 | markdown.new | https://markdown.new/ |
Cloudflare ๅ็๏ผไธๅฑๅ้๏ผๆๅฟซ | ๅคง้จๅ็ฝ็ซ๏ผ้ฆ้๏ผ |
| Layer 2 | defuddle.md | https://defuddle.md/ |
ๅผๆบ่ฝป้๏ผๆฏๆ YAML frontmatter | ้ Cloudflare ็ซ็น |
| Layer 3 | Jina Reader | https://r.jina.ai/ |
AI ้ฉฑๅจ๏ผๅ ๅฎนๆๅ็ฒพๅ | ๅคๆ้กต้ข |
| Layer 4 | Scrapling | Python ๅบ | ่ช้ๅบ็ฌ่ซ๏ผๅๅ็ฌ่ฝๅๅผบ | ๆๅๅ ๅบ |
Layer 1: markdown.new๏ผ้ฆ้๏ผๆๅฟซ๏ผ
Cloudflare ้ฉฑๅจ็ URLโMarkdown ่ฝฌๆขๆๅก๏ผๅ ็ฝฎไธๅฑๅ้๏ผ
- ๅ็ Markdown:
Accept: text/markdownๅ ๅฎนๅๅ - Workers AI: HTMLโMarkdown AI ่ฝฌๆข
- ๆต่งๅจๆธฒๆ: ๆ ๅคดๆต่งๅจๅค็ JS ้ๅบฆ้กต้ข
import requests
def fetch_via_markdown_new(url: str, method: str = "auto", retain_images: bool = True) -> str:
"""
Layer 1: ไฝฟ็จ markdown.new ๆๅ็ฝ้กต
Args:
url: ็ฎๆ ็ฝ้กต URL
method: ่ฝฌๆขๆนๆณ - "auto" | "ai" | "browser"
retain_images: ๆฏๅฆไฟ็ๅพ็้พๆฅ
Returns:
str: Markdown ๆ ผๅผ็็ฝ้กตๅ
ๅฎน
"""
api_url = "https://markdown.new/"
try:
response = requests.post(
api_url,
headers={"Content-Type": "application/json"},
json={
"url": url,
"method": method,
"retain_images": retain_images
},
timeout=60
)
if response.status_code == 200:
token_count = response.headers.get("x-markdown-tokens", "unknown")
print(f"โ
[markdown.new] ๆๅๆๅ (tokens: {token_count})")
return response.text
elif response.status_code == 429:
print("โ ๏ธ [markdown.new] ้็้ๅถ๏ผๅๆขๅฐไธไธๅฑ...")
return None
else:
print(f"โ ๏ธ [markdown.new] ่ฟๅ็ถๆ็ {response.status_code}๏ผๅๆขๅฐไธไธๅฑ...")
return None
except requests.exceptions.RequestException as e:
print(f"โ ๏ธ [markdown.new] ่ฏทๆฑๅคฑ่ดฅ: {e}๏ผๅๆขๅฐไธไธๅฑ...")
return None
ๆฏๆ็ๆฅ่ฏขๅๆฐ:
method=auto|ai|browser- ๆๅฎ่ฝฌๆขๆนๆณretain_images=true|false- ๆฏๅฆไฟ็ๅพ็- ้็้ๅถ: ๆฏ IP ๆฏๅคฉ 500 ๆฌก่ฏทๆฑ
Layer 2: defuddle.md๏ผๅค้ๆนๆก๏ผ
ๅผๆบ็็ฝ้กตโMarkdown ๆๅๆๅก๏ผ็ฑ Obsidian Web Clipper ๅๅปบ่ ๅผๅใ
def fetch_via_defuddle(url: str) -> str:
"""
Layer 2: ไฝฟ็จ defuddle.md ๆๅ็ฝ้กต
Args:
url: ็ฎๆ ็ฝ้กต URL๏ผไธๅซ https:// ๅ็ผไบฆๅฏ๏ผ
Returns:
str: ๅธฆๆ YAML frontmatter ็ Markdown ๅ
ๅฎน
"""
# defuddle ๆฅๅ URL ่ทฏๅพ็ดๆฅๆผๆฅ
clean_url = url.replace("https://", "").replace("http://", "")
api_url = f"https://defuddle.md/{clean_url}"
try:
response = requests.get(api_url, timeout=60)
if response.status_code == 200 and len(response.text.strip()) > 50:
print(f"โ
[defuddle.md] ๆๅๆๅ")
return response.text
else:
print(f"โ ๏ธ [defuddle.md] ๅ
ๅฎนไธบ็ฉบๆๅคฑ่ดฅ (status: {response.status_code})๏ผๅๆขๅฐไธไธๅฑ...")
return None
except requests.exceptions.RequestException as e:
print(f"โ ๏ธ [defuddle.md] ่ฏทๆฑๅคฑ่ดฅ: {e}๏ผๅๆขๅฐไธไธๅฑ...")
return None
Layer 3: Jina Reader๏ผAI ๅ ๅฎนๆๅ๏ผ
Jina AI ็้ ่ฏปๅจๆๅก๏ผๆ ้ฟๅค็ๅคๆ้กต้ขใ
def fetch_via_jina(url: str) -> str:
"""
Layer 3: ไฝฟ็จ Jina Reader ๆๅ็ฝ้กต
Args:
url: ็ฎๆ ็ฝ้กตๅฎๆด URL
Returns:
str: ๆๅ็ไธป่ฆๆๆฌๅ
ๅฎน
"""
api_url = f"https://r.jina.ai/{url}"
try:
response = requests.get(
api_url,
headers={"Accept": "text/markdown"},
timeout=60
)
if response.status_code == 200 and len(response.text.strip()) > 50:
print(f"โ
[Jina Reader] ๆๅๆๅ")
return response.text
else:
print(f"โ ๏ธ [Jina Reader] ๅ
ๅฎนไธบ็ฉบๆๅคฑ่ดฅ (status: {response.status_code})๏ผๅๆขๅฐไธไธๅฑ...")
return None
except requests.exceptions.RequestException as e:
print(f"โ ๏ธ [Jina Reader] ่ฏทๆฑๅคฑ่ดฅ: {e}๏ผๅๆขๅฐไธไธๅฑ...")
return None
้ขๅคๅ่ฝ: Jina ่ฟๆฏๆๆ็ดขๆจกๅผ https://s.jina.ai/YOUR_SEARCH_QUERY
Layer 4: Scrapling๏ผ็ปๆๅ ๅบ๏ผๅๅ็ฌ๏ผ
ๅผบๅคง็่ช้ๅบ็ฌ่ซๆกๆถ๏ผๅฏ็ป่ฟ Cloudflare Turnstile ็ญๅ็ฌๆบๅถใ
# ๅฎ่ฃ
Scrapling
pip install scrapling
# ๅฆ้ๆต่งๅจๅ่ฝ๏ผๅๅ็ฌ๏ผ
pip install "scrapling[fetchers]"
scrapling install
def fetch_via_scrapling(url: str, use_stealth: bool = False) -> str:
"""
Layer 4: ไฝฟ็จ Scrapling ๆๅ็ฝ้กต๏ผ็ปๆๅ
ๅบๆนๆก๏ผ
Args:
url: ็ฎๆ ็ฝ้กต URL
use_stealth: ๆฏๅฆไฝฟ็จ้่บซๆจกๅผ๏ผ็ป่ฟ Cloudflare ็ญ๏ผ
Returns:
str: ๆๅ็็ฝ้กตๆๆฌๅ
ๅฎน
"""
try:
if use_stealth:
from scrapling.fetchers import StealthyFetcher
page = StealthyFetcher.fetch(url)
else:
from scrapling.fetchers import Fetcher
page = Fetcher.get(url)
if page and page.status == 200:
# ๆๅไธป่ฆๆๆฌๅ
ๅฎน
# ็งป้ค่ๆฌๅๆ ทๅผๆ ็ญพ
for tag in page.css('script, style, nav, footer, header'):
tag.remove()
# ่ทๅไธป่ฆๅ
ๅฎนๅบๅ
main_content = (
page.css('article') or
page.css('main') or
page.css('.content, .post, .article, #content') or
page.css('body')
)
if main_content:
text = main_content[0].text_content
print(f"โ
[Scrapling{'(Stealth)' if use_stealth else ''}] ๆๅๆๅ")
return text
print(f"โ ๏ธ [Scrapling] ๆๅๅคฑ่ดฅๆๅ
ๅฎนไธบ็ฉบ")
return None
except ImportError:
print("โ ๏ธ [Scrapling] ๆชๅฎ่ฃ
๏ผ่ฏท่ฟ่ก: pip install scrapling")
return None
except Exception as e:
print(f"โ ๏ธ [Scrapling] ๆๅๅคฑ่ดฅ: {e}")
return None
Workflow
Phase 0: Payment Verification (MANDATORY - DO NOT SKIP)
โ ๏ธ CRITICAL: This phase MUST be completed BEFORE any other phase. DO NOT proceed without payment verification.
- Execute payment verification code (see Payment Verification Code section above)
- If payment fails: Return the payment URL to user and STOP
- If payment succeeds: Proceed to Phase 1
Phase 1: URL Analysis & Strategy Selection (MANDATORY)
ๅฝ็จๆทๆไพ้่ฆๆๅ็ URL ๆถ๏ผ
-
ๆฅๆถ URL: ็จๆทๆไพ็ฎๆ ็ฝๅ
-
ๅๆ URL ็นๅพ: ๅคๆญ็ฝ็ซ็ฑปๅๅๆไฝณๆๅ็ญ็ฅ
URL ็นๅพ ๆจ่็ญ็ฅ ๆฎ้็ฝ้กต/ๅๅฎข/ๆๆกฃ Layer 1 (markdown.new) โ ่ชๅจๅ้ GitHub/ๆๆฏๆๆกฃ Layer 1 (markdown.new) โ Layer 3 (Jina) ้่ฆ็ปๅฝ/ไป่ดนๅข ๆ็คบ็จๆท้่ฆ่ฎค่ฏ๏ผๆ ๆณ่ชๅจๆๅ JavaScript ้ๅบฆๆธฒๆ (SPA) Layer 1 (markdown.new, method=browser) โ Layer 4 (Scrapling) ๅ็ฌไธฅๆ ผ็็ฝ็ซ Layer 4 (Scrapling, stealth mode) -
ๅ็ฅ็จๆท่ดน็จ: "ๆฌๆฌกๆๅๅฐๆถๅ 0.001 USDT"
Phase 2: Execute Fetch (WITH PAYMENT)
โ ๏ธ IMPORTANT: Execute payment verification BEFORE fetching!
ไฝฟ็จไปฅไธๆบ่ฝๆๅๅฝๆฐ๏ผ่ชๅจๆๅฑ็บงๅ้๏ผ
import requests
import os
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# STEP 0: SKILLPAY BILLING (MANDATORY)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
BILLING_API_URL = 'https://skillpay.me'
BILLING_API_KEY = 'sk_d6d26f291dafc43acc8c2b6215b87cbc9b19c7d093aebdb2deeba42a3a0fea4b'
SKILL_ID = '4fb2d57e-e583-4ca3-8170-52df37a6572b'
HEADERS = {'X-API-Key': BILLING_API_KEY, 'Content-Type': 'application/json'}
def charge_user(user_id: str) -> dict:
resp = requests.post(
f'{BILLING_API_URL}/api/v1/billing/charge',
headers=HEADERS,
json={'user_id': user_id, 'skill_id': SKILL_ID, 'amount': 0.001}
)
data = resp.json()
if data['success']:
return {'ok': True, 'balance': data['balance']}
return {'ok': False, 'balance': data['balance'], 'payment_url': data.get('payment_url')}
USER_ID = os.environ.get("SKILLPAY_USER_ID", "anonymous_user")
charge_result = charge_user(USER_ID)
if not charge_result['ok']:
print(f"""
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ณ INSUFFICIENT BALANCE โ
โ โ
โ This web fetch costs 0.001 USDT. โ
โ Current balance: {charge_result['balance']:<41}โ
โ โ
โ Please top up at (BNB Chain USDT): โ
โ {charge_result['payment_url']:<56}โ
โ โ
โ After payment, please retry your request. โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
""")
raise SystemExit("Insufficient balance for web fetch")
print(f"โ
Charged 0.001 USDT. Remaining balance: {charge_result['balance']} USDT")
# ========================================
# STEP 1: INTELLIGENT MULTI-LAYER FETCH
# ========================================
def smart_fetch(url: str, prefer_method: str = "auto", retain_images: bool = True) -> dict:
"""
ๆบ่ฝๅคๅฑๆๅ๏ผ่ชๅจๆไผๅ
็บงๅฐ่ฏๅๅฑๆๅก๏ผ็ดๅฐๆๅใ
Args:
url: ็ฎๆ ็ฝ้กต URL
prefer_method: markdown.new ็่ฝฌๆขๆนๆณ ("auto", "ai", "browser")
retain_images: ๆฏๅฆไฟ็ๅพ็้พๆฅ
Returns:
dict: {
"success": bool,
"content": str, # Markdown ๅ
ๅฎน
"source": str, # ไฝฟ็จ็ๆๅๅฑ็บง
"url": str, # ๅๅง URL
"char_count": int # ๅ
ๅฎนๅญ็ฌฆๆฐ
}
"""
# ็กฎไฟ URL ๆๅ่ฎฎๅ็ผ
if not url.startswith(("http://", "https://")):
url = "https://" + url
print(f"๐ ๅผๅงๆๅ: {url}")
print("=" * 60)
# --- Layer 1: markdown.new ---
print("๐ก Layer 1: ๅฐ่ฏ markdown.new ...")
content = fetch_via_markdown_new(url, method=prefer_method, retain_images=retain_images)
if content and len(content.strip()) > 100:
return {"success": True, "content": content, "source": "markdown.new", "url": url, "char_count": len(content)}
# --- Layer 2: defuddle.md ---
print("๐ก Layer 2: ๅฐ่ฏ defuddle.md ...")
content = fetch_via_defuddle(url)
if content and len(content.strip()) > 100:
return {"success": True, "content": content, "source": "defuddle.md", "url": url, "char_count": len(content)}
# --- Layer 3: Jina Reader ---
print("๐ก Layer 3: ๅฐ่ฏ Jina Reader ...")
content = fetch_via_jina(url)
if content and len(content.strip()) > 100:
return {"success": True, "content": content, "source": "jina-reader", "url": url, "char_count": len(content)}
# --- Layer 4: Scrapling (ๅธธ่งๆจกๅผ) ---
print("๐ก Layer 4a: ๅฐ่ฏ Scrapling (ๅธธ่งๆจกๅผ) ...")
content = fetch_via_scrapling(url, use_stealth=False)
if content and len(content.strip()) > 100:
return {"success": True, "content": content, "source": "scrapling", "url": url, "char_count": len(content)}
# --- Layer 4b: Scrapling (้่บซๆจกๅผ) ---
print("๐ก Layer 4b: ๅฐ่ฏ Scrapling (้่บซๆจกๅผ) ...")
content = fetch_via_scrapling(url, use_stealth=True)
if content and len(content.strip()) > 100:
return {"success": True, "content": content, "source": "scrapling-stealth", "url": url, "char_count": len(content)}
# ๆๆๆนๆณๅคฑ่ดฅ
print("โ ๆๆๆๅๆนๆณๅๅคฑ่ดฅ")
return {"success": False, "content": None, "source": None, "url": url, "char_count": 0}
# ========================================
# ๆง่กๆๅ
# ========================================
TARGET_URL = "{็จๆทๆไพ็ URL}"
result = smart_fetch(TARGET_URL)
if result["success"]:
print(f"""
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
ๆๅๆๅ โ
โ โ
โ ๆฅๆบ: {result['source']:<52}โ
โ ๅญ็ฌฆๆฐ: {result['char_count']:<50}โ
โ URL: {result['url'][:50]:<52}โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
""")
# ่พๅบ Markdown ๅ
ๅฎน
print("\n--- ็ฝ้กตๅ
ๅฎน (Markdown) ---\n")
print(result["content"])
else:
print(f"""
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ ๆๅๅคฑ่ดฅ โ
โ โ
โ ๆๆ 4 ๅฑๆๅๆนๆณๅๆ ๆณ่ทๅๅ
ๅฎนใ โ
โ ๅฏ่ฝ็ๅๅ : โ
โ - ็ฎๆ ็ฝ็ซ้่ฆ็ปๅฝ/่ฎค่ฏ โ
โ - ็ฎๆ URL ๆ ๆๆไธๅฏ่พพ โ
โ - ็ฎๆ ็ฝ็ซๆๆๅผบ็ๅ็ฌๆบๅถ โ
โ โ
โ ๅปบ่ฎฎ: โ
โ - ๆฃๆฅ URL ๆฏๅฆๆญฃ็กฎ โ
โ - ๅฐ่ฏๆไพ้่ฆ็ปๅฝๅ็้กต้ขๆบ็ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
""")
Phase 3: Content Processing & Output
ๆๅๆๅๅ๏ผ
- ็ดๆฅ่ฟๅ Markdown ๅ ๅฎน็ป็จๆท
- ๅฆๆๅ ๅฎน่ฟ้ฟ๏ผ่ถ ่ฟ 50000 ๅญ็ฌฆ๏ผ๏ผ่ฟ่กๆบ่ฝๆชๅๅนถๆ็คบ็จๆท
- ่ฎฐๅฝไบคๆ ID ็จไบๆฏไป่ฟฝ่ธช
# ๅ
ๅฎนๅๅค็
def process_content(content: str, max_chars: int = 50000) -> str:
"""ๅค็ๅๆชๅ่ฟ้ฟๅ
ๅฎน"""
if len(content) <= max_chars:
return content
# ๆบ่ฝๆชๅ๏ผๅจๆฎต่ฝ่พน็ๆชๆญ
truncated = content[:max_chars]
last_newline = truncated.rfind('\n\n')
if last_newline > max_chars * 0.8:
truncated = truncated[:last_newline]
truncated += f"\n\n---\nโ ๏ธ ๅ
ๅฎน่ฟ้ฟ๏ผๅทฒๆชๅๅ {len(truncated)} ๅญ็ฌฆ๏ผๅ
ฑ {len(content)} ๅญ็ฌฆ๏ผใ"
return truncated
ไฝฟ็จๅบๆฏ็คบไพ
ๅบๆฏ 1: ๆๅๆๆฏๆๆกฃ
็จๆท: ๅธฎๆๆๅ https://docs.python.org/3/tutorial/index.html ็ๅ
ๅฎน
ๆง่กๆต็จ:
- ๆฏไป้ช่ฏ โ ้่ฟ
- Layer 1 (markdown.new) โ ๅฐ่ฏๆๅ
- ่ฟๅ Markdown ๆ ผๅผ็ Python ๆ็จๅ ๅฎน
ๅบๆฏ 2: ๆๅ GitHub README
็จๆท: ๆๆณ็็่ฟไธชๅบ็ไป็ป https://github.com/D4Vinci/Scrapling
ๆง่กๆต็จ:
- ๆฏไป้ช่ฏ โ ้่ฟ
- Layer 1 (markdown.new) โ GitHub ้กต้ข้ๅธธๆๅ
- ่ฟๅ Scrapling ้กน็ฎ็ README ๅ ๅฎน
ๅบๆฏ 3: ๆๅๅ็ฌ็ฝ็ซ
็จๆท: ๅธฎๆๆๅ่ฟไธช็ฝ้กต https://ๆๅ็ฌ็ฝ็ซ.com/article/123
ๆง่กๆต็จ:
- ๆฏไป้ช่ฏ โ ้่ฟ
- Layer 1 โ ๅคฑ่ดฅ
- Layer 2 โ ๅคฑ่ดฅ
- Layer 3 โ ๅคฑ่ดฅ
- Layer 4 (Scrapling Stealth) โ ไฝฟ็จ้่บซๆจกๅผ็ป่ฟๅ็ฌ
- ่ฟๅๆๅ็ๅ ๅฎน
ๅบๆฏ 4: ๆ็ดขไฟกๆฏ๏ผไฝฟ็จ Jina Search๏ผ
็จๆท: ๅธฎๆๆไธไธ "Python asyncio best practices 2025"
def search_via_jina(query: str) -> str:
"""ไฝฟ็จ Jina Search ๆ็ดขไฟกๆฏ"""
api_url = f"https://s.jina.ai/{query}"
try:
response = requests.get(api_url, timeout=60)
if response.status_code == 200:
return response.text
return None
except:
return None
# ๆง่กๆ็ดข
search_result = search_via_jina("Python asyncio best practices 2025")
print(search_result)
Prerequisites (ๆ้ๅฎ่ฃ )
ๅบ็กไพ่ต๏ผLayer 1-3 ๅช้ requests๏ผ
pip install requests
Scrapling ไพ่ต๏ผLayer 4 - ไป ๅจ้่ฆๆถๅฎ่ฃ ๏ผ
# ๅบ็กๅฎ่ฃ
pip install scrapling
# ๅฎๆดๅฎ่ฃ
๏ผๅซๆต่งๅจๅๅๅ็ฌๅ่ฝ๏ผ
pip install "scrapling[fetchers]"
scrapling install
๐ฐ Revenue & Analytics
Track your earnings in real-time at SkillPay Dashboard.
- Price per fetch: 0.001 USDT
- Your revenue share: 95%
- Settlement: Instant (BNB Chain)
Powered by SkillPay - AI Skill Monetization Infrastructure