แทบทุกบทสรุป “ตัว Web Scraper โอเพนซอร์สดีที่สุด” มักมีจุดบอดเงียบ ๆ อยู่ข้อหนึ่ง: ไม่มีใครเอาเครื่องมือพวกนั้นไปรันบนหน้าเว็บชุดเดียวกันจริง ๆ เลย Scrapy ถูกทดสอบกับบทความข่าวหน้าเดียว, Playwright ไปอยู่กับเดโมอีคอมเมิร์ซบางชุด, Colly ก็ใช้หน้าอะไรก็แล้วแต่ที่คนเขียนมีอยู่ในมือ — แล้วจากนั้นก็นำมาจัดอันดับเทียบกันตรง ๆ ราวกับตัวเลขพวกนั้นมีความหมายเหมือนกัน ทั้งที่จริงแล้วอันดับแบบนั้นบอกคุณได้แค่เรื่องของหน้าเว็บ ไม่ได้บอกเรื่องประสิทธิภาพของเครื่องมือ
ดังนั้นผมเลยเลือกทำสิ่งที่ดูธรรมดา แต่แทบไม่มีใครในลิสต์เหล่านั้นทำ: สร้างชุด fixture ชุดเดียว แล้วส่งเครื่องมือทั้ง 9 ตัวลงสนามเดียวกันทั้งหมด — มีทั้งแค็ตตาล็อกแบบ static, แค็ตตาล็อกที่เรนเดอร์ด้วย JavaScript, บทความที่ถูกซ่อนอยู่ท่ามกลางเมนูนำทางและฟุตเตอร์, เซิร์ฟเวอร์ที่ตั้งใจปล่อย HTTP 500, กราฟการ crawl ลิงก์ภายในขนาดเล็ก รวมถึงเว็บฝึกหัดสาธารณะอีก 2 เว็บ ข้อมูลอ้างอิงเดียวกัน การวัดผลแบบเดียวกัน ทุกครั้งที่รัน ผลลัพธ์ที่ได้ไม่ใช่ตารางผู้นำสวยหรูอย่างที่ roundup ชอบสัญญา — ไม่มีผู้ชนะเพียงหนึ่งเดียว แต่มีอยู่ 3 งานหลัก และทั้ง 9 เครื่องมือก็ค่อย ๆ แบ่งกลุ่มเข้าที่ของตัวเองแทบจะโดยอัตโนมัติ
ลอง Thunderbit สำหรับการดึงข้อมูลเว็บ
การทดสอบนี้ทำงานอย่างไร และข้อจำกัดเดียวที่ผมขอพูดตรง ๆ

