แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ
ปฏิบัติตาม robots.txt ส่วนหัวตัวแทนผู้ใช้ หน่วงเวลาคำขอ และใช้แคช
แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการดึงข้อมูลจากเว็บไซต์อย่างมีความรับผิดชอบจึงสำคัญ
การดึงข้อมูลจากเว็บไซต์อาจสร้างภาระให้เซิร์ฟเวอร์ ละเมิดข้อกำหนดการให้บริการ และทำให้ IP ของเอเจนต์ถูกระงับ นักดึงข้อมูลที่มีความรับผิดชอบจะเคารพขีดจำกัดอัตราการส่งคำขอ ระบุตัวตนอย่างชัดเจน และปฏิบัติตามกฎที่เว็บไซต์ประกาศไว้
บทเรียนนี้ครอบคลุมเครื่องมือและเทคนิคสำหรับการดึงข้อมูลจากเว็บไซต์อย่างมีจริยธรรมและยั่งยืน
การตรวจสอบ robots.txt
เว็บไซต์ทุกแห่งสามารถเผยแพร่ไฟล์ robots.txt เพื่อระบุว่าเอเจนต์อัตโนมัติสามารถหรือไม่สามารถเข้าถึงเส้นทางใดได้ ไลบรารีมาตรฐานของไพธอนมี urllib.robotparser สำหรับแยกวิเคราะห์ไฟล์นี้
ให้ตรวจสอบ robots.txt ทุกครั้งก่อนดึงข้อมูลจากเว็บไซต์
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
# Check if our bot can fetch a specific path
can_fetch = rp.can_fetch('MyAgent/1.0', 'https://example.com/public-data')
print(f'Can fetch: {can_fetch}') # True or False
cannot_fetch = rp.can_fetch('*', 'https://example.com/private/admin')
print(f'Admin allowed: {cannot_fetch}') # Often Falseการตั้งค่าตัวระบุผู้ใช้ที่สื่อความหมายชัดเจน
ส่วนหัวเอชทีทีพี User-Agent ใช้ระบุว่าใครเป็นผู้ส่งคำขอ ตัวระบุผู้ใช้ที่ตรงไปตรงมาช่วยให้ผู้ดูแลเว็บไซต์ทราบว่าบอตของคุณคืออะไรและจะติดต่อคุณได้อย่างไรหากเกิดปัญหา การปลอมตัวเป็นเบราว์เซอร์เพื่อหลีกเลี่ยงการบล็อกอาจก่อให้เกิดข้อกังวลด้านจริยธรรม
import httpx
headers = {
# Honest, descriptive User-Agent
'User-Agent': 'MyResearchBot/1.0 (contact: me@example.com; purpose: academic research)'
}
response = httpx.get(
'https://example.com/data',
headers=headers,
timeout=10.0
)
print(response.status_code)การจำกัดอัตราด้วย time.sleep()
การส่งคำขอหลายร้อยรายการต่อวินาทีอาจทำให้เซิร์ฟเวอร์รับภาระหนักเกินไป และมักถูกมองว่าเป็นการโจมตีแบบปฏิเสธการให้บริการ ให้เพิ่มช่วงหน่วงระหว่างคำขอด้วย time.sleep() ใช้ random.uniform() เพื่อให้ช่วงหน่วงดูไม่เป็นหุ่นยนต์เกินไปและมีลักษณะคล้ายมนุษย์มากขึ้น
import time
import random
import httpx
urls = [
'https://example.com/page/1',
'https://example.com/page/2',
'https://example.com/page/3'
]
for url in urls:
response = httpx.get(url, timeout=10.0)
print(f'Fetched {url}: {response.status_code}')
# Wait between 1 and 3 seconds before the next request
delay = random.uniform(1, 3)
print(f'Sleeping {delay:.1f}s...')
time.sleep(delay)การเคารพส่วนหัว Retry-After
เมื่อเซิร์ฟเวอร์ตอบกลับด้วย 429 Too Many Requests มักจะมีส่วนหัว Retry-After ระบุจำนวนวินาทีที่ต้องรอ เอเจนต์ของคุณควรอ่านค่านี้และปฏิบัติตาม แทนที่จะลองส่งคำขอใหม่ทันที
import time
import httpx
def fetch_with_retry(url: str) -> httpx.Response:
while True:
response = httpx.get(url, timeout=10.0)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 5))
print(f'Rate limited. Waiting {retry_after}s...')
time.sleep(retry_after)
continue # retry
response.raise_for_status()
return responseการแคชการตอบกลับเพื่อหลีกเลี่ยงการดึงข้อมูลซ้ำ
รีเควสต์-แคช จะแคชการตอบกลับเอชทีทีพีลงในดิสก์โดยอัตโนมัติ หากเอเจนต์ของคุณต้องดึง URL เดิมหลายครั้ง เช่น ระหว่างการพัฒนาหรือการเรียกใช้ซ้ำ ระบบจะส่งคืนการตอบกลับที่แคชไว้ทันทีโดยไม่ต้องติดต่อเซิร์ฟเวอร์
# pip install requests-cache
import requests_cache
# Install the cache globally — cached responses expire after 1 hour
requests_cache.install_cache(
'agent_cache',
backend='sqlite',
expire_after=3600 # seconds
)
import requests
# First call: fetches from network and caches
response = requests.get('https://api.example.com/data')
print(response.from_cache) # False
# Second call: returns cached result instantly
response2 = requests.get('https://api.example.com/data')
print(response2.from_cache) # Trueการแคชด้วยไฟล์ด้วยเอชทีทีพีเอ็กซ์
หากคุณไม่ต้องการใช้รีเควสต์-แคช แคชแบบใช้ไฟล์อย่างง่ายก็ทำงานได้ดี ให้จัดเก็บการตอบกลับเป็นไฟล์เจสันโดยใช้แฮชของ URL เป็นคีย์ และโหลดกลับมาใช้หากไฟล์ยังใหม่เพียงพอ
import hashlib
import json
import os
import time
import httpx
CACHE_DIR = '/tmp/agent_cache'
os.makedirs(CACHE_DIR, exist_ok=True)
def cached_get(url: str, ttl_seconds: int = 3600) -> dict:
key = hashlib.md5(url.encode()).hexdigest()
cache_file = os.path.join(CACHE_DIR, key + '.json')
if os.path.exists(cache_file):
age = time.time() - os.path.getmtime(cache_file)
if age < ttl_seconds:
with open(cache_file) as f:
return json.load(f)
response = httpx.get(url, timeout=10.0)
response.raise_for_status()
data = response.json()
with open(cache_file, 'w') as f:
json.dump(data, f)
return dataการอ่านข้อกำหนดการให้บริการ
ก่อนดึงข้อมูลจากเว็บไซต์ใด ๆ ให้อ่านข้อกำหนดการให้บริการของเว็บไซต์นั้น หลายแห่งห้ามการเข้าถึงแบบอัตโนมัติหรือการใช้ข้อมูลเชิงพาณิชย์ไว้อย่างชัดเจน การละเมิดข้อกำหนดการให้บริการอาจนำไปสู่การดำเนินคดี ไม่ใช่เพียงการถูกระงับ IP เท่านั้น
หากมีเอพีไออย่างเป็นทางการ ให้เลือกใช้เอพีไอนั้นแทนการดึงข้อมูลจาก HTML เสมอ เพราะรวดเร็วกว่า เสถียรกว่า และปลอดภัยทางกฎหมายมากกว่า
การหน่วงเวลาแบบทวีคูณเมื่อเกิดข้อผิดพลาด
เมื่อคำขอล้มเหลว อย่าลองส่งใหม่ทันที ให้ใช้การหน่วงเวลาแบบทวีคูณ: รอ 1 วินาที จากนั้น 2 วินาที แล้วจึง 4 วินาที เป็นต้น วิธีนี้ช่วยหลีกเลี่ยงการส่งคำขอซ้ำ ๆ ไปยังเซิร์ฟเวอร์ที่กำลังมีปัญหา และเป็นรูปแบบการทำงานระดับมืออาชีพสำหรับเอเจนต์ในระบบจริง
import time
import httpx
def fetch_with_backoff(url: str, max_retries: int = 4) -> dict:
for attempt in range(max_retries):
try:
response = httpx.get(url, timeout=10.0)
response.raise_for_status()
return response.json()
except (httpx.HTTPStatusError, httpx.RequestError) as e:
if attempt == max_retries - 1:
raise
wait = 2 ** attempt # 1, 2, 4, 8 seconds
print(f'Attempt {attempt+1} failed: {e}. Retrying in {wait}s...')
time.sleep(wait)
return {}การดึงข้อมูลเฉพาะที่จำเป็น
ลดภาระของเซิร์ฟเวอร์ด้วยการดึงเฉพาะสิ่งที่เอเจนต์ของคุณต้องการจริง ๆ หลีกเลี่ยงการดาวน์โหลดทั้งหน้าเมื่อจุดปลายทางเอพีไอขนาดเล็กสามารถส่งคืนข้อมูลเดียวกันได้ ใช้คำขอ HEAD เพื่อตรวจสอบว่าทรัพยากรมีการเปลี่ยนแปลงหรือไม่ก่อนดึงเนื้อหาทั้งหมด
import httpx
def has_page_changed(url: str, last_etag: str = None) -> bool:
headers = {}
if last_etag:
headers['If-None-Match'] = last_etag
response = httpx.head(url, headers=headers, timeout=5.0)
if response.status_code == 304: # Not Modified
return False
new_etag = response.headers.get('ETag')
print(f'New ETag: {new_etag}')
return Trueสรุปกฎสำหรับการดึงข้อมูลจากเว็บไซต์อย่างมีความรับผิดชอบ
รายการตรวจสอบอย่างรวดเร็วก่อนที่เอเจนต์ของคุณจะดึงข้อมูลจากเว็บไซต์ใด ๆ:
- ตรวจสอบ
robots.txtและปฏิบัติตามกฎที่ไม่อนุญาต - ตั้งค่า
User-Agentที่ตรงไปตรงมาและสื่อความหมายชัดเจน - เพิ่มช่วงหน่วงแบบสุ่มระหว่างคำขอ (
time.sleep(random.uniform(1,3))) - ปฏิบัติตามส่วนหัว
Retry-Afterเมื่อได้รับการตอบกลับ 429 - แคชการตอบกลับเพื่อหลีกเลี่ยงการดึงข้อมูลซ้ำโดยไม่จำเป็น
- อ่านข้อกำหนดการให้บริการของเว็บไซต์
- เลือกใช้เอพีไออย่างเป็นทางการแทนการดึงข้อมูลจาก HTML เมื่อมีให้ใช้
ตรวจสอบความเข้าใจ: การดึงข้อมูลจากเว็บไซต์อย่างมีความรับผิดชอบ
ทดสอบความเข้าใจเกี่ยวกับแนวปฏิบัติในการดึงข้อมูลจากเว็บไซต์อย่างมีจริยธรรมและมีความรับผิดชอบ
ทบทวน: แนวปฏิบัติในการดึงข้อมูลจากเว็บไซต์อย่างมีความรับผิดชอบ
ขณะนี้คุณมีชุดเครื่องมือครบถ้วนสำหรับการดึงข้อมูลจากเว็บไซต์อย่างมีความรับผิดชอบแล้ว:
robotparserเพื่อตรวจสอบว่าสามารถเข้าถึงสิ่งใดได้บ้าง- ส่วนหัว
User-Agentที่สื่อความหมายชัดเจนและระบุบอตของคุณ time.sleep(random.uniform(1,3))ระหว่างคำขอrequests-cacheหรือการแคชด้วยตนเองเพื่อหลีกเลี่ยงการดึงข้อมูลซ้ำ- การหน่วงเวลาแบบทวีคูณสำหรับจัดการข้อผิดพลาด
- ความตระหนักด้านกฎหมาย: ตรวจสอบข้อกำหนดการให้บริการทุกครั้ง
การดึงข้อมูลจากเว็บไซต์อย่างมีความรับผิดชอบช่วยสร้างเว็บที่มีสุขภาพดีขึ้น และทำให้เอเจนต์ของคุณทำงานต่อไปได้โดยไม่ถูกระงับ
คำถามที่พบบ่อย
บทเรียน “แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ”
ปฏิบัติตาม robots.txt ส่วนหัวตัวแทนผู้ใช้ หน่วงเวลาคำขอ และใช้แคช คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ไคลเอ็นต์ HTTP สำหรับตัวแทน: httpx และ requests
- การแยกวิเคราะห์ HTML ด้วย BeautifulSoup
- การจัดการการแบ่งหน้าและเนื้อหาแบบไดนามิก
- แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