Epublifier - เครื่องมือสแครปหน้าเว็บ (หนังสือ, คู่มือ) สำหรับอ่านแบบออฟไลน์
(github.com/maoserr)- Epublifier เป็นส่วนขยายเบราว์เซอร์ที่ดึงรายการหน้า HTML จากเว็บไซต์ คอมไพล์เป็นหนังสือ ePub และให้ผู้ใช้นำไปใส่ใน eReader ที่เลือกได้
- ผู้ใช้ขั้นสูงที่เขียน JavaScript ได้สามารถเพิ่ม parser definition เพื่อปรับแต่งวิธีพาร์สสำหรับเว็บไซต์เฉพาะได้
- รองรับ Novel Update, Wuxia World, เว็บไซต์จำนวนมากใน awesome-read-the-docs, เว็บไซต์แบบกำหนดเองที่ใช้สารบัญ UL/OL · regex กับข้อความลิงก์ · query selector และ เว็บแอปแบบกำหนดเอง ที่มีองค์ประกอบชื่อเรื่องและปุ่ม Next
- เนื่องจากทำงานในเบราว์เซอร์ จึงประมวลผลหน้าเว็บจากเว็บไซต์ที่สร้างหรือดึงข้อความแบบไดนามิกด้วย JavaScript ได้ และมี การสแครปผ่าน UI ที่ให้เลือกองค์ประกอบหลักด้วยการคลิกเมาส์
- ไม่ได้มีเป้าหมายเพื่อเป็นงานเบื้องหลังที่รันซ้ำ ๆ หรือสแครปเปอร์เฉพาะทางที่ทนทาน และสำหรับเว็บไซต์ที่โปรแกรมอื่นจัดการได้ดีอยู่แล้ว ก็ยากที่จะคาดหวังประสิทธิภาพที่ดีกว่าเครื่องมือที่มีการตั้งค่าเฉพาะ
Epublifier ทำอะไร
- Epublifier เป็นเครื่องมือสำหรับแปลงเว็บไซต์เป็น ePub
- ดึงรายการหน้า HTML จากเว็บไซต์ แล้วคอมไพล์เป็นหนังสือ ePub เพื่อให้ผู้ใช้นำไปใส่ใน eReader ที่ต้องการได้
- ผู้ใช้ที่เขียน JavaScript ได้สามารถเพิ่ม parser definition เพื่อปรับแต่งการพาร์สเว็บไซต์ใด ๆ ได้
- ดูวิธีใช้งานได้ที่ wiki
เว็บไซต์และโครงสร้างหน้าที่รองรับ
- ปัจจุบันรองรับดังต่อไปนี้
-
Novel Update
-
Wuxia World
- เว็บไซต์จำนวนมากที่อยู่ใน awesome-read-the-docs
- เว็บไซต์แบบกำหนดเองที่ใช้ element UL/OL เป็นสารบัญ
- เว็บไซต์แบบกำหนดเองที่ใช้ regex หรือ query selector กับข้อความลิงก์
- เว็บแอปแบบกำหนดเอง ที่มีองค์ประกอบหัวเรื่อง (header) ที่กำหนดไว้ล่วงหน้า และมีปุ่ม Next ที่คลิกได้
-
การติดตั้ง
- ส่วนขยาย Firefox ติดตั้งได้จาก Firefox Add-ons
- ส่วนขยาย Chrome ติดตั้งได้จาก Chrome Web Store
ตัวอย่างการใช้งาน
- มีตัวอย่าง การดึงรายการหน้า จาก Novel Update
- มีตัวอย่างการตามปุ่ม Next ใน Wuxia World เพื่อ ไล่ดูเว็บแอป
- มีตัวอย่าง การดึงเอกสาร จากเว็บไซต์เอกสารอื่น ๆ เช่นเอกสาร FastAPI
เหตุผลที่ทำเป็นส่วนขยายเบราว์เซอร์
- เครื่องมือนี้มีไว้สำหรับ สร้าง ePub แบบเฉพาะกิจ จากเว็บไซต์ที่สแครปได้ไม่ดีด้วยสคริปต์ CLI แบบ request-based ดั้งเดิม หรือส่วนขยาย Chrome บางตัวที่สแครปจากแท็บ/หน้าต่างที่เปิดอยู่
- สแครปเปอร์ CLI หรือส่วนขยายอื่น ๆ ที่มีอยู่มักปรับให้เข้ากับเว็บไซต์ที่กำหนดไว้ล่วงหน้า และอาจไม่เหมาะกับเว็บไซต์ที่อยู่นอกขอบเขตนั้น
- เครื่องมือบางตัวต้องตั้งค่าหรือเขียนโค้ดไม่น้อย
- บางเว็บไซต์สร้างหรือดึงข้อความแบบไดนามิกด้วย JavaScript จึงจำเป็นต้องให้เบราว์เซอร์รัน JavaScript
- จุดนี้คือช่องว่างสำคัญที่สุดที่ทำให้สร้าง Epublifier ขึ้นมา
- เนื่องจากทำงานในเบราว์เซอร์ จึงอาจมีโอกาสถูกตรวจจับหรือบล็อกน้อยลง
วิธีใช้งานที่ตั้งใจไว้และข้อจำกัด
- Epublifier ไม่ใช่เครื่องมือสำหรับใช้เป็นสแครปเปอร์ที่ทนทาน หรือ งานเบื้องหลังตามกำหนดเวลาที่รันซ้ำ ๆ
- เหตุผลที่ออกแบบให้เลือกองค์ประกอบหลักที่จะสแครปผ่าน UI ก็สอดคล้องกับรูปแบบการใช้งานนี้
- เป้าหมายคือ ความอเนกประสงค์ เพื่อให้สแครปได้ค่อนข้างง่ายแม้ไม่มีการตั้งค่าเฉพาะรายเว็บไซต์ เพียงคลิกเมาส์ไม่กี่ครั้ง
- หากเว็บไซต์นั้นมีโปรแกรมหรือส่วนขยายอื่นจัดการได้ดีอยู่แล้ว เครื่องมือเหล่านั้นถูกตั้งค่าให้เหมาะกับเว็บไซต์นั้น ดังนั้น Epublifier จะไม่ได้ทำงานได้ดีกว่า
- เหมาะกับกรณีที่ต้องการสแครปเว็บไซต์ใดเว็บไซต์หนึ่งเพียงครั้งหรือสองครั้ง โดยไม่ต้องใช้เวลามากกับการเขียนโค้ดหรือการตั้งค่า
การบิลด์
- สภาพแวดล้อมบิลด์คือ Windows 10 และ NPM 8.1.2
- ขั้นตอนการบิลด์มีดังนี้
- ติดตั้ง NPM
- รัน
npm installในไดเรกทอรีหลัก - รัน
npm run build_ffสำหรับ Firefox - รัน
npm run buildสำหรับ Chrome
คอมโพเนนต์ที่ใช้
- ใช้ jEpub สำหรับการสร้าง ePub
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เหตุผลที่ส่วนขยายนี้ต่างจากสแครปเปอร์ตัวอื่น ๆ คือมันเป็นเครื่องมือสำหรับ สร้าง EPUB แบบเฉพาะกิจ จากไซต์ที่สแครปด้วยสแครปเปอร์แบบดั้งเดิมได้ไม่ดี
โดยปกติสแครปเปอร์บน command line หรือส่วนขยายอื่น ๆ มักมีไซต์ที่รองรับกำหนดไว้ล่วงหน้า หรือต้องตั้งค่า/เขียนโค้ดค่อนข้างมาก
อีกทั้งบางไซต์สร้างหรือดึงเนื้อหาแบบไดนามิกด้วย JavaScript จึงต้องให้เบราว์เซอร์รัน JavaScript เอง ซึ่งเป็นช่องว่างที่ใหญ่ที่สุด
เพราะมันทำงานอยู่ในเบราว์เซอร์ โอกาสถูกตรวจจับหรือบล็อกก็อาจต่ำกว่า
จุดประสงค์ไม่ใช่ให้ใช้แบบทนทานเหมือนงานเบื้องหลังที่ตั้งเวลาให้รันซ้ำ ๆ ดังนั้นจึงมี UI สำหรับเลือกองค์ประกอบหลักที่จะสแครป
เป็นเครื่องมือที่ตั้งใจลดเวลาสำหรับการสแครปครั้งเดียวหรือสองครั้งด้วยการคลิกเมาส์ไม่กี่ครั้ง โดยไม่ต้องมีการตั้งค่าสำหรับไซต์เฉพาะ และถ้าเป็นไซต์ที่โปรแกรมหรือส่วนขยายอื่นจัดการได้ดีอยู่แล้ว ใช้เครื่องมือพวกนั้นน่าจะดีกว่า
ผมสร้างมันขึ้นมาเพราะผมไม่ค่อยอยู่กับไซต์เดิมนาน ๆ
ในฐานะคนที่เคยทำของคล้าย ๆ กันเอง ส่วนที่น่าสนใจของเครื่องมือนี้คือ UI สำหรับปรับกระบวนการดึงเนื้อหาจากไซต์ใด ๆ ซ้ำ ๆ
การจัดการกระบวนการดึงข้อมูลทั้งหมดผ่าน GUI ทำให้ยืดหยุ่นกว่าวิธีทั่วไปมาก
ถ้าจัดการไซต์ที่ทุกส่วนซ่อนอยู่หลัง accordion UI และต้องกางออกถึงจะเห็น แถมเมื่อกางส่วนหนึ่งแล้วส่วนอื่นพับกลับ ได้ก็คงเจ๋งมาก
ตอนนี้ผมก็กำลังทำของที่คล้ายกันมากอยู่
สร้าง เว็บสแครปเปอร์ และตัวแยกวิเคราะห์ EPUB สำหรับบล็อกและโดยหลัก ๆ คือเว็บโนเวล แล้วบันทึกข้อมูลลงฐานข้อมูลพร้อมหมวดหมู่และแท็ก
รวมถึงทำ PWA สำหรับอ่านออฟไลน์ที่ช่วยติดตามความคืบหน้าในการอ่านหลาย ๆ เรื่อง และเก็บหลายเวอร์ชันของเรื่องเดียวกันได้ เช่น เว็บโนเวลกับ EPUB ฉบับตีพิมพ์
Calibre รองรับไซต์จำนวนมหาศาล
https://github.com/JimmXinu/FanFicFare
https://github.com/JimmXinu/FanFicFare/wiki/SupportedSites
ก่อนหน้านี้ผมเคยทำ Kindle-send[0] ที่คล้ายกันเพื่อส่งบล็อกไปยัง Kindle และภายในใช้ readability
ตอนนี้ใช้ส่งบล็อก หนังสือ และบางครั้งก็อาร์ไคฟ์ทั้งเว็บไซต์ได้ด้วย และยังใช้จากสคริปต์ได้
เพราะสามารถส่งออกไฮไลต์จาก Kindle ไปยัง Obsidian ได้ การสร้าง EPUB แบบนี้จึงมีข้อดีคือรวมไฮไลต์ไว้ในที่เดียวได้
แม้ชื่อจะเป็น kindle-send แต่ถ้าเป็น e-book reader ที่ใช้อีเมลเป็นวิธีส่งหนังสือ ก็ส่งไปได้หมด
[0] https://github.com/nikhil1raghav/kindle-send
ผมเคยทำของคล้ายกันสำหรับเทอร์มินัล Unix โดยรองรับเว็บเพจ, Gopher และ Gemini: Offpunk
https://sr.ht/~lioploum/offpunk/
แทนที่จะเป็น EPUB แคชจะเก็บ Gopher เป็นไฟล์ข้อความ, Gemini เป็นไฟล์ Gemini และเว็บเพจเป็น HTML+รูปภาพ
สามารถดูโครงสร้างแบบลำดับชั้นได้ใน
~/.cache/offpunkหรือเปิดดูโดยตรงใน Offpunkถ้าใช้ฟีเจอร์
tourก็จะอ่านบทความทั้งหมดเรียงกันจนจบในโหมดข้อความ แทนการ doomscrollingมีเครื่องมือบางตัวที่คล้ายกับ Epublifier
https://epub.press/
https://github.com/dteviot/WebToEpub
https://dotepub.com/
เรียบร้อยดี
เมื่อก่อนผมเคยทำเวอร์ชันเรียบง่ายของแนวคิดนี้ โดยบันทึกไฟล์ EPUB ไว้ในระบบไฟล์ของเซิร์ฟเวอร์ แล้วซิงก์กับ e-book reader ของผม
https://github.com/solarkraft/webpub
ส่วนประกอบหลักคือ Postlight Parser ที่แปลงเว็บไซต์ให้เป็นมุมมอง “เอกสาร” แบบเรียบง่าย
รองรับ http://fanfiction.net/ ด้วยไหม? ผมหาวิธีง่าย ๆ สำหรับไซต์นี้ไม่เจอ
ใช้ได้ในระดับหนึ่ง แต่บางเรื่องก็ทำงานดี ส่วนบางเรื่องดึงมาแค่หน้าแรก
ถ้าจะดึงเนื้อหา ผมยังไม่เห็นวิธีที่ใช้งานได้ดีนอกจากใช้เบราว์เซอร์แบบ headless