trafilatura เป็นเครื่องมือสกัดเนื้อหาแบบ Python ที่ไม่ต้องพึ่งเบราว์เซอร์ ในชุดตัวอย่างที่ติดป้ายกำกับไว้ในบทความนี้ คู่แข่งที่ให้คุณภาพการสกัดจาก HTML เดียวกันได้ใกล้เคียงที่สุดมีแค่ Mozilla Readability เท่านั้น: trafilatura ปล่อยให้โบลต์แวร์ที่ถูกระบุไว้หลุดมา 1 จาก 17 หน่วย ส่วน Readability หลุดมา 5 หน่วย เครื่องมือที่ต้องพึ่งเบราว์เซอร์จะถูกพูดถึงเฉพาะในแง่ขนาดการติดตั้ง และไม่ได้ถูกเอามาทดสอบคุณภาพบนหน้าเหล่านี้

หน้าที่หลักของมันคือดึงเนื้อหาหลัก: รับ HTML เข้ามา แล้วส่งออกข้อความและเมตาดาต้าในสไตล์บทความ โดยตัดส่วนประกอบรอบหน้าเว็บออกด้วยกฎเชิงฮิวริสติก มันบันทึกผลเป็น JSON และฟอร์แมตอื่น ๆ ได้ แต่ไม่ได้สร้างสคีมาระดับแถวที่ผู้ใช้กำหนดเอง หรือระเบียนแคตตาล็อกที่มีชนิดข้อมูลซ้ำ ๆ เวอร์ชันที่ทดสอบคือ 2.1.0 มันไม่รัน JavaScript และผลเทียบกับ Readability ก็ชี้ให้เห็นว่าเป็นการแลกกันระหว่างความสะอาดกับการเก็บเนื้อหา ไม่ใช่ชนะขาดทุกกรณี
trafilatura เหมาะกับงานแบบไหน และไม่ทำอะไร
trafilatura ระบุว่าตัวเองเป็นเครื่องมือ Python และ command-line สำหรับรวบรวมข้อความและเมตาดาต้าจากเว็บ — ครอบคลุมทั้งการ crawl, scraping และ extraction — โดยรองรับผลลัพธ์เป็น CSV, JSON, HTML, Markdown, TXT หรือ XML ฟังดูเหมือนทำได้สารพัด แต่ในทางปฏิบัติ แก่นจริงของมันแคบและชัดกว่านั้นมาก: มันรับเอกสาร HTML เข้ามา แล้วส่งกลับเฉพาะ เนื้อหาหลัก ที่ผ่านการตัดส่วนตกแต่งรอบหน้าแล้ว