เครื่องมือทุกตัวเจอ fixture รูปแบบเดียวกัน: สินค้าแบบ static 12 รายการกระจายอยู่ 2 หน้า, สินค้า 8 รายการที่ถูกฉีดเข้ามาด้วย JavaScript หลังหน่วงเวลา, บทความที่ถูกครอบด้วยโค้ด nav/footer จนเต็มไปด้วยของเกิน, เซิร์ฟเวอร์ที่ตั้งใจส่ง 500, และกราฟลิงก์ภายใน แนวทางนี้เองที่ทำให้ผลลัพธ์เทียบกันได้ — “8/8 สำหรับ dynamic products” หมายถึงสิ่งเดียวกันไม่ว่าจะได้มาจาก Puppeteer หรือ Crawlee ก็ตาม
นี่คือเส้นแบ่งที่ roundup ส่วนใหญ่มักข้ามไป แต่ผมอยากชี้ให้ชัด แต่ละชุดของเครื่องมือจะมีสำเนา fixture ของตัวเองอยู่ด้วย ดังนั้นจำนวนอักขระแบบ absolute จึงไม่ได้เทียบกันตรง ๆ ข้ามเครื่องมือได้ — ให้อ่านเป็นสัญญาณภายในเครื่องมือเดียวเท่านั้น ไม่ใช่คะแนนข้ามเครื่องมือ ตัวเลขที่เทียบกันได้จริงคือ recall (ให้มองเป็นอัตรา), ผลผ่าน/ไม่ผ่านของ JavaScript และพฤติกรรมเชิงโครงสร้าง หมายเหตุด้านขอบเขตอีกข้อในทิศทางเดียวกัน: การรันของ Crawl4AI บน static catalog ครอบคลุมแค่หน้าแรกเท่านั้น ดังนั้น 6/6 ของมันคือ recall เต็มบนช่วงที่แคบกว่า ขณะที่เครื่องมืออื่นเก็บครบสองหน้าเป็น 12/12 — คือขอบเขตเล็กกว่า ไม่ใช่ตกหล่นครึ่งหนึ่ง รายละเอียดเหตุผลทีละ fixture อยู่ใน บทความ methodology
ก่อนดูตัวเลข ขอพูดข้อควรระวังอีกข้อ แต่ละชุดยังมี provisional research score แนบอยู่ด้วย แต่ผมตั้งใจไม่พิมพ์มันออกมาในรูปตารางจัดอันดับ คะแนนเหล่านั้นเป็นตัวช่วยภายในสำหรับเช็กว่าแต่ละเครื่องมือสอดคล้องกับหลักฐานของตัวเองหรือไม่ ไม่ใช่ตารางลีก และถ้าเอามาเผยแพร่รวมกัน ก็จะสร้างปัญหา false precision แบบเดียวกับที่การทดลองนี้พยายามเลี่ยงอยู่แล้ว นี่คือการสรุปสิ่งที่ bench บอก ไม่ใช่การทำ leaderboard
ภาพรวมทั้งสนามในสนามทดสอบเดียว
ลองอ่านคอลัมน์สองช่องนี้ลงมา — “Renders JS?” และ “Built-in crawl queue” — แล้วคุณจะเห็นทันทีว่า 3 งานหลักคืออะไร
| Tool | Language | Renders JS? | Static recall | Structured output | Built-in crawl queue | Setup weight | License |
|---|---|---|---|---|---|---|---|
| Crawl4AI | Python | ใช่ (browser) | 6/6 (page 1) | CSS schema | BFS/DFS ในตัว | หนัก (browser stack 2 ชุด) | Apache-2.0 |
| Firecrawl | Self-hosted | ใช่ (playwright-service) | Markdown เต็ม | มี | /v1/crawl | หนักที่สุด (6 containers) | AGPL-3.0 |
| trafilatura | Python | ไม่ | 3/3 article | ไม่มี (text only) | ไม่มี | เบา | Apache-2.0 |
| Crawlee | Node/TS | แล้วแต่ engine | 12/12 | ผ่าน extraction | มี (RequestQueue) | ปานกลาง (+~80 MiB) | Apache-2.0 |
| Playwright | Node/multi | ใช่ | 12/12 | ทำเอง | ไม่มี | ปานกลาง (browser) | Apache-2.0 |
| Puppeteer | Node | ใช่ (Chrome) | 12/12 | ทำเอง | ไม่มี | ปานกลาง (Chrome) | Apache-2.0 |
| Scrapy | Python | ไม่ | 12/12 | Feed export (JSON/CSV/XML) | มี (built-in) | ปานกลาง (Twisted deps) | BSD-3 |
| Colly | Go | ไม่ | 12/12 | ผ่าน callbacks | ควบคุม depth ได้ | เบา (1 binary + Go) | Apache-2.0 |
| Scrapling | Python | ไม่ (HTTP fetcher) | 12/12 | มี | ไม่มี | ปานกลาง ([fetchers]) | BSD-3 |

หมายเหตุเรื่องเมตาดาต้าในตารางนี้และตลอดทั้งบทความ: จำนวนดาวและหมายเลขเวอร์ชันถูกบันทึกไว้ช่วงต้นเดือนกรกฎาคม 2026 และทั้งสองอย่างเปลี่ยนเร็วมาก ควรเช็ก GitHub และหน้าของ package แต่ละโปรเจกต์อีกครั้งก่อนจะถือว่าเป็นข้อมูลล่าสุด
ดัชนีรีวิวของแต่ละเครื่องมือ
แต่ละโปรเจกต์ใน roundup นี้มีรีวิวเชิงลึกประกอบอยู่ด้วย:
- รีวิว Crawl4AI
- รีวิว Firecrawl
- รีวิว trafilatura
- เปรียบเทียบ Playwright vs Puppeteer
- รีวิว Crawlee
- รีวิว Scrapy
- รีวิว Colly
- รีวิว Scrapling
ด้านล่างนี้คือหน้าปกของแต่ละตัว — พร้อมภาพหน้าจอจริง 2 ภาพจากการทดสอบการเรนเดอร์ JavaScript เพื่อให้คำว่า “8/8 dynamic” ไม่ใช่แค่ตัวเลขบนหน้าเว็บ










งานแรก: แปลงหน้าเว็บให้เป็นข้อความพร้อมป้อน LLM

