मैं एक साक्षात्कार के लिए कुछ प्रश्नोत्तरी प्रश्नों का उत्तर दे रहा था, और सवाल यह था कि मैं स्क्रीन स्क्रैपिंग कैसे करूं। यही है, एक वेब पेज से सामग्री चुनना, मान लीजिए कि आपके पास सीधे जानकारी पूछने के लिए एक बेहतर संरचित तरीका नहीं है (उदा। एक वेब सेवा)।स्क्रीन स्क्रैपिंग: नियमित अभिव्यक्तियां या XQuery अभिव्यक्तियां?
मेरा समाधान XQuery अभिव्यक्ति का उपयोग करना था। अभिव्यक्ति काफी लंबी थी क्योंकि मुझे आवश्यक सामग्री HTML पदानुक्रम में बहुत गहरी थी। id
विशेषता के साथ तत्व प्राप्त करने से पहले मुझे पूर्वजों के माध्यम से एक उचित तरीके से खोजना पड़ा। उदाहरण के लिए, उत्पाद आयाम के लिए एक Amazon.com पेज स्क्रैप इस तरह दिखता है:
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
एक बहुत बुरा अभिव्यक्ति है कि है, लेकिन यही कारण है कि अमेज़न एक वेब सेवा एपीआई प्रदान करता है। वैसे भी, यह सिर्फ एक उदाहरण है। सवाल अमेज़ॅन के बारे में नहीं था, यह स्क्रीन स्क्रैपिंग के बारे में है।
साक्षात्कारकर्ता को मेरे समाधान को पसंद नहीं आया। उन्होंने सोचा कि यह नाजुक था, क्योंकि अमेज़ॅन द्वारा पेज डिज़ाइन में बदलाव को XQuery अभिव्यक्ति को फिर से लिखने की आवश्यकता हो सकती है। एक XQuery अभिव्यक्ति को डिबग करना जो पृष्ठ पर किसी भी चीज़ से मेल नहीं खाता है, यह कठिन है।
मैं उनके बयान से असहमत नहीं था, लेकिन मुझे नहीं लगता था कि उनका समाधान कोई सुधार था: उन्होंने सोचा कि नियमित अभिव्यक्ति का उपयोग करना बेहतर है, और शिपिंग वजन के पास सामग्री और मार्कअप की खोज करें। उदाहरण के लिए, पर्ल का उपयोग कर:
$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;
मेरे जवाबी तर्क था कि यह भी अमेज़न अपने एचटीएमएल कोड को बदलने के लिए अतिसंवेदनशील है। वे राजधानियों में एचटीएमएल टैग (<LI>
) का जादू कर सकते हैं, या सीएसएस विशेषताओं को जोड़ सकते हैं या <b>
को <span>
में बदल सकते हैं या "उत्पाद आयाम:" से "आयाम:" या कई अन्य प्रकार के परिवर्तनों को लेबल बदल सकते हैं। मेरा मुद्दा यह था कि नियमित अभिव्यक्ति मेरे XQuery समाधान में बुलाए गए कमजोरियों को हल नहीं करती है।
लेकिन इसके अतिरिक्त, नियमित अभिव्यक्ति झूठी सकारात्मक पा सकते हैं, जब तक आप अभिव्यक्ति में पर्याप्त संदर्भ नहीं जोड़ते। यह अनजाने में ऐसी सामग्री से मेल खा सकता है जो किसी टिप्पणी, या एक विशेषता स्ट्रिंग या सीडीएटीए अनुभाग के अंदर होता है।
मेरा सवाल है, स्क्रीन स्क्रैपिंग करने के लिए आप किस तकनीक का उपयोग करते हैं? आपने उस समाधान का चयन क्यों किया? क्या इसका उपयोग करने के लिए कुछ अनिवार्य कारण है? या कभी दूसरे का उपयोग नहीं करते? क्या ऊपर दिखाए गए लोगों के अलावा कोई तीसरी पसंद है?
पीएस: तर्क के लिए मान लें कि कोई वेब सेवा API नहीं है या वांछित सामग्री प्राप्त करने के लिए अन्य प्रत्यक्ष तरीका नहीं है।
एक्सएमएल-आधारित वेब स्क्रैपिंग से बचने का यह मुख्य कारण है। कोई एक्सएमएल प्रोसेसर ब्राउज़र के रूप में क्षमा नहीं कर रहा है। XQuery को पूरी तरह से बेकार प्रस्तुत करने के लिए पृष्ठ को केवल एक अच्छी तरह से गठित नियम को तोड़ने की आवश्यकता है। – harpo