ลองนึกภาพแบบนี้ เพราะมันช่วยอธิบายทั้งจุดแข็งและขอบเขตของมันได้ดีที่สุด สแครปเปอร์ส่วนใหญ่ที่คุณชี้ไปยังหน้าเว็บจะทำงานแบบ selector-driven — คุณบอกว่า “ดึง element ที่มีคลาส product-price” แล้วมันก็คืนค่าจากจุดนั้นเลย แต่ trafilatura ทำกลับด้าน มันอ่านทั้งเอกสารแล้ว ตัดสิน เองว่าบล็อกไหนคือบทความจริง บล็อกไหนคือโบลต์แวร์ โดยใช้ฮิวริสติกด้านเนื้อหา ไม่ใช่ selector ที่คุณเขียนเอง นั่นคือเหตุผลที่มันไม่ต้องมีกฎเฉพาะรายไซต์เพื่อทำความสะอาดหน้าเว็บ และนั่นก็เป็นเหตุผลเดียวกันที่มันไม่สามารถส่งโครงสร้างแคตตาล็อกแบบตารางให้คุณได้: ไม่มีสคีมา ไม่มีแถวแบบมีชนิดข้อมูล มีแค่ “นี่คือข้อความที่มีความหมาย” มันคือ extractor ไม่ใช่ parser แบบสั่งให้ไปดึงจุดใดจุดหนึ่ง
นอกจากนี้ยังไม่ต้องลง browser runtime แยกต่างหากด้วย แม้ dependency tree จะมี wheel สำหรับแพลตฟอร์มอย่าง lxml อยู่ ดังนั้นคำว่า “ไม่ต้องดาวน์โหลดเบราว์เซอร์” จึงไม่ควรเข้าใจว่าเป็นการติดตั้งแบบซอร์สล้วนหรือไม่มี native code เลย
การติดตั้ง: dependency น้อย ไม่ต้องลงเบราว์เซอร์
pip install trafilatura บน virtualenv ใหม่ใน Python 3.14 ติดตั้ง 17 แพ็กเกจ โดย wheel ที่ใหญ่ที่สุดที่บันทึกไว้คือ lxml ขนาด 8.6 MB ตาม pip-install-trafilatura.log ไม่ต้องติดตั้งเบราว์เซอร์แยก หรือรันคำสั่งหลังติดตั้งใด ๆ สำหรับ browser เพิ่มเติม
ถ้ามองในมุมสเกล ชุด Scrapling ในฐานวิจัยชุดเดียวกันนี้ต้องรัน pip แยกถึงสี่ครั้งกว่าจะใช้งาน fetcher ได้ และจบที่ 26 แพ็กเกจ โดยสองตัวในนั้นเป็น Playwright driver wheel ขนาด 42.2 MB (tools/scrapling/artifacts/logs/pip-install-scrapling.log) — ยังไม่รวมการดาวน์โหลดไบนารีเบราว์เซอร์ด้วยซ้ำ ส่วนชุด Crawlee วัดการดาวน์โหลด Chromium แยกต่างหากไว้ราว 81.7 MiB (tools/crawlee/research-materials.md) เครื่องมือเหล่านั้นทำงานคนละระดับ จึงไม่ใช่การแข่งกันแบบแฟร์ในแง่ความสามารถ; แต่มันบอกสิ่งที่ดิสก์และแคช CI ของคุณต้องแบกรับจริง ๆ เท่านั้น และเวอร์ชันที่ pip ส่งมาให้ผม (2.1.0) ตรงกับรุ่นปัจจุบันพอดี จึงไม่มีเครื่องหมายดอกจันว่า “ทดสอบของเก่า” อยู่ในตัวเลขด้านล่าง
ลงมือใช้: ตัว extractor คืนค่าอะไรจริง ๆ

ผมทดสอบมันกับ fixture ที่ตั้งใจสร้างมาให้ชนทั้งจุดแข็งและจุดอ่อน โดยเก็บผลลัพธ์ดิบไว้ใน benchmark repo เคสบทความคือเคสที่ทำให้ผมประทับใจที่สุด
ผมหยิบ fixture บทความจากเครื่องในเครื่อง แล้วเติม noise รอบเนื้อหาจริง: ข้อความชวนล็อกอิน, ป๊อปอัป “Subscribe”, ลิงก์นำทาง, ฟุตเตอร์ลิขสิทธิ์ — โบลต์แวร์มาตรฐานที่สแครปเปอร์แบบง่ายมักดูดติดมาพร้อมเนื้อหา trafilatura ส่งกลับ ชื่อเรื่องพร้อมย่อหน้าเนื้อหาทั้ง 3 จาก 3 ย่อหน้า และตัดสัญลักษณ์โบลต์แวร์ทั้งหมดออกไป ไม่ว่าจะเป็น Login, Subscribe หรือ Copyright ก็ไม่โผล่มาในผลลัพธ์ นอกจากนี้ยังดึง author และ date จากเมตาดาต้าของหน้าได้ถูกต้อง ผลลัพธ์เต็มทั้ง .txt, .md และ .json อยู่ใน results/local_article.json
HTML ชุดเดียวกันถูกส่งออกเป็น plain text, Markdown และ JSON บทความนี้ไม่ได้พิสูจน์ว่าทั้งสามฟอร์แมตมาจากการเรียกครั้งเดียวพร้อมกัน แต่เป็นการบันทึกผลลัพธ์คนละรูปแบบจากเส้นทาง extraction เดียวกัน JSON ตรงนี้เก็บข้อความและเมตาดาต้าที่สกัดมา ไม่ใช่ระเบียนซ้ำหลายแถวที่ผู้ใช้กำหนดเอง
นี่คือผลการรันรอบแรกทั้งหมดรวมไว้ที่เดียว เพื่อให้ตรวจสอบข้อกล่าวอ้างด้านบนได้ ไม่ต้องเชื่อกันลอย ๆ:
| Fixture | สิ่งที่ได้กลับมา | เวลา | หลักฐาน |
|---|---|---|---|
| บทความในเครื่อง ครอบด้วย nav / login / subscribe / copyright | ชื่อเรื่อง + 3/3 ย่อหน้า, ไม่มีโบลต์แวร์รั่วออกมา, author Thunderbit Research Lab, date 2026-07-09 | 0.007 s | local_article.json |
| แคตตาล็อกสินค้าบนเครื่อง | ชื่อสินค้า 12 รายการและราคา 12 รายการเป็นข้อความล้วน, 0 แถวที่มีโครงสร้าง, 478 ตัวอักษร | 0.064 s | local_catalog_extraction.txt |
| หน้าที่ย้อนกลับ HTTP 500 | fetch_url ส่งกลับ None, ไม่โยน exception | 30.012 s | local_failure_500.json |
| หน้า product ของ Books to Scrape (สาธารณะ) | ข้อความสะอาด 1,324 ตัวอักษร พร้อมคู่ Markdown | 0.753 s | public_books_product.txt / .md |
แต่ละแถวมาจาก artifacts/raw/trafilatura-test-summary.json ในชุด trafilatura — trafilatura 2.1.0, Python 3.14, macOS arm64, รันหนึ่งครั้งบนเครื่องหนึ่งเครื่อง ให้มองเวลาเหล่านี้เป็นข้อมูลที่สังเกตได้ ไม่ใช่ benchmark
บน fixture ที่ตอบ 500 fetch_url ส่งกลับ None หลังผ่านไปราว 30 วินาที ขณะที่ endpoint local ใกล้ ๆ ตอบเร็วมาก การรันครั้งนั้นยืนยันแค่ความหน่วง ไม่ได้บอกว่ามาจาก retry/backoff, timeout แบบตายตัว หรือเส้นทางภายในแบบอื่น บทความนี้ไม่ได้ตรวจสอบว่า fetch_url มีพารามิเตอร์ควบคุม timeout รายคำสั่งที่รองรับหรือไม่; วิธีควบคุมที่มีหลักฐานคือใช้ client ที่ผู้เรียกคุมได้เอง แล้วส่ง HTML ที่ได้เข้า trafilatura