ถ้าสิ่งที่คุณต้องการคือ Markdown สะอาด ๆ สำหรับป้อนเข้า RAG pipeline มีอยู่ 3 เครื่องมือที่เข้าชิงกัน — และทั้งสามตัวต่างกันคนละแบบอย่างชัดเจน
Crawl4AI แท้จริงแล้วคือเครื่องมือสร้าง Markdown ที่ขับเคลื่อนด้วยเบราว์เซอร์ แม้การตลาดจะพยายามเล่าเรื่อง “adaptive intelligence self-learning selector” ก็ตาม ควรเลิกเชื่อเรื่องนั้นเสียที เพราะมันไม่มีฟีเจอร์แบบนั้น — นั่นเป็นลูกเล่นของไลบรารีอีกตัวหนึ่งต่างหาก (เดี๋ยวเราจะพูดถึงตอนถึง Scrapling) ส่วนสิ่งที่มันทำได้จริงนั้นทำได้ดีทีเดียว บนเว็บฝึก Books to Scrape มันส่งออก Markdown ยาว 13,476 อักขระ, รองรับการดึงข้อมูลแบบมีโครงสร้างด้วย CSS schema, และ BFS deep crawl ในตัวก็ไล่ไปได้ 5 หน้า บน fixture ของกราฟ crawl ขณะเดียวกันก็เรนเดอร์หน้า JavaScript และจับภาพหน้าจอได้ด้วย แต่ก็มีจุดบกพร่องจริงอยู่ 2 อย่าง คือ Markdown ดิบของมันยังพก boilerplate ของหน้าเว็บมาด้วยถ้าคุณไม่เปิดตัวกรองเนื้อหา และหน้า 500 ที่ตั้งใจสร้างขึ้นมานั้นกลับได้ success=false — ไม่ใช่เพราะ Crawl4AI ตรวจจับ HTTP error ได้อย่างสะอาด แต่เพราะ heuristic เนื้อหาของมันมองเห็น body ของ error ที่สั้นมากแล้วติดป้ายว่า minimal_text ... blocked นอกจากนี้การติดตั้งยังลาก browser stack สองชุดลงเครื่องคุณอีกด้วย เวอร์ชัน 0.9.0, Apache-2.0, ดาวราว 71k ในช่วงต้นกรกฎาคม
Firecrawl คือตัวท็อปที่หนักที่สุด และการ self-host ก็ใช้ได้จริง — ที่ผมบอกว่า “จริง” เพราะสแต็ก 6 คอนเทนเนอร์ (api, playwright-service, redis, rabbitmq, nuq-postgres, และ foundationdb) สามารถรันขึ้นมาได้จริงและสร้าง Markdown พร้อมใช้กับ LLM ยาว 9,222 อักขระ จากหน้า Books to Scrape เดียวกัน มันเรนเดอร์หน้า JavaScript ผ่าน playwright-service ที่มากับระบบ และข้อความ Einstein ที่ถูกฉีดเข้ามาหลังสคริปต์ก็ปรากฏในผลลัพธ์ นั่นยืนยันได้ว่าการเรนเดอร์เกิดขึ้นจริง ปัญหาที่ผมเจอมี 2 อย่าง แต่ไม่ใช่ความผิดของ Firecrawl และผมอยากพูดให้ตรงเพื่อไม่ให้ใครเอาวิธีแก้ผิดไปใช้: การ build จากซอร์สไปสะดุดกับ snapshotter glitch ของ containerd ตอนใช้ colima (ผมเลยสลับไปใช้ image ที่ build ไว้แล้ว), และช่วง DNS 198.18.x.x ของ colima ไปชนกับ SSRF guard ของ Firecrawl ซึ่งผมแก้ด้วย ALLOW_LOCAL_WEBHOOKS=true — เป็น workaround สำหรับ local dev เท่านั้น ไม่ใช่สิ่งที่ควรปิดในงาน production ตัว core แบบ self-hosted ยังไม่มี Fire-engine ซึ่งเป็น anti-block layer บน cloud และผมก็ไม่ได้ทดสอบ cloud API ด้วย สิ่งที่ต้องใส่ใจมากกว่าคือไลเซนส์: core แบบ self-hosted ของ Firecrawl ใช้ AGPL-3.0 ซึ่งต้องศึกษาผลทางกฎหมายจริงจังก่อนนำไปใช้เชิงพาณิชย์ ไม่ใช่แค่บรรทัดหมายเหตุเล็ก ๆ ดาวราว 148k ในช่วงต้นกรกฎาคม
trafilatura คือคนนอกสายของกลุ่มนี้ และเป็นตัวที่ลิสต์สาย AI-hype มักลืมไปบ่อยที่สุด ไม่มีเบราว์เซอร์ ไม่มีแถวข้อมูลแบบ structured มีแค่การดึง text บทความที่สะอาดและเร็วใน Python ล้วน ๆ บน fixture ของบทความ มันดึงได้ทั้งชื่อเรื่องและ ทุก 3 จาก 3 ย่อหน้าจริง ลบ boilerplate ออกจนหมด — ไม่มี “Login,” “Subscribe,” หรือ “Copyright” หลุดเข้ามา — และยังดึงชื่อผู้เขียนกับวันที่มาด้วย นอกจากนี้บนหน้าสินค้าสาธารณะหนึ่งหน้า มันคืนข้อความสะอาดยาว 1,324 อักขระ ข้อจำกัดของมันชัดเจนตามดีไซน์: ถ้าโยนแค็ตตาล็อกให้ มันจะส่งกลับ ชื่อสินค้า 12 รายการในรูปข้อความ แต่ไม่มี structured rows เลย — มี text แต่ไม่มีโครงสร้าง และมันก็ไม่เรนเดอร์ JavaScript เวอร์ชัน 2.1.0 (รุ่นปัจจุบัน), Apache-2.0, ราว 6.2k ดาว ถ้าเป็นการดึงบทความล้วน ๆ นี่คือสิ่งแรกที่ผมจะหยิบมาใช้
ตัวเลขอักขระ Markdown สองตัวนั้น — 13,476 จาก Crawl4AI และ 9,222 จาก Firecrawl — มาจากหน้า public เดียวกันก็จริง แต่ไม่ควรอ่านว่าตัวหนึ่งดีกว่าอีกตัวโดยตรง ตัวเลขเหล่านี้สะท้อนกลยุทธ์ Markdown ที่ต่างกัน (แต่ละตัวเก็บ chrome ของหน้าไว้มากน้อยแค่ไหน) ไม่ใช่คำตัดสินว่า output ไหนดีกว่า นี่คือกฎของสัญญาณภายในเครื่องมือเดียวที่พูดไว้ก่อนหน้า ซึ่งเกิดขึ้นให้เห็นชัดตรงหน้า
งานที่สอง: เรนเดอร์ JavaScript ให้เสถียร

