हैलो, मैं एक वेब स्क्रैपर विकसित कर रहा हूं और मैं एक विशेष वेबसाइट में उपयोग कर रहा हूं, इस वेबसाइट में बहुत सारे यूआरएल हैं, शायद 1.000.000 से अधिक, और स्क्रैपिंग और जानकारी प्राप्त करने के लिए मेरे पास निम्नलिखित आर्किटेक्चर है।

एक सेट विज़िट की गई साइटों को संग्रहीत करने के लिए और दूसरा सेट गैर-विज़िट साइटों को संग्रहीत करने के लिए।

वेबसाइट को स्क्रैप करने के लिए मैं 2000 थ्रेड्स की सीमा के साथ मल्टीथ्रेडिंग का उपयोग कर रहा हूं।

इस आर्किटेक्चर में मेमोरी साइज की समस्या है और यह कभी खत्म नहीं हो सकता क्योंकि प्रोग्राम यूआरएल के साथ मेमोरी से अधिक है

गैर-विज़िट के सेट में एक यूआरएल डालने से पहले, मैं पहले जांचता हूं कि क्या यह साइट देखी गई है, अगर साइट का दौरा किया गया था तो मैं कभी भी गैर-विजिटेड साइटों में स्टोर नहीं करूंगा।

ऐसा करने के लिए मैं अजगर का उपयोग कर रहा हूं, मुझे लगता है कि शायद एक बेहतर तरीका डेटाबेस में सभी साइटों को संग्रहीत करना होगा, लेकिन मुझे डर है कि यह धीमा हो सकता है

मैं SQLite जैसे डेटाबेस में विज़िट किए गए यूआरएल के सेट को संग्रहीत करके समस्या का हिस्सा ठीक कर सकता हूं, लेकिन समस्या यह है कि गैर-विज़िट यूआरएल का सेट बहुत बड़ा है और सभी मेमोरी से अधिक है

किसी अन्य उपकरण, भाषा, वास्तुकला, आदि के साथ इसे कैसे सुधारें, इसके बारे में कोई विचार ...?

धन्यवाद

0
Tlaloc-ES 8 जुलाई 2019, 19:03

2 जवाब

सबसे बढ़िया उत्तर

सबसे पहले, मैंने कभी भी पायथन का उपयोग करके पृष्ठों को क्रॉल नहीं किया। मेरी पसंदीदा भाषा सी # है। लेकिन अजगर अच्छा या बेहतर होना चाहिए।

ठीक है, आपके द्वारा खोजी गई पहली चीज़ शांत महत्वपूर्ण है। सिर्फ आपकी मेमोरी पर काम करने से काम नहीं चलेगा। अपनी हार्डड्राइव पर काम करने के तरीके को लागू करना महत्वपूर्ण है। यदि आप केवल स्मृति पर काम करना चाहते हैं, तो पृष्ठ के आकार के बारे में सोचें।

मेरी राय में, आपको वेबस्क्रैपिंग/क्रॉलिंग के लिए पहले से ही सबसे अच्छा (या एक अच्छा) आर्किटेक्चर मिल गया है। आपको किसी प्रकार की सूची चाहिए, जो आपके द्वारा पहले से देखे गए यूआरएल का प्रतिनिधित्व करती है और दूसरी सूची जिसमें आप अपने पाए गए नए यूआरएल स्टोर कर सकते हैं। बस दो सूचियाँ सबसे आसान तरीका है जिस पर आप जा सकते हैं। इसका मतलब है कि आप क्रॉलिंग में किसी तरह की रणनीति लागू नहीं कर रहे हैं। अगर आप ऐसा कुछ नहीं ढूंढ रहे हैं, तो ठीक है। लेकिन इसके बारे में सोचें, क्योंकि यह स्मृति के उपयोग को अनुकूलित कर सकता है। इसलिए आपको गहरी और चौड़ी क्रॉल जैसी किसी चीज़ की तलाश करनी चाहिए। या पुनरावर्ती क्रॉल। प्रत्येक शाखा को अपनी सूची, या किसी सरणी के आयाम के रूप में प्रस्तुत करना।