การทดสอบชุดเดียวกันยังเผยให้เห็นข้อจำกัดอีกสามข้อด้วย
ข้อแรกและสำคัญที่สุด: trafilatura คือ content extractor ไม่ใช่ structured scraper ผมทดสอบกับ fixture แคตตาล็อกสินค้า มันคืนชื่อสินค้า 12 รายการ — เป็นข้อความ — และแถวแบบมีโครงสร้าง 0 แถว (478 ตัวอักษรของข้อความล้วน ตาม results/local_catalog_extraction.txt) ราคาแต่ละรายการก็ออกมาด้วย ตั้งแต่ $18.00 ไปจนถึง $51.00 วางอยู่คนละบรรทัดใต้ชื่อสินค้า ทุกอย่างที่คุณต้องการ อยู่ใน ผลลัพธ์ แต่ไม่มีอะไรถูกแยกเป็นฟิลด์ หากคุณต้องการ [{name, price, rating}, …] เครื่องมือนี้ไม่ใช่ตัวเลือกที่ถูก และการปรับแต่งใด ๆ ก็เปลี่ยนเรื่องนี้ไม่ได้ — นี่คือการออกแบบ ไม่ใช่บั๊ก

ข้อสอง: มันไม่เรนเดอร์ JavaScript มันอ่านเฉพาะ HTML แบบ static ถ้าคุณชี้มันไปที่หน้าแบบ client-rendered ก็จะได้แค่สิ่งที่เซิร์ฟเวอร์ส่งมาก่อน JS ทำงาน ซึ่งมักไม่ใช่เนื้อหาที่คุณต้องการ ถ้าเป้าหมายของคุณพึ่ง JS หนัก ๆ ต้องจับมันคู่กับตัว renderer แยกต่างหาก trafilatura ไม่ได้ทำส่วนนั้นให้
ข้อสาม เป็นข้อควรระวังจากหลักฐานของผมเอง: การทดสอบ public extraction ครั้งแรกใช้ บล็อกคำอธิบายสินค้า ไม่ใช่บทความข่าวจริง เพราะ sandbox สาธารณะไม่มีหน้า news บทความด้านบนที่ว่าด้วยการทำความสะอาดบทความมาจาก fixture local ที่ควบคุมได้ ผมเชื่อผลลัพธ์นั้น — การตัดโบลต์แวร์ชัดมาก — แต่ไม่อยากเอาหน้าสินค้ามาแต่งเป็นหลักฐานว่าเครื่องมือนี้ดึงข่าวได้ระดับ newsroom จึงเก็บไว้เป็นช่องว่างที่ยังไม่ปิด ต่อมามีการรันซ้ำในวันที่ 2026-07-14 และปิดช่องว่างนั้นได้ ผลอยู่ในส่วนถัดไป
ตรวจความสะอาดบนหน้าเว็บจริง

