स्क्रैपिंग डेवलपर्स के रूप में, हमें कभी-कभी अपने कार्यों को करने के लिए अस्थायी कुंजी जैसे प्रमाणीकरण डेटा निकालने की आवश्यकता होती है। हालाँकि, यह उतना सरल नहीं है। आमतौर पर, यह HTML या XHR नेटवर्क अनुरोधों में होता है, लेकिन कभी-कभी, प्रमाणीकरण डेटा की गणना की जाती है। उस स्थिति में, हम या तो गणना को रिवर्स-इंजीनियर कर सकते हैं, जिसमें स्क्रिप्ट को समझने में बहुत समय लगता है या इसकी गणना करने वाली जावास्क्रिप्ट को चला सकते हैं। आम तौर पर, हम ब्राउज़र का उपयोग करते हैं, लेकिन वह महंगा है। क्रॉली ब्राउज़र स्क्रैपर और चीयरियो स्क्रैपर को समानांतर में चलाने के लिए समर्थन प्रदान करता है, लेकिन यह गणना संसाधन उपयोग के मामले में बहुत जटिल और महंगा है। JSDOM हमें ब्राउज़र की तुलना में कम संसाधनों और चीयरियो की तुलना में थोड़े अधिक संसाधनों के साथ पेज जावास्क्रिप्ट चलाने में मदद करता है।
यह लेख एक नए दृष्टिकोण पर चर्चा करेगा जिसका उपयोग हम अपने एक अभिनेता में ब्राउज़र वेब अनुप्रयोगों द्वारा उत्पन्न टिकटॉक विज्ञापन रचनात्मक केंद्र से प्रमाणीकरण डेटा प्राप्त करने के लिए करते हैं, वास्तव में ब्राउज़र को चलाने के बिना, बल्कि इसके बजाय, JSDOM का उपयोग करते हुए।
जब आप इस यूआरएल पर जाते हैं:
https://ads.tiktok.com/business/creativecenter/inspire/popular/hashtag/pc/en
आपको हैशटैग की एक सूची उनकी लाइव रैंकिंग, उनके पोस्ट की संख्या, ट्रेंड चार्ट, क्रिएटर्स और एनालिटिक्स के साथ दिखाई देगी। आप यह भी देख सकते हैं कि हम उद्योग को फ़िल्टर कर सकते हैं, समय अवधि निर्धारित कर सकते हैं, और फ़िल्टर करने के लिए चेक बॉक्स का उपयोग कर सकते हैं कि शीर्ष 100 में रुझान नया है या नहीं।
यहां हमारा लक्ष्य दिए गए फ़िल्टर के साथ सूची से शीर्ष 100 हैशटैग निकालना है।
दो संभावित दृष्टिकोण चीयरियोक्रॉलर का उपयोग करना है, और दूसरा ब्राउज़र-आधारित स्क्रैपिंग होगा। चीयरियो तेजी से परिणाम देता है लेकिन जावास्क्रिप्ट-रेंडर वेबसाइटों के साथ काम नहीं करता है।
चेरियो यहां सबसे अच्छा विकल्प नहीं है क्योंकि क्रिएटिव सेंटर एक वेब एप्लिकेशन है, और डेटा स्रोत एपीआई है, इसलिए हम केवल HTML संरचना में शुरू में मौजूद हैशटैग प्राप्त कर सकते हैं, लेकिन 100 में से प्रत्येक नहीं जैसा कि हमें चाहिए।
दूसरा दृष्टिकोण ब्राउज़र-आधारित स्क्रैपिंग करने के लिए पपेटियर, प्लेराइट इत्यादि जैसे पुस्तकालयों का उपयोग करना और सभी हैशटैग को स्क्रैप करने के लिए स्वचालन का उपयोग करना हो सकता है, लेकिन पिछले अनुभवों के साथ, ऐसे छोटे कार्य के लिए बहुत समय लगता है।
अब नया दृष्टिकोण आता है जिसे हमने इस प्रक्रिया को ब्राउज़र आधारित से काफी बेहतर बनाने और चीयरियोक्रॉलर आधारित क्रॉलिंग के बहुत करीब बनाने के लिए विकसित किया है।
इस दृष्टिकोण पर गहराई से विचार करने से पहले, मैं इस दृष्टिकोण को विकसित करने के लिए एपिफाई में वेब ऑटोमेशन इंजीनियर एलेक्सी उडोविदचेंको को श्रेय देना चाहूंगा। उन्हें साधुवाद!
इस दृष्टिकोण में, हम आवश्यक डेटा प्राप्त करने के लिए https://ads.tiktok.com/creative_radar_api/v1/popular_trend/hashtag/list पर एपीआई कॉल करने जा रहे हैं।
इस एपीआई पर कॉल करने से पहले, हमें कुछ आवश्यक हेडर (ऑथ डेटा) की आवश्यकता होगी, इसलिए हम पहले https://ads.tiktok.com/business/creativecenter/inspire/popular/hashtag/pad पर कॉल करेंगे। /en.
हम एक फ़ंक्शन बनाकर इस दृष्टिकोण को शुरू करेंगे जो हमारे लिए एपीआई कॉल के लिए यूआरएल बनाएगा और कॉल करेगा और डेटा प्राप्त करेगा।
export const createStartUrls = (input) => { const { days = '7', country = '', resultsLimit = 100, industry = '', isNewToTop100, } = input; const filterBy = isNewToTop100 ? 'new_on_board' : ''; return [ { url: `https://ads.tiktok.com/creative_radar_api/v1/popular_trend/hashtag/list?page=1&limit=50&period=${days}&country_code=${country}&filter_by=${filterBy}&sort_by=popular&industry_id=${industry}`, headers: { // required headers }, userData: { resultsLimit }, }, ]; };
उपरोक्त फ़ंक्शन में, हम एपीआई कॉल के लिए स्टार्ट यूआरएल बनाते हैं जिसमें विभिन्न पैरामीटर शामिल होते हैं जैसा कि हमने पहले बात की थी। पैरामीटर के अनुसार यूआरएल बनाने के बाद यह Creative_radar_api पर कॉल करेगा और सभी परिणाम लाएगा।
लेकिन यह तब तक काम नहीं करेगा जब तक हमें हेडर नहीं मिल जाते। तो, चलिए एक फ़ंक्शन बनाते हैं जो पहले sessionPool और proxyConfiguration का उपयोग करके एक सत्र बनाएगा।
export const createSessionFunction = async ( sessionPool, proxyConfiguration, ) => { const proxyUrl = await proxyConfiguration.newUrl(Math.random().toString()); const url = 'https://ads.tiktok.com/business/creativecenter/inspiration/popular/hashtag/pad/en'; // need url with data to generate token const response = await gotScraping({ url, proxyUrl }); const headers = await getApiUrlWithVerificationToken( response.body.toString(), url, ); if (!headers) { throw new Error(`Token generation blocked`); } log.info(`Generated API verification headers`, Object.values(headers)); return new Session({ userData: { headers, }, sessionPool, }); };
इस फ़ंक्शन में, मुख्य लक्ष्य https://ads.tiktok.com/business/creativecenter/inspire/popular/hashtag/pad/en पर कॉल करना और बदले में हेडर प्राप्त करना है। हेडर प्राप्त करने के लिए हम getApiUrlWithVerificationToken फ़ंक्शन का उपयोग कर रहे हैं।
आगे बढ़ने से पहले, मैं यह उल्लेख करना चाहता हूं कि क्रॉली मूल रूप से JSDOM क्रॉलर का उपयोग करके JSDOM का समर्थन करता है। यह सादे HTTP अनुरोधों और jsdom DOM कार्यान्वयन का उपयोग करके वेब पेजों के समानांतर क्रॉलिंग के लिए एक रूपरेखा देता है। यह वेब पेजों को डाउनलोड करने के लिए कच्चे HTTP अनुरोधों का उपयोग करता है, यह डेटा बैंडविड्थ पर बहुत तेज़ और कुशल है।
आइए देखें कि हम getApiUrlWithVerificationToken फ़ंक्शन कैसे बनाने जा रहे हैं:
const getApiUrlWithVerificationToken = async (body, url) => { log.info(`Getting API session`); const virtualConsole = new VirtualConsole(); const { window } = new JSDOM(body, { url, contentType: 'text/html', runScripts: 'dangerously', resources: 'usable' || new CustomResourceLoader(), // ^ 'usable' faster than custom and works without canvas pretendToBeVisual: false, virtualConsole, }); virtualConsole.on('error', () => { // ignore errors cause by fake XMLHttpRequest }); const apiHeaderKeys = ['anonymous-user-id', 'timestamp', 'user-sign']; const apiValues = {}; let retries = 10; // api calls made outside of fetch, hack below is to get URL without actual call window.XMLHttpRequest.prototype.setRequestHeader = (name, value) => { if (apiHeaderKeys.includes(name)) { apiValues[name] = value; } if (Object.values(apiValues).length === apiHeaderKeys.length) { retries = 0; } }; window.XMLHttpRequest.prototype.open = (method, urlToOpen) => { if ( ['static', 'scontent'].find((x) => urlToOpen.startsWith(`https://${x}`), ) ) log.debug('urlToOpen', urlToOpen); }; do { await sleep(4000); retries--; } while (retries > 0); await window.close(); return apiValues; };
इस फ़ंक्शन में, हम एक वर्चुअल कंसोल बना रहे हैं जो पृष्ठभूमि प्रक्रिया को चलाने और ब्राउज़र को JSDOM से बदलने के लिए CustomResourceLoader का उपयोग करता है।
इस विशेष उदाहरण के लिए, हमें एपीआई कॉल करने के लिए तीन अनिवार्य हेडर की आवश्यकता है, और वे हैं अनाम-उपयोगकर्ता-आईडी, टाइमस्टैम्प और उपयोगकर्ता-चिह्न।
XMLHttpRequest.prototype.setRequestHeader का उपयोग करके, हम जांच कर रहे हैं कि उल्लिखित हेडर प्रतिक्रिया में हैं या नहीं, यदि हाँ, तो हम उन हेडर का मूल्य लेते हैं, और सभी हेडर प्राप्त होने तक पुनः प्रयास दोहराते हैं।
फिर, सबसे महत्वपूर्ण हिस्सा यह है कि हम प्रामाणिक डेटा निकालने और वास्तव में ब्राउज़र का उपयोग किए बिना या बॉट गतिविधि को उजागर किए बिना कॉल करने के लिए XMLHttpRequest.prototype.open का उपयोग करते हैं।createSessionFunction के अंत में, यह आवश्यक हेडर के साथ एक सत्र लौटाता है।
अब हमारे मुख्य कोड पर आते हैं, हम CheerioCrawler का उपयोग करेंगे और पिछले फ़ंक्शन से प्राप्त हेडर को requestHandler में इंजेक्ट करने के लिए प्रीनेविगेशनहुक का उपयोग करेंगे।
const crawler = new CheerioCrawler({ sessionPoolOptions: { maxPoolSize: 1, createSessionFunction: async (sessionPool) => createSessionFunction(sessionPool, proxyConfiguration), }, preNavigationHooks: [ (crawlingContext) => { const { request, session } = crawlingContext; request.headers = { ...request.headers, ...session.userData?.headers, }; }, ], proxyConfiguration, });अंत में अनुरोध हैंडलर में हम हेडर का उपयोग करके कॉल करते हैं और सुनिश्चित करते हैं कि सभी डेटा हैंडलिंग पेजिनेशन लाने के लिए कितनी कॉल की आवश्यकता है।
इस विशेष उदाहरण में हमने केवल एक अनुरोध और एक सत्र किया है, लेकिन यदि आपको आवश्यकता हो तो आप और भी अनुरोध कर सकते हैं। जब पहली एपीआई कॉल पूरी हो जाएगी, तो यह दूसरी एपीआई कॉल बनाएगी। फिर, यदि आवश्यक हो तो आप और कॉल कर सकते हैं, लेकिन हम दो पर रुक गए।
चीजों को और अधिक स्पष्ट करने के लिए, यहां बताया गया है कि कोड प्रवाह कैसा दिखता है:
परियोजना का कोडबेस पहले से ही यहां अपलोड किया गया है। कोड को Apify Actor के रूप में लिखा गया है; आप इसके बारे में यहां अधिक जानकारी पा सकते हैं, लेकिन आप इसे Apify SDK का उपयोग किए बिना भी चला सकते हैं।
यदि इस दृष्टिकोण के बारे में आपके कोई संदेह या प्रश्न हैं, तो हमारे डिस्कॉर्ड सर्वर पर हमसे संपर्क करें।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3