0Pricing
Python Academy · บทเรียน

การสร้างสไปเดอร์ Scrapy

สร้างโปรเจกต์ Scrapy เขียนสไปเดอร์ และติดตามลิงก์โดยอัตโนมัติ

การสร้างสไปเดอร์ Scrapy เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

Scrapy คืออะไร

Scrapy เป็นเฟรมเวิร์กสำหรับดึงข้อมูลจากเว็บที่มีฟีเจอร์ครบถ้วน พร้อมการรวบรวมข้อมูลแบบอะซิงโครนัส กระบวนการประมวลผลรายการ มิดเดิลแวร์ และตัวส่งออกข้อมูลในตัว

# pip install scrapy

# Create a project:
# scrapy startproject myspider

# myspider/
#   scrapy.cfg
#   myspider/
#     settings.py
#     spiders/
#       quotes_spider.py

การสร้าง Spider

สร้างคลาสย่อยจาก scrapy.Spider กำหนด name และ start_urls แล้วนำ parse() มาใช้

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                "text": quote.css("span.text::text").get(),
                "author": quote.css("small.author::text").get(),
            }

ตัวเลือก CSS และ XPath

ใช้ response.css("selector") หรือ response.xpath("//xpath") เพื่อดึงข้อมูล โดย .get() จะส่งคืนผลลัพธ์แรก และ .getall() จะส่งคืนผลลัพธ์ทั้งหมด

def parse(self, response):
    # CSS:
    titles = response.css("h2.title::text").getall()

    # XPath:
    links = response.xpath("//a/@href").getall()

    yield {"titles": titles, "links": links}

การติดตามลิงก์

ส่งคืน scrapy.Request ด้วย yield เพื่อติดตามลิงก์และแยกวิเคราะห์หน้าถัดไป

import scrapy

class Spider(scrapy.Spider):
    name = "crawler"
    start_urls = ["https://quotes.toscrape.com"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {"text": quote.css("span.text::text").get()}

        next_page = response.css("li.next a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, self.parse)

รายการข้อมูลและ ItemLoaders

กำหนดคลาส Item เพื่อจัดโครงสร้างข้อมูลที่ดึงมา และใช้ ItemLoader เพื่อล้างและแปลงฟิลด์

import scrapy

class ProductItem(scrapy.Item):
    name  = scrapy.Field()
    price = scrapy.Field()
    url   = scrapy.Field()

def parse(self, response):
    item = ProductItem()
    item["name"]  = response.css("h1::text").get(strip=True)
    item["price"] = response.css(".price::text").re_first(r"[\d.]+")
    item["url"]   = response.url
    yield item

การเรียกใช้ Spider

เรียกใช้จากไดเรกทอรีโครงการ ส่งออกเป็น JSON, CSV หรือใช้กระบวนการประมวลผลแบบกำหนดเอง

# Run and print to console:
# scrapy crawl quotes

# Save to JSON:
# scrapy crawl quotes -o quotes.json

# Save to CSV:
# scrapy crawl quotes -o quotes.csv

# Scrapy shell for interactive testing:
# scrapy shell "https://quotes.toscrape.com"

การตั้งค่า: DOWNLOAD_DELAY และ CONCURRENT_REQUESTS

โปรดใช้งานอย่างสุภาพ: เพิ่มระยะหน่วงและจำกัดจำนวนคำขอพร้อมกัน เพื่อหลีกเลี่ยงการทำให้เซิร์ฟเวอร์ทำงานหนักเกินไป

# settings.py
DOWNLOAD_DELAY = 1          # 1 second between requests
CONCURRENT_REQUESTS = 8     # max 8 at a time
CONCURRENT_REQUESTS_PER_DOMAIN = 2
ROBOTSTXT_OBEY = True       # respect robots.txt

มิดเดิลแวร์

มิดเดิลแวร์จะดักจับคำขอและการตอบกลับ ใช้มิดเดิลแวร์ในตัวสำหรับการสลับ user-agent การลองใหม่ และคุกกี้

# settings.py
DOWNLOADER_MIDDLEWARES = {
    "scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
    "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
    "myspider.middlewares.RotateUserAgentMiddleware": 400,
}

กระบวนการประมวลผลรายการ

กระบวนการประมวลผลจะจัดการรายการหลังการดึงข้อมูลจากเว็บ เช่น ล้างข้อมูล ตรวจสอบความถูกต้อง กำจัดข้อมูลซ้ำ และบันทึกลงฐานข้อมูล

# pipelines.py
class CleanPipeline:
    def process_item(self, item, spider):
        item["name"] = item["name"].strip()
        return item

class DBPipeline:
    def open_spider(self, spider):
        self.conn = connect_db()

    def process_item(self, item, spider):
        self.conn.insert(dict(item))
        return item

การจัดการการเข้าสู่ระบบ

ใช้ FormRequest ของ Scrapy เพื่อส่งแบบฟอร์มเข้าสู่ระบบและคงคุกกี้ของเซสชันไว้

import scrapy

class AuthSpider(scrapy.Spider):
    name = "auth"
    login_url = "https://example.com/login"

    def start_requests(self):
        yield scrapy.Request(self.login_url, self.login)

    def login(self, response):
        yield scrapy.FormRequest.from_response(
            response,
            formdata={"user": "me", "pass": "secret"},
            callback=self.parse
        )

scrapy-playwright สำหรับหน้าเว็บที่ใช้ JS

ปลั๊กอิน scrapy-playwright ผสาน Playwright เข้ากับ Scrapy สำหรับหน้าเว็บที่แสดงผลด้วย JavaScript

# pip install scrapy-playwright
# playwright install

# settings.py:
# DOWNLOAD_HANDLERS = {
#     "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
#     "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
# }

# In spider:
# yield scrapy.Request(url, meta={"playwright": True})

ตรวจสอบความเข้าใจ

response.follow(href, callback) ใน Spider ของ Scrapy ทำหน้าที่อะไร

สรุปทบทวน

Spider ของ Scrapy สร้างคลาสย่อยจาก scrapy.Spider ประกาศ start_urls และส่งคืนรายการหรือ Request เพิ่มเติมด้วย parse() ใช้ตัวเลือก CSS/XPath เพิ่ม DOWNLOAD_DELAY เพื่อใช้งานอย่างสุภาพ และใช้กระบวนการประมวลผลเพื่อบันทึกข้อมูล

คำถามที่พบบ่อย

บทเรียน “การสร้างสไปเดอร์ Scrapy” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างสไปเดอร์ Scrapy” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างสไปเดอร์ Scrapy”

สร้างโปรเจกต์ Scrapy เขียนสไปเดอร์ และติดตามลิงก์โดยอัตโนมัติ คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างสไปเดอร์ Scrapy” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. คำขอ HTTP ด้วย requests และ httpx
  2. การแยกวิเคราะห์ HTML ด้วย BeautifulSoup
  3. การสร้างสไปเดอร์ Scrapy
  4. การจัดการ JavaScript และมาตรการป้องกันการดึงข้อมูล
← กลับไปที่ Python Academy