ข้อมูลบางอย่างไม่ได้อยู่ใน HTML จนกว่าสคริปต์จะรัน และนั่นคือจังหวะที่เบราว์เซอร์จริงกลายเป็นของจำเป็น Three tools รับงานนี้อยู่ — และสองตัวในนั้นเกือบจะเป็นเครื่องมือเดียวกันเลย
Playwright และ Puppeteer เสมอกันทุกการทดสอบที่ผมโยนให้ ทั้งคู่เรนเดอร์สินค้าแบบ dynamic ได้ 8/8 บน fixture ภายในเครื่อง และ 10 บนเว็บ Quotes JS สาธารณะ ทั้งคู่ทำ static recall ได้ 12/12 และจัดการหน้า 500 ได้อย่างเรียบร้อย (Puppeteer จะส่ง response object กลับมาแทนการ throw) ทั้งคู่ไม่ได้แถมคิว crawl มาด้วย ดังนั้นจึงต้องเขียน BFS เอง ซึ่งไปได้ 12 หน้า ที่ depth 0–2 บนกราฟ crawl ความต่างเดียวที่มีจริง ๆ คือขอบเขตการใช้งาน: Playwright ขับ Chromium, Firefox, และ WebKit ได้ และรองรับ Python กับ .NET ขณะที่ Puppeteer เน้น Chrome และใช้ได้เฉพาะ Node ขอเปิดเผยสองเรื่อง เพราะเวอร์ชันของกลุ่มนี้เปลี่ยนเร็วมาก: ผมทดสอบ Playwright 1.56.0 เทียบกับ current 1.61.1 และใช้แค่ Chromium ส่วน Puppeteer 24.16.0 เทียบกับ current 25.3.0 — โปรดรันใหม่หรือหักน้ำหนักข้อมูลนี้ตามสมควร ทั้งคู่ใช้ Apache-2.0; ดาวประมาณ 92k และ 95k ตามลำดับ
Crawlee คือเครื่องมือที่แก้ปัญหาเรื่องคิวที่อีกสองตัวปล่อยไว้ มันครอบทั้งเอ็นจิน Cheerio (HTTP) และ Playwright (browser) ไว้ใต้ API เดียว และความต่างบนหน้าเดียวก็คือหัวใจของจุดขายนี้: เอ็นจิน Cheerio มองไม่เห็นรายการที่ฉีดด้วย JavaScript เลย 0, แต่เอ็นจิน Playwright เห็นครบ 8/8 ในเครื่อง (และ 10 บนเว็บสาธารณะ) และการสลับระหว่างกันก็ใช้การเปลี่ยนบรรทัดเดียว นอกจากนี้ยังให้ RequestQueue ของจริงมาด้วย จึงเป็นเหตุผลว่าทำไมมันถึงอยู่ในงานนี้มากกว่างานที่สาม ข้อควรระวังที่ไม่มีใครใส่ไว้ในพาดหัวคือ เอ็นจิน browser ต้องติดตั้ง npx playwright install เพิ่มต่างหาก ซึ่งกินพื้นที่ราว 80 MiB ที่ npm install crawlee ไม่ได้ดึงมาให้ เวอร์ชัน 3.17.0, TypeScript, Apache-2.0, ราว 24.6k ดาว
งานที่สาม: crawl ให้เร็วโดยไม่พึ่งเบราว์เซอร์
ถ้าไม่มี JavaScript บนหน้าเว็บ เบราว์เซอร์ก็กลายเป็นของหนักที่เกินความจำเป็น Three tools แบบ HTTP-first มาแย่งงานกันตรงนี้ คนละปรัชญาภาษา และให้ผลลัพธ์ต่างกันอย่างน่าสนใจ
Scrapy คือเฟรมเวิร์กระดับวิศวกรรมของกลุ่มนี้ — มี spiders, มี feed export ออก JSON/CSV/XML, มี AutoThrottle และฟีเจอร์ครบมือ มันทำ static recall ได้ 12/12, ดึง 3/3 ย่อหน้าของบทความ, ไหล crawl ไปได้ 11 หน้า บนกราฟ depth 0–2 และจับหน้า 500 ได้ผ่าน handle_httpstatus_list สิ่งที่น่าสนใจกว่าคือมุมมองของมัน: มันไม่เรนเดอร์ แต่มันจำลองคำขอใหม่ทั้งหมด เมื่อโยนหน้า JavaScript ให้ มันได้ 0 node — แล้ว API แบบ JSON ที่อยู่เบื้องหลังหน้าเดียวกันกลับให้มัน 8/8 นี่คือปรัชญาของ Scrapy ในข้อมูลจุดเดียว: หา request ที่หน้าเว็บใช้จริงแล้ว replay มัน ไม่ต้องไปขับเบราว์เซอร์เอง ข้อแลกเปลี่ยนคือ dependency stack ค่อนข้างใหญ่ (Twisted, lxml, parsel) และผมทดสอบเฉพาะกับ fixture ขนาดเล็ก เวอร์ชัน 2.17.0, BSD-3-Clause, ราว 63k ดาว
Colly คือคำตอบฝั่ง Go และมันพูดตรงไปตรงมาน่าชื่นใจว่าเป็นอะไร: ไบนารี static ไฟล์เดียว ขับเคลื่อนด้วย callback ผ่าน OnHTML, OnResponse, และ OnError พร้อมการควบคุม depth มันทำ static recall ได้ 12/12, ดึง 8/8 จาก JSON API ผ่าน OnResponse, จับหน้า 500 ผ่าน OnError, และไปได้ 17 หน้าในการ crawl depth-2 — และผมตั้งใจจะพูดแบบนั้นเป๊ะ ๆ เพราะตัวเลขหน้าดังกล่าวคือตัวนับของ harness เอง ไม่ใช่คำรับประกันความครบถ้วนที่ Colly อ้างไว้ สิ่งที่มันไม่ทำคือ JavaScript: ทั้ง dynamic fixture และ Quotes JS site ต่างก็กลับมา 0 ตามดีไซน์ คุณจะต้องมี Go toolchain เพื่อ build มัน และ module version (v2.3.0) ตอนนี้วิ่งนำ tagged release (v2.2.0) อยู่ ใช้ Apache-2.0, ราว 25k ดาว
Scrapling คือผู้เชี่ยวชาญเฉพาะทาง และมันก็สมชื่อจริง ๆ selector แบบ adaptive ของมันถูกออกแบบมาเพื่อหา element เดิมกลับมาใหม่หลังจาก markup เปลี่ยนไป — ดังนั้นพอผมเปลี่ยน class HTML เป้าหมายจาก product-name เป็น product-title, selector ปกติจะจับได้ 0, แต่ adaptive re-match ยังลาก element ที่เฝ้าอยู่กลับมาได้อยู่ดี บนงานดึงข้อมูล HTTP ล้วน ๆ มันทำได้ 12/12 สำหรับ static และ 8/8 บน JSON API ส่วนที่เอกสารของมันไม่ปิดบังเลยคือ ใน synthetic multi-element test มันกู้คืนได้เพียง 1 จาก 3 — นี่คือการติดตาม element แบบ resilient ไม่ใช่การกู้คืนทั้งหมด ดังนั้นอย่าคิดเผื่อเกินจริงในหัวคุณเอง base pip install scrapling ยังต้องใช้ extra [fetchers] เพื่อเริ่มใช้งาน และ StealthyFetcher ของมันเป็นข้อควรระวังด้าน compliance ไม่ใช่ฟีเจอร์ที่ผมจะหยิบไปใส่สไลด์ เวอร์ชัน 0.4.10 (รุ่นปัจจุบัน), BSD-3-Clause, ราว 68.7k ดาว
รูปแบบที่ซ่อนอยู่ใต้ 3 งานนี้
เรียงทั้ง 9 ตัวเข้าด้วยกัน แล้วรูปแบบที่ชัดเจนก็โผล่ขึ้นมาเอง static recall เต็ม 12/12 คือมาตรฐานขั้นต่ำของทุกเครื่องมือแบบ HTTP-first ไม่มีตัวไหนพลาดเคสง่าย ๆ เลย ดังนั้นมันจึงไม่ใช่จุดต่าง เครื่องมือที่มีเบราว์เซอร์จะคุ้มกับน้ำหนักที่เพิ่มขึ้นก็ต่อเมื่อมี JavaScript เข้ามาเกี่ยวจริง ๆ และพวกมันก็ต้องจ่ายค่าติดตั้งในรูปของ browser stack, การติดตั้งเพิ่มอีกชั้น หรือแม้แต่ฟาร์มคอนเทนเนอร์ทั้งชุด และคอลัมน์ “built-in crawl queue” จริง ๆ แล้วคือเส้นแบ่งระหว่าง framework กับ engine — Scrapy และ Crawlee มี orchestration มาให้ ส่วน Playwright กับ Puppeteer ทำให้คุณต้องเขียน BFS เอง นั่นคือโครงสร้างของสนามนี้ ไม่มีใครชนะภาพรวมเพราะไม่มีใครกำลังเล่นเกมเดียวกัน
แล้วคุณควรเลือกตัวไหนกันแน่
การทดสอบนี้ปฏิเสธที่จะยกใครขึ้นเป็นผู้ชนะหนึ่งเดียว เพราะคำตอบที่ถูกไม่ใช่ชื่อเครื่องมือ แต่มันคือคำถามว่า คุณกำลังทำงานแบบไหนใน 3 งานนี้กันแน่
- ต้องการ Markdown ที่พร้อมใช้กับ LLM? เลือก trafilatura ถ้าคุณต้องการแค่ text บทความที่สะอาด, เลือก Crawl4AI ถ้าคุณอยากได้ทั้ง CSS extraction และ JavaScript rendering ในไลบรารีเดียว, และเลือก Firecrawl ถ้าคุณต้องการบริการ self-hosted โดยเฉพาะ และรับมือทั้งไลเซนส์ AGPL-3.0 กับน้ำหนักแบบ 6 คอนเทนเนอร์ได้
- ต้องการเรนเดอร์ JavaScript? ใช้ Playwright หรือ Puppeteer สำหรับงานเรนเดอร์ดิบ ๆ — เลือกตามเอ็นจินและภาษา เพราะนอกนั้นถือว่าเสมอกัน — และใช้ Crawlee เมื่อคุณอยากให้การ orchestrate การ crawl ถูกส่งมาให้ครบ แทนที่จะต้องเขียนเอง
- ต้องการ crawl หน้า static หรือ API ที่ทำซ้ำได้ในสเกลใหญ่? ใช้ Scrapy ถ้าต้องการเฟรมเวิร์ก Python แบบครบชุด, ใช้ Colly ถ้าอยากได้ความเร็วแบบ Go ล้วนในไบนารีตัวเดียว, และใช้ Scrapling ถ้าปัญหาหลักของคุณคือการอยู่รอดเมื่อ markup เปลี่ยนบ่อย
เลือกเครื่องมือให้ตรงงาน แล้วทุกตัวในนี้ก็เป็นตัวเลือกที่สมเหตุสมผลทั้งหมด แต่ถ้าหยิบผิดหมวด — ใช้เครื่องมือเบราว์เซอร์กับหน้า static หรือใช้ HTTP parser กับเว็บแอปที่ต้องพึ่ง JavaScript — ต่อให้เป็นไลบรารีที่ได้คะแนนดีที่สุดบนอินเทอร์เน็ต ก็ยังเอาไม่อยู่
แล้ว managed AI API เหมาะตรงไหน

