
Node.js में उच्च गति/कम लागत वाला CommonCrawl RegExp
Image
WARCannon को इंटरनेट को 'ग्रेप' करने की प्रक्रिया को सरल और सस्ता बनाने के लिए बनाया गया था।
WARCannon के साथ, आप यह कर सकते हैं:
WARCannon AWS प्रौद्योगिकियों के चतुर उपयोग का लाभ उठाता है ताकि किसी भी क्षमता पर क्षैतिज रूप से स्केल किया जा सके, स्पॉट फ्लीट्स और एक ही क्षेत्र में डेटा ट्रांसफर के माध्यम से लागत को कम किया जा सके, S3 से अविश्वसनीय गति (प्रति नोड 100Gbps तक) पर ड्रा किया जा सके, सैकड़ों CPU कोर में समानांतर किया जा सके, DynamoDB और CloudFront के माध्यम से स्थिति की रिपोर्ट की जा सके, और S3 के माध्यम से परिणाम संग्रहीत किए जा सकें।
कुल मिलाकर, WARCannon लगभग $30 में कुछ घंटों में 400TB में कई नियमित अभिव्यक्ति पैटर्न संसाधित कर सकता है।
सबसे तेज़ और आसान तरीका AWS CloudShell का उपयोग करना है। बस इस एक-लाइनर को पेस्ट करें:
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/master/cloudshell/deploy.sh)
यदि आप WARCannon की गैर-मास्टर शाखा का उपयोग करना चाहते हैं, तो बस टाइप करें:
export GIT_BRANCH=branch_name
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/$GIT_BRANCH/cloudshell/deploy.sh)
नोट: CloudShell परिनियोजन अस्थायी स्टोरेज का उपयोग करता है, जिसका अर्थ है कि CloudShell से बाहर निकलने पर कस्टम regex पैटर्न खो जाएंगे। यदि आप बार-बार WARCannon का उपयोग करने जा रहे हैं, तो मैं नीचे 'स्थानीय स्थापना' का उपयोग करने की सलाह देता हूं।
WARCannon के लिए आवश्यक है कि आपके पास निम्नलिखित स्थापित हों:
ProTip: चीजों को साफ और AWS में आपके पास मौजूद अन्य चीजों से अलग रखने के लिए, यह दृढ़ता से अनुशंसित है कि आप WARCannon को एक नए खाते में तैनात करें। आप AWS में 'संगठन' कंसोल से आसानी से एक नया खाता बना सकते हैं। 'दृढ़ता से अनुशंसित' से मेरा मतलब है 'गंभीरता से इसे अन्य सामान के बगल में स्थापित न करें'।
पहले, रिपो को क्लोन करें और उदाहरण सेटिंग्स को कॉपी करें।
$ git clone [email protected]:c6fc/warcannon.git
$ cd warcannon
warcannon$ cp settings.json.sample settings.json
अपनी आवश्यकता के अनुसार settings.json संपादित करें:
आवश्यक सेटिंग्स
nodeInstanceType: समानांतर प्रसंस्करण के लिए उपयोग किए जाने वाले इंस्टेंस प्रकारों की एक सरणी। इस उद्देश्य के लिए 'c'-प्रकार सबसे अच्छा मूल्य हैं, और किसी भी आकार का उपयोग किया जा सकता है। वास्तविक अभियानों के लिए ["c5n.18xlarge"] अनुशंसित मान है।nodeCapacity: समानांतर प्रसंस्करण के दौरान अनुरोध करने के लिए नोड्स की संख्या। परिणामी नोड्स आपके द्वारा निर्दिष्ट nodeInstanceTypes का एक मनमाना वितरण होंगे।nodeParallelism: प्रति vCPU एक साथ संसाधित करने के लिए WARCs की संख्या। यहां 2 एक अच्छी संख्या है। यदि नोड्स में समानता के इस स्तर पर चलने के लिए अपर्याप्त RAM है (जैसा कि आप 'c'-प्रकार के इंस्टेंस के साथ सामना कर सकते हैं), तो वे इसके बजाय उच्चतम सुरक्षित समानता पर चलेंगे।nodeMaxDuration: सेकंड में कंप्यूट नोड्स का अधिकतम जीवनकाल। यदि कार्य अभी भी पूरा नहीं हुआ है तो इस समय के बाद नोड्स स्वचालित रूप से समाप्त हो जाएंगे। डिफ़ॉल्ट मान 24 घंटे है।वैकल्पिक सेटिंग्स (यदि उपयोग नहीं किया जाता है तो उन्हें पूरी तरह से छोड़ दें)
sshKeyName: एक EC2 SSH कुंजी का नाम जो us-east-1 में पहले से मौजूद है।allowSSHFrom: SSH की अनुमति देने के लिए एक CIDR मास्क। आमतौर पर यह <yourpublicip>/32 होगास्थापित करने के लिए, यह चलाएँ:
$ npm install
$ npm link
$ warcannon deploy
WARCannon में एक अभियान चलाना एक सरल, आसानी से अनुसरण करने योग्य कार्यप्रवाह का उपयोग करता है जिसे इन कुछ चरणों में सबसे अच्छा वर्णित किया जा सकता है:
warcannon deploywarcannon testLocal -swarcannon testwarcannon list 2022warcannon populate 2022-21warcannon firewarcannon syncResults के साथ S3 से परिणाम प्राप्त करें।प्रत्येक चरण की अधिक विस्तृत समझ के लिए आगे पढ़ें।
WARCannon को AWS Open Data कार्यक्रम के माध्यम से Common Crawl द्वारा संचालित किया जाता है। Common Crawl इस मायने में अद्वितीय है कि उनके स्पाइडर द्वारा प्राप्त डेटा न केवल वेबसाइट टेक्स्ट, बल्कि जावास्क्रिप्ट, TypeScript, पूर्ण HTML, CSS आदि जैसी अन्य टेक्स्ट-आधारित सामग्री को भी कैप्चर करता है। उपयुक्त नियमित अभिव्यक्तियाँ (Regular Expressions) बनाकर जो अद्वितीय घटकों की पहचान करने में सक्षम हैं, शोधकर्ता वेबसाइटों की पहचान उनके द्वारा उपयोग की जाने वाली तकनीकों के आधार पर कर सकते हैं, और ऐसा कभी भी वेबसाइट को छुए बिना कर सकते हैं। समस्या यह है कि इसके लिए सैकड़ों टेराबाइट डेटा को पार्स करने की आवश्यकता होती है, जो आपके पास उपलब्ध संसाधनों की परवाह किए बिना एक कठिन कार्य है। सौभाग्य से WARCannon के पास कई उपकरण हैं जिनका उपयोग आप यह करने के लिए कर सकते हैं!
इंटरनेट को ग्रेप करना कमजोर दिल वालों के लिए नहीं है, लेकिन एक प्रभावी छलनी से शुरू करना पहला कदम है। WARCannon वास्तविक Common Crawl डेटा के विरुद्ध नियमित अभिव्यक्तियों के स्थानीय सत्यापन को सक्षम करके इसका समर्थन करता है। पहले, lambda_functions/warcannon/matches.js खोलें और regex_patterns ऑब्जेक्ट को name: pattern प्रारूप में उन नियमित अभिव्यक्तियों को शामिल करने के लिए संशोधित करें जिनका आप उपयोग करना चाहते हैं। डिफ़ॉल्ट खोज सेट से यहां एक उदाहरण दिया गया है:
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
इस अभिव्यक्ति से मेल खाने वाले स्ट्रिंग्स को परिणामों में संबंधित कुंजी के तहत सहेजा जाएगा; इस मामले में access_key_id। Protip: ज्ञात-अच्छे मैचों के विरुद्ध नियमित अभिव्यक्तियाँ बनाने और परीक्षण करने के लिए 'JavaScript' प्रारूप के साथ RegExr का उपयोग करें।
आपके पास केवल निर्दिष्ट डोमेन से परिणाम कैप्चर करने का विकल्प भी है। ऐसा करने के लिए, बस domains सरणी को उन FQDN से भरें जिन्हें आप शामिल करना चाहते हैं। यह अनुशंसा की जाती है कि आप इसे खाली [] छोड़ दें क्योंकि यह लगभग कभी भी सार्थक नहीं होता (बचाया गया प्रसंस्करण प्रयास बहुत छोटा है), लेकिन यह कुछ विशिष्ट मामलों में उपयोगी हो सकता है।
exports.domains = ["example1.com", "example2.com"];
एक बार matches.js भर जाने के बाद, निम्न कमांड चलाएँ:
warcannon$ warcannon testLocal -s
यदि आप चाहें तो वैकल्पिक रूप से commoncrawl S3 बकेट में एक WARC का पथ जोड़ सकते हैं, लेकिन अन्यथा एक हार्डकोडेड डिफ़ॉल्ट का उपयोग किया जाएगा।
WARCannon आपके कॉन्फ़िगर किए गए मैचों को खोजने के लिए WARC फ़ाइल को स्ट्रीम प्रोसेस करेगा (या यदि आप -s को छोड़ देते हैं तो इसे पूरी तरह से डाउनलोड करेगा)। जब आप ctrl+c से बाधित करते हैं या जब प्रसंस्करण समाप्त होता है तो WARCannon परिणामों को ~/.warcannon/ फ़ोल्डर में सहेज लेगा। यह न्यूनतम बैंडविड्थ के साथ बहुत तेज़ी से सामान्य मैचों का परीक्षण करना आसान बनाता है।
इस सब के अलावा, WARCannon स्थानीय रूप से चलने पर आपकी नियमित अभिव्यक्तियों की कुल कंप्यूट लागत का मूल्यांकन करने का प्रयास करेगा। इस तरह, आपको यह जानकारी मिल सकती है कि क्या कोई दी गई नियमित अभिव्यक्ति आपके अभियान को निष्पादित करने से पहले प्रदर्शन को महत्वपूर्ण रूप से प्रभावित करेगी।