ดึงหน้าเว็บจริง 2 หน้าเพียงครั้งเดียว บันทึกเป็น fixture แบบออฟไลน์พร้อม hash SHA-256 แล้วรันซ้ำโดยไม่ต่อเน็ต ไม่มีการบันทึกเวลา หรือ ground truth แบบติดป้ายกำกับ นี่คือการตรวจความสะอาดของโบลต์แวร์บนหน้าเว็บจริง ไม่ใช่คะแนน fidelity
| Real-article fixture | HTML ดิบ | Body ที่สกัดได้ | Body/raw | ตัวบ่งชี้ส่วนตกแต่งที่ถูกตัดออก | title | date | hostname | author | sitename |
|---|---|---|---|---|---|---|---|---|---|
| Wikipedia, "Web scraping" | 230,049 bytes | 26,673 bytes | 0.116 | 4 จาก 4 | yes | 2005-09-17 | wikipedia.org | null | null |
| Wikinews, "7th Heaven" (archived) | 79,716 bytes | 2,200 bytes | 0.028 | 5 จาก 5 | yes | 2005-11-29 | wikinews.org | null | null |
ทั้งสองแถวมาจาก artifacts/results/trafilatura-fidelity-summary.json ตัวบ่งชี้ที่ตรวจคือ "Jump to content", "Privacy policy", "Powered by MediaWiki", "This page was last edited" และบนหน้า Wikinews ยังมี "free news source" ด้วย — ถูกตัดออกหมด ไม่รั่วมาสักตัวบนทั้งสองหน้า
อัตราส่วน body/raw ใช้วัดการลดทอน ไม่ใช่ความถูกต้อง เนื้อหาบทความที่ถูกละไว้ไม่ได้ถูกให้คะแนน author และ sitename เป็น null บนเทมเพลต MediaWiki ทั้งสองหน้า ส่วน fixture local ที่ควบคุมได้ให้ author มา กรณีนี้เป็นการพลาดเฉพาะ MediaWiki ที่สังเกตได้จากการทดสอบ ไม่ใช่หลักฐานว่าการดึง byline โดยทั่วไปแย่ วันที่ที่สกัดออกมาถูกบันทึกตามที่ระบบส่งกลับมา และไม่ได้ตรวจสอบเทียบกับ ground truth
ตัวสกัดสองตัว ใช้ HTML เดียวกัน และสคริปต์ให้คะแนนตัวเดียว

