หน้าต่างๆ มีศักยภาพที่จะเปลี่ยนแปลงอย่างมากจนการสร้างเครื่องมือขูดที่ "ชาญฉลาด" อาจเป็นเรื่องยากทีเดียว และถ้าเป็นไปได้ เครื่องขูดก็ค่อนข้างคาดเดาไม่ได้ แม้ว่าจะมีเทคนิคแปลกๆ เช่น การเรียนรู้ของเครื่อง ฯลฯ ก็ตาม เป็นการยากที่จะสร้างเครื่องขูดที่มีทั้งความน่าเชื่อถือและความยืดหยุ่นแบบอัตโนมัติ
การบำรุงรักษาค่อนข้างเป็นรูปแบบศิลปะที่เน้นไปที่วิธีการกำหนดและใช้งานตัวเลือก
ในอดีตฉันได้ใช้ตัวเลือก "สองขั้นตอน" ของตัวเอง:
(ค้นหา) ขั้นตอนแรกมีความยืดหยุ่นสูงและตรวจสอบโครงสร้างของหน้าไปยังองค์ประกอบที่ต้องการ หากขั้นตอนแรกล้มเหลว จะเกิดข้อผิดพลาด "โครงสร้างเพจที่เปลี่ยนแปลง" บางชนิด
(ดึงข้อมูล) ขั้นตอนที่สองนั้นค่อนข้างยืดหยุ่นและดึงข้อมูลจากองค์ประกอบที่ต้องการบนเพจ
วิธีนี้ช่วยให้สแครปเปอร์แยกตัวเองจากการเปลี่ยนแปลงหน้าที่รุนแรงด้วยการตรวจจับอัตโนมัติในระดับหนึ่ง ในขณะที่ยังคงรักษาระดับความยืดหยุ่นที่น่าเชื่อถือไว้ได้
ฉันมักจะใช้ตัวเลือก xpath บ่อยครั้ง และค่อนข้างน่าประหลาดใจจริงๆ กับการฝึกฝนเล็กๆ น้อยๆ ว่าคุณจะมีความยืดหยุ่นเพียงใดกับตัวเลือกที่ดีในขณะที่ยังคงแม่นยำมาก ฉันแน่ใจว่าตัวเลือก css คล้ายกัน การดำเนินการนี้จะง่ายขึ้นหากการออกแบบเพจมีความหมายและ "เรียบ" มากขึ้น
คำถามสำคัญบางประการที่ต้องตอบคือ:
คุณคาดหวังที่จะเปลี่ยนแปลงอะไรบนเพจ?
คุณคาดหวังอะไรที่จะคงเหมือนเดิมบนเพจ?
เมื่อตอบคำถามเหล่านี้ ยิ่งคุณแม่นยำมากเท่าใด ตัวเลือกของคุณก็จะยิ่งดีขึ้นเท่านั้น
ท้ายที่สุดแล้ว คุณเป็นผู้เลือกว่าคุณต้องการรับความเสี่ยงมากน้อยเพียงใด ตัวเลือกของคุณจะน่าเชื่อถือเพียงใด เมื่อทั้งค้นหาและดึงข้อมูลบนเพจ วิธีที่คุณสร้างมันสร้างความแตกต่างอย่างมาก และวิธีที่ดีที่สุดคือรับข้อมูลจาก web-api ซึ่งหวังว่าจะเริ่มมีแหล่งข้อมูลมากขึ้น
แก้ไข: ตัวอย่างเล็ก ๆ
เมื่อใช้สถานการณ์ของคุณ โดยที่องค์ประกอบที่คุณต้องการอยู่ที่ .content > .deal > .tag > .price
ตัวเลือก .content .price
ทั่วไปจะ "ยืดหยุ่น" มากเกี่ยวกับการเปลี่ยนแปลงหน้า แต่ถ้าสมมุติว่ามีองค์ประกอบบวกลวงเกิดขึ้น เราอาจปรารถนาที่จะหลีกเลี่ยงการแยกออกจากองค์ประกอบใหม่นี้
การใช้ตัวเลือกแบบสองขั้นตอนทำให้เราสามารถระบุขั้นตอนแรกทั่วไปน้อยกว่าและไม่ยืดหยุ่นมากขึ้น เช่น .content > .deal
และขั้นตอนที่สองที่กว้างกว่าเช่น .price
เพื่อดึงข้อมูลองค์ประกอบสุดท้ายโดยใช้แบบสอบถาม relative ไปยังผลลัพธ์ของ อันดับแรก.
แล้วทำไมไม่ใช้ตัวเลือกอย่าง .content > .deal .price
ล่ะ?
สำหรับการใช้งานของฉัน ฉันต้องการตรวจจับการเปลี่ยนแปลงหน้าเพจขนาดใหญ่โดยไม่ต้องรันการทดสอบการถดถอยเพิ่มเติมแยกต่างหาก ฉันตระหนักว่าแทนที่จะใช้ตัวเลือกขนาดใหญ่เพียงตัวเดียว ฉันสามารถเขียนขั้นตอนแรกเพื่อรวมองค์ประกอบโครงสร้างหน้าที่สำคัญได้ ขั้นตอนแรกนี้จะล้มเหลว (หรือรายงาน) หากไม่มีองค์ประกอบโครงสร้างอีกต่อไป จากนั้นฉันสามารถเขียนขั้นตอนที่สองเพื่อดึงข้อมูลได้อย่างสวยงามยิ่งขึ้นโดยสัมพันธ์กับผลลัพธ์ของขั้นตอนแรก
ฉันไม่ควรบอกว่ามันเป็นแนวทางปฏิบัติที่ "ดีที่สุด" แต่มันก็ได้ผลดี
person
David
schedule
23.01.2014