कभी-कभी एक साधारण regex पैटर्न अपने आप में पर्याप्त नहीं होता है, और आपको यह सुनिश्चित करने के लिए कुछ अतिरिक्त कदमों की आवश्यकता होती है कि आप सही जानकारी लौटा रहे हैं। इस मामले में, बस exports.custom_functions ऑब्जेक्ट में उसी कुंजी नाम के साथ एक फ़ंक्शन जोड़ने से आप अपनी इच्छानुसार कोई भी अतिरिक्त प्रसंस्करण कर सकते हैं।
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
exports.custom_functions = {
"access_key_id": function(match) {
// टेक्स्ट में 'EXAMPLE' वाले मैचों को अनदेखा करें, क्योंकि यह दस्तावेज़ीकरण के लिए सामान्य है।
if (match.text(/EXAMPLE/) != null) {
// बूलियन 'false' लौटाने से मैच हट जाता है।
return false
}
}
}
नोट: WARCannon को मूर्खतापूर्ण गति से टेक्स्ट को क्रंच करने के लिए बनाया गया है। जबकि निश्चित रूप से किसी भी प्रकार के ऑपरेशन को करना संभव है जो आप चाहते हैं, नेटवर्क कॉल जैसे उच्च-विलंबता कस्टम फ़ंक्शन जोड़ने से प्रसंस्करण समय और लागत में काफी वृद्धि हो सकती है। नेटवर्क कॉल के परिणामस्वरूप किसी वेबसाइट पर बहुत सारी कॉल भी हो सकती हैं, जो आपको मुसीबत में डाल सकती हैं। इन फ़ंक्शनों का उपयोग करने के बारे में स्मार्ट बनें।
AWS की लागत चिंता पैदा कर सकती है, खासकर जब आप केवल कुछ शोध करना चाह रहे हों। WARCannon को पूर्ण अभियानों के अतिरिक्त एक बार के निष्पादन की अनुमति देने के लिए बनाया गया है, ताकि आपको मिलने वाले परिणामों पर भरोसा हो सके। एक बार जब आप testLocal के साथ मिलने वाले परिणामों से संतुष्ट हो जाते हैं, तो आप अपने अपडेटेड मैचों को तैनात कर सकते हैं और क्लाउड-समर्थित परीक्षण आसानी से चला सकते हैं:
warcannon$ warcannon deploy
warcannon$ warcannon test
फिर, यदि आप चाहें तो वैकल्पिक रूप से एक WARC पथ शामिल कर सकते हैं, हालांकि इसकी आवश्यकता नहीं है।
यह आपके द्वारा कॉन्फ़िगर की गई नियमित अभिव्यक्तियों के साथ एक Lambda फ़ंक्शन को सिंक्रोनस रूप से निष्पादित करेगा, और तुरंत परिणाम लौटाएगा। इस प्रक्रिया में लगभग 2.5 मिनट लगते हैं, इसलिए इसके जादू करने के दौरान प्रतीक्षा करने से न डरें।
एक बार जब आप Lambda में मिलने वाले परिणामों से संतुष्ट हो जाते हैं, तो आप वास्तव में इंटरनेट को ग्रेप करने के लिए तैयार हैं। हम पहले कुछ बुनियादी हाउसकीपिंग पर जाएंगे, फिर इसे शुरू करेंगे।
WARCannon कार्य को कंप्यूट नोड्स में वितरित करने के लिए AWS Simple Queue Service का उपयोग करता है। यह सुनिश्चित करने के लिए कि आपके परिणाम किसी भी पिछले रन से दूषित न हों, आप WARCannon को कतार को खाली करने का निर्देश दे सकते हैं:
warcannon$ warcannon emptyQueue
[+] Cleared [ 15 ] messages from the queue
फिर आप कतार की स्थिति सत्यापित कर सकते हैं:
warcannon$ warcannon status
Deployed: [ YES ]; SQS Status: [ EMPTY ]
Job Status: [ INACTIVE ]
Active job url: https://d201offlnmhkmd.cloudfront.net
आगे बढ़ने से पहले निम्नलिखित सत्यापित करें:
कंप्यूट नोड्स द्वारा उपभोग किए जाने वाले कतार संदेश बनाने के लिए, आपको पहले SQS को क्रॉल डेटा से आबाद करना होगा। WARCannon में इसमें मदद करने के लिए कई कमांड हैं, जो उपलब्ध स्कैन दिखाने की क्षमता से शुरू होते हैं। इस मामले में, आइए वर्ष 2021 के लिए उपलब्ध स्कैन देखें:
warcannon$ warcannon list 2021
CC-MAIN-2021-04
CC-MAIN-2021-10
हमारे पास काम करने के लिए स्ट्रिंग "2021" से मेल खाने वाले दो स्कैन हैं। अब हम WARCannon को इनमें से किसी एक स्कैन के आधार पर कतार को आबाद करने का निर्देश दे सकते हैं। इस बार, हमें एक पैरामीटर प्रदान करना होगा जो स्कैन में से किसी एक की विशिष्ट पहचान करता है। "2021-04" काम करेगा। हम केवल आंशिक स्कैन को आबाद करने के लिए चंक्स की संख्या और चंक आकार भी निर्दिष्ट कर सकते हैं, लेकिन हम अभी के लिए इसे छोड़ देंगे।
warcannon$ warcannon populate 2021-04
{Created 799 chunks of 100 from 79840 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
परिनियोजन के दौरान, WARCannon स्वचालित रूप से Athena में एक डेटाबेस (warcannon_commoncrawl) और वर्कग्रुप (warcannon) प्रदान करता है जिसका उपयोग CommonCrawl से जानकारी को तेज़ी से क्वेरी करने के लिए किया जा सकता है। यह विशेष रूप से कुछ प्रश्नों के आधार पर विरल अभियानों को आबाद करने के लिए उपयोगी हो सकता है। उदाहरण के लिए, निम्नलिखित क्वेरी उन WARCs की खोज करेगी जिनमें 'example.com' से प्रतिक्रियाएँ शामिल हैं:
SELECT
warc_filename,
COUNT(url_path) as num
FROM
warcannon_commoncrawl.ccindex
WHERE
subset = 'warc' AND
url_host_registered_domain IN ('example.com') AND
crawl = 'CC-MAIN-2021-04'
GROUP BY warc_filename
ORDER BY num DESC
आप अपने परिणामों को ठीक करने के लिए Athena कंसोल का उपयोग कर सकते हैं, लेकिन यदि आप इसके साथ कोई कार्य आबाद करना चाहते हैं तो आपको क्वेरी को WARCannon कमांड लाइन से चलाना होगा:
warcannon queryAthena "SELECT warc_filename, COUNT(url_path) as num FROM warcannon_commoncrawl.ccindex WHERE subset = 'warc' AND url_host_registered_domain IN ('example.com') AND crawl = 'CC-MAIN-2021-04' GROUP BY warc_filename ORDER BY num DESC"
[+] Query Exec Id: 0319486e-1846-491c-badf-2e23ae213974 .. SUCCEEDED
WARCannon फिर कतार को आबाद करने के लिए क्वेरी के परिणामों का उपयोग कर सकता है, और ऐसा परिणाम सेट के warc_filename कॉलम के आधार पर करता है। इस प्रकार, यह अनुशंसा की जाती है कि आप या तो इस कॉलम द्वारा group by करें या डुप्लिकेट से बचने के लिए distinct() का उपयोग करें। यदि यह फ़ील्ड मौजूद नहीं है तो WARCannon एक त्रुटि देगा। क्वेरी निष्पादन ID को populateAthena कमांड में पास करके Athena परिणामों के साथ कतार को आबाद करें।
warcannon populateAthena 0319486e-1846-491c-badf-2e23ae213974
{Created 26 chunks of 10 from 251 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
नोट: हालांकि एकल डोमेन के लिए एक विरल कार्य को आबाद करना एक अच्छा विचार लग सकता है, यह अक्सर नहीं होता है। एकल डोमेन से प्रतिक्रियाएँ WARCs के एक बड़े उपसमूह में व्यापक रूप से फैली हुई होती हैं। उपरोक्त उदाहरण क्वेरी का उपयोग करके यह स्पष्ट रूप से देखा जा सकता है कि प्रत्येक WARC में ~150,000 रिकॉर्डों में से, मध्यम आकार की वेबसाइटों के लिए सबसे बड़ी एकल हिट एकल अंकों में हो सकती है।
कतार आबाद होने के साथ, हम फायर करने के लिए तैयार हैं। WARCannon यह सुनिश्चित करने के लिए कुछ सैनिटी जाँच करेगा कि सब कुछ क्रम में है, फिर आपको अभियान का कॉन्फ़िगरेशन दिखाएगा और आपको ऑर्डर को अंतिम रूप देने से पहले निरस्त करने का एक अंतिम अवसर देगा।
warcannon$ warcannon fire
[!] This will request [ 6 ] spot instances of type [ m5n.24xlarge, m5dn.24xlarge ]
lasting for [ 86400 ] seconds.
To change this, edit your settings in settings.json and run warcannon deploy
--> Ready to fire? [Yes]:
'Yes' का जवाब देकर ट्रिगर खींचें।
--> Ready to fire? [Yes]: Yes
{
"SpotFleetRequestId": "sfr-03dd32b8-51f7-4c8e-802b-a702fc3c8c95"
}
[+] Spot fleet request has been sent, and nodes should start coming online within ~5 minutes.
Monitor node status and progress at https://d201offlnmhkmd.cloudfront.net
प्रतिक्रिया में आपके अद्वितीय स्थिति URL का एक लिंक शामिल है, जहाँ आप अपने अभियान की प्रगति और प्रत्येक नोड के प्रदर्शन की निगरानी कर सकते हैं।

WARCannon परिणाम S3 में JSON प्रारूप में संग्रहीत किए जाते हैं, जो परिणामों के उत्पादन के लिए जिम्मेदार प्रत्येक नोड द्वारा विभाजित होते हैं। Athena परिणाम /athena/ उपसर्ग के तहत उसी बकेट में संग्रहीत किए जाते हैं। आप syncResults कमांड का उपयोग करके किसी अभियान के परिणामों को अपनी स्थानीय मशीन पर ~/.warcannon/ फ़ोल्डर में सिंक कर सकते हैं।
warcannon syncResults
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
...
फिर आप clearResults के साथ परिणाम बकेट खाली कर सकते हैं
warcannon clearResults
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
...
[+] Deleted [ 21 ] files from S3.
प्रश्न हैं, सहायता चाहिए, योगदान देना चाहते हैं या किसी जीत के बारे में डींग मारना चाहते हैं? Discord पर आएं!