ในฐานวิจัยชุดนี้ มีการเปรียบเทียบ trafilatura กับอีกเครื่องมือบนชุดทดสอบเดียวกันเพียงครั้งเดียว และ pack ของ trafilatura เองไม่ได้สร้างการเปรียบเทียบนั้นขึ้นมา แต่เป็น pack ของ mozilla-readability ที่ทำไว้ในบทบาท control arm: 22 fixture ที่ติดป้ายกำกับด้วยมือ โดยทุก text block ถูกแท็กเป็น ARTICLE หรือ BOILERPLATE และทุกคำมี sentinel token เฉพาะ ทำให้คำที่สกัดได้แต่ละคำย้อนกลับไปยังบล็อกที่ติดป้ายไว้ได้แบบหนึ่งต่อหนึ่ง ทั้งสองเครื่องมือได้ HTML bytes ชุดเดียวกัน Readability รันบน jsdom 29.1.1 บน Node v22.22.3 ส่วน trafilatura ใช้ parser ของตัวเอง
| Metric (micro-averaged, content-fidelity set) | trafilatura 2.1.0 | @mozilla/readability 0.6.0 | หลักฐาน |
|---|---|---|---|
| Article units recovered | 40 จาก 40 | 40 จาก 40 | comparison.json |
| Boilerplate units leaked | 1 จาก 17 | 5 จาก 17 | comparison.json |
| Boilerplate tokens contaminating the output | 3 | 41 | comparison.json |
| Token precision | 0.939 | 0.902 | comparison.json |
| Token F1 | 0.969 | 0.948 | comparison.json |
Non-prose recall, f6_nonprose fixture | 7 จาก 8 | 8 จาก 8 | comparison.json |
Very short article, f3_short_120 F1 | 0.571 | 0.800 | comparison.json |
แหล่งข้อมูล: tools/mozilla-readability/artifacts/raw/comparison.json ในฐานวิจัยนี้ — 11 fixture ในชุด content-fidelity, 40 article units และ 17 boilerplate units ทั้งหมดเป็น fixture สังเคราะห์ที่ตั้งน้ำหนักไปทางกรณีท้าทายโดยตั้งใจ จึงควรมองว่าเป็นภาพเชิงกลไก ไม่ใช่การจัดอันดับของคอร์ปัสจริง
ไม่มีเครื่องมือไหนชนะทุกด้าน และช่องว่างระหว่างกันคือส่วนที่น่าสนใจ trafilatura เก็บ chrome ออกได้ดีกว่า — บล็อกที่รั่ว 1 เทียบกับ 5 ของ Readability, token ที่ปน 3 เทียบกับ 41 นี่คือฝั่งความแม่นของ “ข้อความบทความที่สะอาด” และเป็นฝั่งที่ตัดสินว่าหน้าต่างบริบทของ LLM ของคุณจะเต็มไปด้วยลิงก์ไซด์บาร์หรือไม่ แต่ Readability ก็เก็บเนื้อหาบางส่วนที่ trafilatura ทิ้งไป: บน fixture non-prose trafilatura ตัด <figcaption> ออก ในขณะที่ Readability เก็บไว้ และบนบทความที่สั้นมากมันได้ 0.571 เทียบกับ 0.800 ของ Readability การทำความสะอาดเข้ม ๆ จึงเป็นการแลก ไม่ใช่ชัยชนะฟรี ถ้าคอร์ปัสของคุณเต็มไปด้วยบทความสั้น คำบรรยายภาพ และหน้าที่มีตารางเยอะ การแลกแบบนี้อาจไม่คุ้ม
เอาการเปรียบเทียบนี้ไปใช้เลือกเครื่องมืออย่างไร
เริ่มจากระบุว่าความผิดพลาดแบบไหนแพงกว่าสำหรับ pipeline ของคุณ ถ้าส่วนตกแต่งของหน้าเว็บกิน token downstream หรือทำให้ผลค้นหาปนเปื้อน น้ำหนักควรไปอยู่ที่การรั่วของ boilerplate unit และ token ที่ปนเข้ามา ถ้าการตัดคำบรรยาย บทความสั้น หรือบล็อกที่ไม่ใช่ prose ออกไปเป็นเรื่องยอมรับไม่ได้ น้ำหนักควรไปอยู่ที่ content recall ตามลักษณะหน้า ชุด fixture เดียวกันทำให้การแลกนี้มองเห็นได้ แต่ไม่ได้บอกน้ำหนักที่ถูกต้องสำหรับคลังข่าว เอกสาร หรือ retrieval pipeline ของคุณ
บริบทการ stress-test ที่กว้างกว่านี้อยู่ใน การเปรียบเทียบหน่วยความจำและ HTML ที่มีรูปแบบเสียของไลบรารี 10 ตัว
ควรทำ bake-off จาก HTML ที่บันทึกไว้ ไม่ใช่ URL สด เพื่อให้ทั้งสอง extractor ได้ bytes ชุดเดียวกัน ใส่ทั้งบทความยาวแบบปกติ, ข่าวสั้น, ชิ้นงานที่เต็มไปด้วย caption, เอกสารที่มีตารางหรือโค้ดเยอะ และเทมเพลตจากสำนักพิมพ์ที่คุณ ingest จริง ติดป้ายกำกับเนื้อหาที่จำเป็นไม่กี่หน่วยและบล็อกโบลต์แวร์ที่รู้แน่ก่อนรันเครื่องมือใดเครื่องมือหนึ่ง จากนั้นแยกคะแนนเป็น output ว่าง, การดึงหน่วยที่จำเป็นกลับมา, การรั่วของหน่วยที่ไม่ต้องการ และฟิลด์เมตาดาต้า คะแนนคุณภาพก้อนเดียวอาจซ่อนโหมดความล้มเหลวที่สำคัญในงานจริง
ควรตรวจสัญญาการส่งออกฝั่ง downstream ด้วย JSON ของ trafilatura สามารถพกพาเนื้อหาที่สกัดและเมตาดาต้าได้ แต่ JSON serialization ไม่ใช่สคีมาแถวแบบมีชนิดข้อมูลที่ผู้ใช้กำหนด สำหรับข้อความบทความ ควรตรวจความยาวเนื้อหาขั้นต่ำและ marker ที่จำเป็น แทนที่จะยอมรับทุก output ที่ไม่ว่าง สำหรับเมตาดาต้า ให้แยกให้ออกว่าขาดหายหรือค่าผิด และเก็บ source URL กับเวอร์ชันการสกัดไว้เพื่อให้ย้อนรันได้
การดึงข้อมูลควรถูกทดสอบเป็นอีกชั้นหนึ่ง การสังเกตความล้มเหลว 30 วินาทีบน local นั้นเป็นของ fetch_url ไม่ใช่ของ extraction จาก HTML ที่ถืออยู่แล้ว และกลไกภายในไม่ได้ถูกพิสูจน์ ถ้าคุณต้องคุม deadline, retry, authentication หรือ proxy policy ให้ใช้ client ที่คุณควบคุมพฤติกรรมได้ บันทึก response bytes สุดท้าย แล้วส่ง bytes เหล่านั้นเข้า extractor วิธีนี้แยกความล้มเหลวของการ acquisition ออกจากความล้มเหลวของการเลือกเนื้อหา และทำให้เปรียบเทียบซ้ำได้
สุดท้าย วัดคุณสมบัติการใช้งานจริงบนแพลตฟอร์มที่ตั้งใจใช้ การติดตั้ง Python 3.14 จำนวน 17 แพ็กเกจไม่ต้องใช้เบราว์เซอร์แยก แต่ไม่ได้บอก throughput, การโตของหน่วยความจำ, ความพร้อมของ wheel บนทุกสถาปัตยกรรม หรือพฤติกรรมเมื่อรันพร้อมกันหลาย worker บทความนี้พิสูจน์กลไกด้าน precision/retention ที่มีประโยชน์เมื่อเทียบกับ Readability; ส่วนความเหมาะสมต่อ production ยังขึ้นกับคอร์ปัสและการทดสอบ runtime
ถ้าต้องการเช็กจากภายนอกที่ไม่ใช่งานของฐานวิจัยชุดนี้เอง หน้า evaluation ของ trafilatura และ ScrapingHub article-extraction-benchmark สาธารณะ ต่างก็วัดว่ามันเหนือกว่า readability-lxml ใน word-F1 บนหน้าเว็บจริงราว 181 หน้า — ไปในทิศทางเดียวกับตารางด้านบน ข้อควรระวังอย่างหนึ่งที่บทความจำนวนมากที่อ้าง benchmark นี้มักไม่พูดถึง: ค่า F1 ของ trafilatura ที่ถูกอ้างบ่อย (~0.945) ผูกกับสาย 0.5.1 รุ่นเก่า ไม่ใช่ 2.1.0 ที่ทดสอบในที่นี้
ข้อดีและข้อเสีย
ข้อดี:
- รั่วของโบลต์แวร์ที่ติดป้ายกำกับไว้น้อยกว่า Readability ในชุด fixture เดียวกัน: 1 บล็อกจาก 17 เทียบกับ 5
- ดึง author และ date ได้ถูกต้องบน fixture local และดึง title/date/hostname ได้บนหน้าเว็บจริงทั้งสองหน้า
- HTML เดียวกันสามารถส่งออกเป็น text, Markdown หรือ JSON ได้
- ติดตั้ง 17 แพ็กเกจ และไม่ต้องมี runtime เบราว์เซอร์แยก
- ความล้มเหลวแบบเงียบ:
fetch_urlคืนNoneเมื่อเจอ HTTP 500 แทนการ throw - เวอร์ชันที่ทดสอบตรงกับรุ่นล่าสุด (2.1.0) — ไม่มีปัญหาเวอร์ชันห่างจากปัจจุบัน
- ใบอนุญาต Apache-2.0 — ใช้งานเชิงพาณิชย์ได้ค่อนข้างสบาย
ข้อเสีย:
- ไม่ใช่ structured scraper: การทดสอบแคตตาล็อกคืนชื่อ 12 รายการและราคา 12 รายการเป็นข้อความ แต่ได้ 0 แถวที่มีโครงสร้าง ไม่มีสคีมา ไม่มีฟิลด์
- ไม่เรนเดอร์ JavaScript — รองรับเฉพาะ static HTML; ถ้าเป็นหน้า client-side ต้องพึ่ง renderer แยก
authorและsitenameกลับมาเป็น null บนหน้า MediaWiki จริงทั้งสองหน้า ดังนั้นการดึง byline ไม่ได้การันตีเสมอไป- การทำความสะอาดแบบเข้มมีต้นทุน: มันตัด
<figcaption>ที่ Readability เก็บไว้ และได้ 0.571 เทียบกับ 0.800 ของ Readability บนบทความที่สั้นมาก - การตอบกลับ HTTP 500 แบบเงียบใช้เวลา 30.012 วินาทีถึงจะได้
None; ถ้าต้องควบคุม deadline ให้ใช้ fetcher ที่ผู้เรียกคุมได้ - ไม่ได้ทดสอบฟังก์ชัน crawl/sitemap ในตัว และฟอร์แมต CSV/XML ในรอบนี้ จึงไม่ขออ้างคุณสมบัติส่วนนี้
เหมาะกับใคร — และใครควรข้าม
trafilatura ถูกออกแบบมาสำหรับการสกัดเนื้อหาหลักแบบบทความ เหมาะกับการสร้าง text corpus, คลังบทความอ่านง่าย หรืออินพุต NLP จาก HTML แบบ static เมื่อการทำความสะอาดเชิงฮิวริสติกเป็นสิ่งที่ยอมรับได้ การเปรียบเทียบ fixture ที่ใช้ร่วมกันสนับสนุนว่ามันรั่วโบลต์แวร์น้อยกว่า Readability ขณะที่ Readability เก็บกรณีสั้นและกรณี non-prose ได้มากกว่า
ควรข้ามมันถ้าสิ่งที่คุณต้องการจริง ๆ คือการดึงข้อมูลแบบมีโครงสร้าง — แถวสินค้าที่มีราคา, ระเบียนแบบ typed, ฟิลด์ key: value — เพราะมันให้ข้อความ ไม่ใช่ตาราง (การทดสอบแคตตาล็อกได้ชื่อครบ 12 และราคา 12 รายการ แต่ไม่ได้แถวสักแถว) และควรข้ามเช่นกันถ้าเป้าหมายของคุณเรนเดอร์เนื้อหาบนเบราว์เซอร์และคุณไม่อยากเพิ่ม renderer แยก เพราะ trafilatura อ่าน static HTML แล้วหยุดแค่นั้น และคิดให้ดีถ้าคอร์ปัสของคุณส่วนใหญ่เป็นบทความสั้น, caption ของรูป, หรือหน้าที่มีตารางเยอะ: บน fixture ที่ติดป้ายกำกับไว้ นั่นคือจุดที่การทำความสะอาดของมันตัดเนื้อหาจริงทิ้ง (F1 0.571 บนบทความสั้นมาก, และตัด <figcaption> ออก) เลือกเครื่องมือให้ตรงงาน: ถ้าต้องการข้อความเต็มของบทความ ใช่; ถ้าต้องการ JSON แบบมีโครงสร้าง, หน้า JS, หรือโพสต์สั้น 100 คำ ควรมองหาอย่างอื่น
ทางเลือกอื่น รวมถึง Thunderbit อยู่ตรงไหน
trafilatura เป็นไลบรารีแบบ self-hosted ภายใต้ Apache-2.0 ไม่มีค่าธรรมเนียมต่อการเรียกจากผู้ให้บริการ; แต่ compute, bandwidth, การ fetch, monitoring และ maintenance ยังเป็นต้นทุนของผู้ดูแลเอง มันเหมาะกับการสกัดเนื้อหาแนวบทความจาก HTML ที่ป้อนเข้าไป แต่ไม่รองรับการรันเบราว์เซอร์หรือสคีมาระเบียนซ้ำที่ผู้ใช้กำหนดเอง
หากต้องการดู fixture เดียวกันทั้ง 6 extractor ดู การเปรียบเทียบการสกัดของไลบรารี 6 ตัว
บริการแบบ managed สามารถวาง acquisition, rendering และการจัดสคีมาไว้หลังขอบเขตของผู้ให้บริการได้ เราสร้าง Thunderbit ขึ้นมา แต่ไม่ได้รันมันกับ fixture เหล่านี้ ดังนั้นบทความนี้จึงไม่ใช้เป็นการเปรียบเทียบด้านคุณภาพ, rendering, latency, anti-bot หรือค่าใช้จ่าย การตัดสินใจจึงเป็นระหว่างการคุม HTML-to-content ด้วยตัวเองแบบ self-hosted กับการใช้บริการที่มีทั้ง acquisition และ structured extraction แบบ hosted
รีวิว benchmark ที่เกี่ยวข้อง: บทความเปรียบเทียบ open-source scrapers แบบเต็ม, รีวิว Crawl4AI แบบใช้ browser และ Markdown, และ รีวิว Firecrawl แบบ self-hosted Markdown
ลองใช้ Thunderbit สำหรับการดึงข้อมูลเว็บ
บทสรุป
ควรพิจารณา trafilatura เมื่อโจทย์คือการสกัดเนื้อหาแนวบทความจาก HTML แบบ static และคุณให้ความสำคัญกับการตัดโบลต์แวร์ที่ติดป้ายกำกับไว้ออกไป บน fixture ที่ใช้ร่วมกัน มันรั่วโบลต์แวร์ที่ถูก annotate เพียง 1 หน่วย เทียบกับ 5 หน่วยของ Readability ข้อได้เปรียบนี้แลกมากับการเก็บเนื้อหาที่ต่ำลงใน fixture ที่สั้นมากและ non-prose ดังนั้นรูปร่างของคอร์ปัสควรเป็นตัวตัดสิน
มันไม่รัน JavaScript และไม่ส่งออกแถวซ้ำแบบที่ผู้ใช้กำหนดเอง บนหน้า MediaWiki สองหน้า author และ sitename เป็น null ซึ่งเป็นข้อสังเกตเฉพาะเทมเพลต Readability เก็บ caption ที่ trafilatura ตัดทิ้ง และทำคะแนนสูงกว่าบน fixture ที่ชื่อ f3_short_120; หลักฐานที่เห็นสนับสนุนว่า “F1 ต่ำกว่าบน fixture ที่สั้นมาก” ไม่ได้บอกว่าจำนวนตัวอักษรน้อยหรือผลลัพธ์เสียหาย
ลองใช้ Thunderbit สำหรับการดึงข้อมูลเว็บ Get Started Free
คำถามที่พบบ่อย
trafilatura ส่งออกโครงสร้างแบบไหน?
มันสามารถบันทึกเนื้อหาที่สกัดและเมตาดาต้าเป็น JSON, Markdown, text, HTML, XML หรือ CSV ได้ นั่นคือการ serialize แบบมีโครงสร้าง แต่ไม่ใช่สคีมาระเบียนซ้ำที่ผู้ใช้กำหนดเอง เช่น ชื่อสินค้า ราคา และเรตติ้ง ฟิกซ์เจอร์แคตตาล็อกคืนค่าเป็นเนื้อหาล้วน ไม่ใช่แถวแบบ typed
trafilatura ดึงแคตตาล็อกสินค้าออกมาเป็นแถวแบบมีโครงสร้างได้ไหม?
ไม่ได้ มันคือ content extractor ไม่ใช่ structured scraper บน fixture แคตตาล็อก มันคืนชื่อสินค้า 12 รายการเป็นข้อความล้วน และ 0 แถวที่มีโครงสร้าง — ชื่อสินค้าปรากฏอยู่ในผลลัพธ์ แต่ไม่ได้เป็นฟิลด์ หากคุณต้องการระเบียนแบบมีชนิดข้อมูล เช่น name/price/rating ให้ใช้ parser แบบ selector-driven หรือ API ที่ออกแบบมาสำหรับ extraction ตามสคีมาแทน
trafilatura เรนเดอร์ JavaScript ไหม?
ไม่ มันอ่านเฉพาะ HTML แบบ static ถ้าชี้ไปยังหน้าแบบ client-rendered คุณจะได้แค่สิ่งที่เซิร์ฟเวอร์ส่งมาก่อน JS ทำงาน ซึ่งมักไม่ใช่เนื้อหาที่ต้องการ หากเป้าหมายของคุณพึ่ง JS หนัก ให้ใช้ร่วมกับ renderer แยกต่างหาก
trafilatura ติดตั้งยากไหม?
ใน virtualenv ของ Python 3.14 ที่ทดสอบ การติดตั้งดึงมา 17 แพ็กเกจ และไม่ต้องใช้ browser runtime แยก wheel ที่ใหญ่ที่สุดคือ lxml ขนาด 8.6 MB แยกต่างหาก มีการเรียก 500 local ครั้งหนึ่งใช้เวลา 30.012 วินาทีกว่าจะคืน None; ถ้าต้องการ deadline ที่ยืนยันได้ ให้ใช้ HTTP client ที่คุณควบคุมได้เอง
trafilatura ใช้เชิงพาณิชย์ได้ฟรีไหม?
ได้ ใบอนุญาตคือ Apache-2.0 ซึ่งเปิดกว้างและเป็นมิตรกับการใช้งานเชิงพาณิชย์ อย่างไรก็ตามควรตรวจสอบใบอนุญาตปัจจุบันใน repo ก่อนนำไปต่อยอด