ทุกเครื่องมือข้างบนใช้ฟรี เป็นโอเพนซอร์ส และคุณรันเองได้ทั้งหมด นั่นก็คือข้อแลกเปลี่ยนร่วมที่การทดสอบนี้สะท้อนกลับมาซ้ำแล้วซ้ำเล่า: คุณต้องรับผิดชอบทั้ง environment ของเบราว์เซอร์, โค้ดสำหรับ crawl, การต่อสู้กับ anti-bot และงานดูแลทุกอย่าง สำหรับหลายทีม การควบคุมแบบนี้แหละคือเป้าหมาย และแผนที่ไลเซนส์ก็สำคัญมากเมื่อคุณตัดสินใจรับภาระนี้ — ส่วนใหญ่ในสนามนี้ค่อนข้าง permissive (Apache-2.0 สำหรับ Crawl4AI, Crawlee, Playwright, Puppeteer, และ Colly; BSD-3 สำหรับ Scrapy และ Scrapling) โดยมี Firecrawl ที่ core แบบ self-hosted ใช้ AGPL-3.0 ซึ่งต้องตรวจสอบจริงจังก่อนนำไปใช้เชิงพาณิชย์
แต่ลองสังเกตสิ่งที่ bench นี้เผยให้เห็นด้วย: สิ่งที่เครื่องมือเหล่านี้ ไม่ได้ ทำ ทั้งการเรนเดอร์, การ crawl, การจัดโครงสร้าง, และการหมุนหนีบล็อก — แทบไม่เคยครบทุกอย่างในคราวเดียว และไม่เคยปราศจากงานดูแลของคุณเอง managed AI scraping API จะยุบสแต็กทั้งหมดนั้นให้กลายเป็นการเรียกครั้งเดียว developer surface ของเราเองที่ Thunderbit เป็นหนึ่งในตัวเลือกนั้น และสำหรับคนสายเทคนิค สิ่งที่สำคัญคือ API, MCP server, และ CLI ไม่ใช่ browser extension POST /distill จะคืน Markdown ที่สะอาด และ POST /extract จะคืน JSON ตามสคีมา โดยให้ JavaScript rendering และ anti-bot ถูกจัดการฝั่งเซิร์ฟเวอร์แทนที่จะไปอยู่บนเครื่องคุณเอง มี MCP server ทางการสำหรับเอเจนต์และ coding assistant — thunderbit_suggest_fields ใช้ฟรีเพื่อวางแผนการ extract, จากนั้น thunderbit_distill (1 credit) และ thunderbit_extract (20 credits) จะลงมือทำงานให้ — และยังมี CLI ที่เรียกใช้ได้ด้วย npx @thunderbit/thunderbit-cli สำหรับงาน terminal และ cron jobs สำหรับคนที่ไม่ใช่ developer ในทีมก็มี Chrome extension แบบ no-code และ pricing ก็ครอบคลุมทั้งสองมิติ
ข้อแลกเปลี่ยนยังคงเหมือนเดิมกับสิ่งที่การทดสอบนี้วนกลับมาหา: คุณจะรันและดูแลไลบรารีสูงสุด 9 ตัวเองโดยไม่มีค่าใช้จ่ายต่อครั้ง หรือจะส่งต่อ plumbing ทั้งหมดแล้วจ่ายตามจำนวน request ไม่มีคำตอบไหนผิด มันขึ้นอยู่กับว่าคุณอยากเป็นเจ้าของสแต็กมากแค่ไหน ถ้าอยากดูตัวอย่างการดึงข้อมูลในทางปฏิบัติมากกว่า สามารถดูได้ที่ Thunderbit YouTube channel
บทสรุป
ไม่มี open-source scraper ที่ดีที่สุดเพียงตัวเดียว และลิสต์ไหนที่บอกคุณอย่างมั่นใจว่าใช่ ก็กำลังซ่อนคำถามจริงที่เป็นตัวตัดสินอยู่เงียบ ๆ นั่นคือคุณกำลังทำงานแบบไหนใน 3 งานนี้กันแน่ แปลงหน้าเว็บเป็นข้อความ, เรนเดอร์ JavaScript, หรือ crawl ให้เร็วโดยไม่ต้องใช้เบราว์เซอร์ — สนามนี้แบ่งออกได้ชัดเจนเป็น 3 กลุ่ม และภายในแต่ละกลุ่ม ตัวเลือกจะขึ้นอยู่กับภาษาและน้ำหนักการติดตั้ง มากกว่าการหาผู้ชนะสากลหนึ่งเดียว
ถ้าจะเอาแค่พฤติกรรมเดียวจากทั้งหมดนี้ ให้เอาไปคือ: ทดสอบกับหน้าเว็บจริงของคุณก่อนจะตัดสินใจผูกมัดกับอะไรสักอย่าง ตัวเลขทุกตัวในที่นี้สามารถทำซ้ำได้ใน benchmark repo ด้วยเหตุผลนี้พอดี — เพราะเครื่องมือที่นำบน roundup ทั่วไป กับเครื่องมือที่รอดบนเป้าหมายจริงของคุณ ไม่ใช่ตัวเดียวกันเสมอไป
ลอง Thunderbit สำหรับการดึงข้อมูลเว็บ Get Started Free
คำถามที่พบบ่อย
Web Scraper โอเพนซอร์สตัวไหนดีที่สุด? ไม่มีตัวเดียวที่ดีที่สุดเสมอไป — ขึ้นอยู่กับงาน ถ้าเป็น text พร้อมใช้กับ LLM ให้ดู trafilatura หรือ Crawl4AI; ถ้าต้องเรนเดอร์ JavaScript ให้ใช้ Playwright, Puppeteer หรือ Crawlee; ถ้าต้อง crawl HTTP ให้เร็ว ให้ดู Scrapy หรือ Colly บนสนามทดสอบเดียวกัน เครื่องมือแต่ละตัวแข็งที่สุดในหมวดของตัวเอง และอ่อนลงอย่างเห็นได้ชัดเมื่อออกนอกหมวด จึงไม่แปลกที่การจัดอันดับแบบเหมารวมจะทำให้เข้าใจผิด
Open-source scrapers ตัวไหนเรนเดอร์ JavaScript ได้? Crawl4AI, Firecrawl, Playwright, Puppeteer และ Playwright engine ของ Crawlee สามารถเรนเดอร์ JavaScript ได้ ส่วน Scrapy, Colly, trafilatura และ default HTTP fetcher ของ Scrapling ไม่ได้เรนเดอร์ — พวกมันต้องพึ่ง API ที่ทำซ้ำได้อยู่เบื้องหลังหน้าเว็บ (แนวทางของ Scrapy ซึ่งได้ 8/8 จาก JSON endpoint) หรือใช้โหมดเบราว์เซอร์แยกต่างหาก
จำเป็นต้องใช้ headless browser เพื่อ scrape เว็บไซต์ไหม? ใช้เฉพาะเมื่อข้อมูลปรากฏหลัง JavaScript ทำงานเท่านั้น ถ้า HTTP request ปกติบวก parser เข้าถึงเนื้อหาได้ เบราว์เซอร์จะเป็นของเกินที่ทั้งหนักและช้า — กรณีนั้น Scrapy, Colly หรือ Scrapling จะเบากว่าและเร็วกว่าเยอะ
ตัวไหนมีไลเซนส์เป็นมิตรกับการใช้เชิงพาณิชย์มากที่สุด? ส่วนใหญ่ค่อนข้าง permissive: Apache-2.0 (Crawl4AI, Crawlee, Playwright, Puppeteer, Colly) หรือ BSD-3-Clause (Scrapy, Scrapling) ข้อยกเว้นคือ core แบบ self-hosted ของ Firecrawl ซึ่งใช้ AGPL-3.0 และควรตรวจสอบเงื่อนไขไลเซนส์อย่างจริงจังก่อนสร้างผลิตภัณฑ์เชิงพาณิชย์บนมัน
ตัวเลข benchmark เหล่านี้ทำซ้ำได้จริงไหม? ได้ ทุก runner, fixture และ raw result อยู่ใน repo แบบสาธารณะที่ใช้ MIT license ข้อควรจำอย่างเดียวคือ recall และผลเชิงโครงสร้างเทียบข้ามเครื่องมือได้ แต่จำนวนอักขระแบบ absolute เทียบได้เฉพาะภายในเครื่องมือเดียว เพราะแต่ละชุดจำลอง fixture ของตัวเอง แทนที่จะใช้สำเนามาตรฐานชุดเดียวกัน ดังนั้นให้เปรียบเทียบอัตราและผลผ่าน/ไม่ผ่าน ไม่ใช่ยอดอักขระดิบ


