
عالية السرعة/منخفضة التكلفة CommonCrawl RegExp في Node.js
Image
تم بناء WARCannon لتبسيط وتقليل تكلفة عملية 'البحث في الإنترنت'.
مع WARCannon، يمكنك:
يستفيد WARCannon من الاستخدام الذكي لتقنيات AWS للتوسع أفقيًا إلى أي سعة، وتقليل التكلفة من خلال أساطيل الفوري (spot fleets) ونقل البيانات في نفس المنطقة، وسحب البيانات من S3 بسرعات لا تصدق (تصل إلى 100 جيجابت في الثانية لكل عقدة)، والتوازي عبر مئات نوى وحدة المعالجة المركزية، وإبلاغ الحالة عبر DynamoDB وCloudFront، وتخزين النتائج عبر S3.
بشكل عام، يمكن لـ WARCannon معالجة أنماط متعددة من التعبيرات العادية عبر 400 تيرابايت في بضع ساعات بتكلفة حوالي 30 دولارًا.
أسرع وأسهل طريقة للبدء هي استخدام AWS CloudShell. فقط الصق هذا السطر الواحد:
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/master/cloudshell/deploy.sh)
إذا كنت تريد استخدام فرع غير master من WARCannon، فقط اكتب:
export GIT_BRANCH=branch_name
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/$GIT_BRANCH/cloudshell/deploy.sh)
ملاحظة: يستخدم نشر CloudShell تخزينًا مؤقتًا، مما يعني فقدان أنماط regex المخصصة عند خروج CloudShell. إذا كنت ستستخدم WARCannon بشكل متكرر، أوصي باستخدام 'التثبيت المحلي' أدناه.
يتطلب WARCannon تثبيت ما يلي:
نصيحة احترافية: للحفاظ على الأشياء نظيفة ومميزة عن غيرها مما قد يكون لديك في AWS، يُوصى بشدة بنشر WARCannon في حساب جديد. يمكنك إنشاء حساب جديد بسهولة من وحدة تحكم 'Organizations' في 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: عدد ملفات WARC المتزامنة للمعالجة لكل vCPU. الرقم 2 هو رقم جيد هنا. إذا كانت العقد لا تحتوي على ذاكرة وصول عشوائي كافية للتشغيل عند هذا المستوى من التوازي (كما قد تواجهه مع مثيلات من نوع 'c')، فستعمل بدلاً من ذلك بأعلى مستوى أمان من التوازي.nodeMaxDuration: أقصى عمر افتراضي لعقد الحوسبة بالثواني. سيتم إنهاء العقد تلقائيًا بعد هذا الوقت إذا لم تكتمل المهمة بعد. القيمة الافتراضية هي 24 ساعة.الإعدادات الاختيارية (اتركها بالكامل إذا لم تكن مستخدمة)
sshKeyName: اسم مفتاح SSH الخاص بـ EC2 موجود بالفعل في us-east-1.allowSSHFrom: قناع CIDR للسماح باتصال SSH منه. سيكون هذا عادةً <yourpublicip>/32للتثبيت، قم بتشغيل هذا:
$ npm install
$ npm link
$ warcannon deploy
تشغيل حملة في WARCannon يستخدم سير عمل بسيط وسهل المتابعة يمكن وصفه بشكل أفضل في هذه الخطوات القليلة:
warcannon deploywarcannon testLocal -swarcannon testwarcannon list 2022warcannon populate 2022-21warcannon firewarcannon syncResultsتابع القراءة لفهم أكثر تفصيلاً لكل خطوة.
يغذي WARCannon بواسطة Common Crawl عبر برنامج AWS Open Data. يتميز Common Crawl بأن البيانات التي يسترجعها عناكبها لا تلتقط نص موقع الويب فحسب، بل تلتقط أيضًا محتوى نصيًا آخر مثل JavaScript وTypeScript وHTML الكامل وCSS وما إلى ذلك. من خلال إنشاء تعبيرات عادية مناسبة قادرة على تحديد المكونات الفريدة، يمكن للباحثين تحديد مواقع الويب بناءً على التقنيات التي تستخدمها، دون لمس الموقع نفسه أبدًا. المشكلة هي أن هذا يتطلب تحليل مئات التيرابايت من البيانات، وهي مهمة صعبة بغض النظر عن الموارد المتاحة لك. لحسن الحظ، يوفر 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 في هذه الحالة. نصيحة احترافية: استخدم RegExr بتنسيق 'JavaScript' لبناء واختبار التعبيرات العادية ضد المطابقات المعروفة الجيدة.
لديك أيضًا خيار التقاط النتائج فقط من نطاقات محددة. للقيام بذلك، ما عليك سوى ملء مصفوفة domains بأسماء النطاقات المؤهلة بالكامل (FQDNs) التي ترغب في تضمينها. يُوصى بتركها فارغة [] لأنها لا تستحق العناء تقريبًا أبدًا (الجهد المحفوظ في المعالجة صغير جدًا)، ولكن يمكن أن تكون مفيدة في بعض الحالات المحددة.
exports.domains = ["example1.com", "example2.com"];
بمجرد ملء matches.js، قم بتشغيل الأمر التالي:
warcannon$ warcannon testLocal -s
يمكنك اختياريًا إضافة مسار إلى ملف WARC في دلو S3 commoncrawl إذا أردت، ولكن سيتم استخدام مسار افتراضي ثابت بخلاف ذلك.
سيقوم WARCannon بمعالجة ملف WARC بتدفق (أو تنزيله بالكامل إذا حذفت -s) للعثور على المطابقات التي قمت بتكوينها. سيحفظ WARCannon النتائج في مجلد ~/.warcannon/ عند المقاطعة بـ ctrl+c أو عند انتهاء المعالجة. هذا يسهل اختبار المطابقات الشائعة بسرعة كبيرة مع الحد الأدنى من عرض النطاق الترددي.
علاوة على كل شيء آخر، سيحاول 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 (SQS) لتوزيع العمل على عقد الحوسبة. لضمان عدم تلوث نتائجك بتشغيلات سابقة، يمكنك إخبار WARCannon بتفريغ قائمة الانتظار:
warcannon$ warcannon emptyQueue
[+] تم مسح [ 15 ] رسالة من قائمة الانتظار
يمكنك بعد ذلك التحقق من حالة قائمة الانتظار:
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
{تم إنشاء 799 قطعة من 100 من 79840 مقطعًا متاحًا"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
أثناء النشر، يقوم WARCannon تلقائيًا بتوفير قاعدة بيانات (warcannon_commoncrawl) ومجموعة عمل (warcannon) في Athena يمكن استخدامها للاستعلام بسرعة عن المعلومات من CommonCrawl. يمكن أن يكون هذا مفيدًا بشكل خاص لملء الحملات المتفرقة بناءً على استعلامات معينة. على سبيل المثال، سيبحث الاستعلام التالي عن ملفات WARC التي تحتوي على ردود من '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 بإلقاء خطأ إذا لم يكن هذا الحقل موجودًا. املأ قائمة الانتظار بنتائج Athena عن طريق تمرير معرف تنفيذ الاستعلام إلى أمر populateAthena.
warcannon populateAthena 0319486e-1846-491c-badf-2e23ae213974
{تم إنشاء 26 قطعة من 10 من 251 مقطعًا متاحًا"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
ملاحظة: بينما قد يبدو ملء مهمة متفرقة لنطاق واحد فكرة جيدة، إلا أنها غالبًا لا تكون كذلك. تميل الردود من نطاق واحد إلى الانتشار على نطاق واسع عبر مجموعة فرعية كبيرة من ملفات WARC. يمكن رؤية ذلك بوضوح باستخدام الاستعلام المثال أعلاه لرؤية أنه من بين حوالي 150,000 سجل في كل ملف WARC، يمكن أن يكون أكبر نتيجة مفردة للمواقع متوسطة الحجم في خانة الآحاد.
مع امتلاء قائمة الانتظار، نحن جاهزون للإطلاق. سيقوم WARCannon بعدة فحوصات سلامة للتأكد من أن كل شيء على ما يرام، ثم يعرض لك تكوين الحملة ويمنحك فرصة أخيرة للإلغاء قبل الانتهاء من الطلب.
warcannon$ warcannon fire
[!] سيطلب هذا [ 6 ] مثيلات فورية من النوع [ m5n.24xlarge, m5dn.24xlarge ]
تستمر لمدة [ 86400 ] ثانية.
لتغيير هذا، قم بتعديل إعداداتك في settings.json وقم بتشغيل warcannon deploy
--> هل أنت مستعد للإطلاق؟ [Yes]:
اسحب الزناد بالرد بـ 'Yes'.
--> هل أنت مستعد للإطلاق؟ [Yes]: Yes
{
"SpotFleetRequestId": "sfr-03dd32b8-51f7-4c8e-802b-a702fc3c8c95"
}
[+] تم إرسال طلب أسطول فوري، ويجب أن تبدأ العقد في الظهور خلال ~5 دقائق.
راقب حالة العقد والتقدم على https://d201offlnmhkmd.cloudfront.net
يتضمن الرد رابطًا إلى عنوان URL الفريد لحالتك، حيث يمكنك مراقبة تقدم حملتك وأداء كل عقدة.

يتم تخزين نتائج WARCannon في S3 بتنسيق JSON، مقسمة حسب كل عقدة مسؤولة عن إنتاج النتائج. يتم تخزين نتائج Athena في نفس الدلو تحت البادئة /athena/. يمكنك مزامنة نتائج حملة إلى مجلد ~/.warcannon/ على جهازك المحلي باستخدام أمر syncResults.
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...
...
[+] تم حذف [ 21 ] ملفًا من S3.
لديك أسئلة، تحتاج مساعدة، تريد المساهمة أو التباهي بالفوز؟ تعال إلى Discord!