इसके अलावा, आपके न देखे गए url को डेटाबेस में भी संग्रहीत करने में क्या समस्या है? क्योंकि आपको केवल प्रत्येक धागे की जरूरत है। यदि इसे डीबी में डालने में आपकी समस्या यह है कि इसे इसके माध्यम से स्वाइप करने में कुछ समय लग सकता है, तो आपको पृष्ठ के प्रत्येक भाग के लिए एकाधिक तालिकाओं का उपयोग करने के बारे में सोचना चाहिए।

इसका मतलब है, आप यूआरएल में प्रत्येक सबस्ट्रिंग के लिए एक टेबल का उपयोग कर सकते हैं:

Wwww.example.com/

Wwww.example.com/contact/

Wwww.example.com/download/

Wwww.example.com/content/

Wwww.example.com/support/

Wwww.example.com/news/

तो अगर आपका यूआरएल है: "wwww.example.com/download/sweetcats/", तो आपको इसे wwww.example.com/download/ के लिए टेबल में रखना चाहिए। जब आपके पास यूआरएल का एक सेट होता है, तो आपको पहले सही तालिका को देखना होगा। बाद में आप तालिका के माध्यम से स्वाइप कर सकते हैं।

और अंत में, मेरा सिर्फ एक सवाल है। आप पुस्तकालय या ढांचे का उपयोग क्यों नहीं कर रहे हैं जो पहले से ही इन सुविधाओं का समर्थन करता है? मुझे लगता है कि अजगर के लिए कुछ उपलब्ध होना चाहिए।

1
Juke 9 जुलाई 2019, 16:22

2000 धागे बहुत अधिक हैं। 1 भी बहुत अधिक हो सकता है। आपके स्क्रैपर को संभवतः एक डॉस (सेवा से इनकार) के रूप में माना जाएगा और आपका आईपी पता अवरुद्ध हो जाएगा।

यहां तक ​​​​कि अगर आपको 2000 में अनुमति है, तो बहुत सारे धागे हैं। आप कहीं न कहीं अड़चन डालेंगे, और वह चोकपॉइंट शायद आपकी तुलना में धीमी गति से आगे बढ़ेगा यदि आपके पास कुछ समझदार थ्रेडिंग हो। 10 कोशिश करने का सुझाव दें। इसे देखने का एक तरीका - प्रत्येक थ्रेड एक URL (नेटवर्क गहन) लाने और इसे संसाधित करने (cpu गहन) के बीच फ़्लिप-फ्लॉप होगा। तो, सीपीयू की संख्या का 2 गुना एक और संभावित सीमा है।

आपको कवर के तहत एक डेटाबेस की आवश्यकता है। यह आपको प्रक्रिया को शीर्ष और पुनरारंभ करने देगा। इससे भी महत्वपूर्ण बात यह है कि यह आपको सभी स्क्रैप की गई जानकारी को फेंके बिना बग्स को ठीक करने और एक नया क्रॉलर जारी करने देगा।

डेटाबेस धीमा हिस्सा नहीं होगा। मुख्य कदम:

  • जाने के लिए एक पृष्ठ चुनें (और अतिरेक से बचने के लिए इसे डेटाबेस में लॉक करें)।
  • पृष्ठ प्राप्त करें (यह शायद सबसे धीमा हिस्सा है)
  • पृष्ठ को पार्स करें (या यह सबसे धीमा हो सकता है)
  • परिणामों को डेटाबेस में संग्रहीत करें
  • तब तक दोहराएं जब तक कोई और पृष्ठ न हो - जो कभी भी नहीं हो सकता है, क्योंकि पृष्ठ आपके नीचे से बदल रहे होंगे।

(मैंने इसे कई साल पहले किया था। मेरे पास 0.5GB की एक छोटी मशीन थी। मैंने लगभग एक मिलियन विश्लेषण पृष्ठों के बाद छोड़ दिया। स्कैन किए जाने के लिए अभी भी लगभग एक मिलियन पृष्ठ थे। और, हाँ, मैं था एक डॉस हमले का आरोप लगाया।)

1
Rick James 17 अगस्त 2019, 22:59