0Pricing
AI Agents · บทเรียน

แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ

ปฏิบัติตาม 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ไคลเอ็นต์ HTTP สำหรับตัวแทน: httpx และ requests
  2. การแยกวิเคราะห์ HTML ด้วย BeautifulSoup
  3. การจัดการการแบ่งหน้าและเนื้อหาแบบไดนามิก
  4. แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ
← กลับไปที่ AI Agents