سؤال

الجملة التالية اشتعلت عيني في دليل wget

wget --spider --force-html -i bookmarks.html

This feature needs much more work for Wget to get close to the functionality of real web spiders.

أجد خطوط التعليمات البرمجية التالية ذات صلة بخيار العنكبوت في WGET.

src/ftp.c
780:      /* If we're in spider mode, don't really retrieve anything.  The
784:      if (opt.spider)
889:  if (!(cmd & (DO_LIST | DO_RETR)) || (opt.spider && !(cmd & DO_LIST)))
1227:      if (!opt.spider)
1239:      if (!opt.spider)
1268:      else if (!opt.spider)
1827:          if (opt.htmlify && !opt.spider)

src/http.c
64:#include "spider.h"
2405:  /* Skip preliminary HEAD request if we're not in spider mode AND
2407:  if (!opt.spider
2428:      if (opt.spider && !got_head)
2456:      /* Default document type is empty.  However, if spider mode is
2570:           * spider mode.  */
2571:          else if (opt.spider)
2661:              if (opt.spider)

src/res.c
543:  int saved_sp_val = opt.spider;
548:  opt.spider       = false;
551:  opt.spider       = saved_sp_val;  

src/spider.c
1:/* Keep track of visited URLs in spider mode.
37:#include "spider.h"
49:spider_cleanup (void)

src/spider.h
1:/* Declarations for spider.c

src/recur.c
52:#include "spider.h"
279:      if (opt.spider)
366:              || opt.spider /* opt.recursive is implicitely true */
370:             (otherwise unneeded because of --spider or rejected by -R) 
375:                   (opt.spider ? "--spider" : 
378:                     (opt.delete_after || opt.spider
440:      if (opt.spider) 

src/options.h
62:  bool spider;           /* Is Wget in spider mode? */

src/init.c
238:  { "spider",           &opt.spider,            cmd_boolean },

src/main.c
56:#include "spider.h"
238:    { "spider", 0, OPT_BOOLEAN, "spider", -1 },
435:       --spider                  don't download anything.\n"),
1045:  if (opt.recursive && opt.spider)

أود أن أرى الاختلافات في التعليمات البرمجية، وليس مجردة. أنا أحب أمثلة التعليمات البرمجية.

كيف تختلف العناكب على الويب عن العنكبوت WGET في الكود؟

هل كانت مفيدة؟

المحلول

العنكبوت الحقيقي هو الكثير من العمل

كتابة عنكبوت لكل شبكة الاتصالات العالمية كله مهمة تماما --- عليك أن تهتم بالعديد من "التفاصيل الصغيرة" مثل:

  • يجب أن يتلقى كل كمبيوتر عنكبوت بيانات من بضعة آلاف من الخوادم بالتوازي من أجل الاستخدام الفعال لعرض النطاق الترددي للاتصال. (المقبس غير المتزامن I / O).
  • تحتاج إلى العديد من أجهزة الكمبيوتر أن العنكبوت بالتوازي من أجل تغطية كمية شاسعة من المعلومات على شبكة الاتصالات العالمية (التجميع؛ تقسيم العمل)
  • يجب أن تكون مهذبا على مواقع الويب العنكبوت:
    • احترام ملفات Robots.txt.
    • لا تجلب الكثير من المعلومات بسرعة كبيرة: هذا يحمل الخوادم.
    • لا تجلب الملفات التي لا تحتاجها حقا (مثل صور القرص ISO؛ حزم TGZ لتنزيل البرامج ...).
  • يجب عليك التعامل مع معرفات ملفات تعريف الارتباط / الجلسة: تعلق العديد من المواقع معرفات جلسة فريدة إلى عناوين URL لتحديد جلسات العميل. في كل مرة تصل فيها إلى الموقع، يمكنك الحصول على معرف جلسة جديد وعالم افتراضي جديد من الصفحات (بنفس المحتوى). بسبب مثل هذه المشاكل، تجاهل محركات البحث المبكر المحتوى الديناميكي. تعلمت محركات البحث الحديثة ما هي المشاكل وكيفية التعامل معها.
  • يجب عليك الكشف عن البيانات المزعجة وتجاهلها: الاتصالات التي توفر كمية لا حصر لها على ما يبدو من البيانات أو الاتصالات بطيئة للغاية في الانتهاء.
  • إلى جانب الروابط التالية، قد ترغب في تحليل Sitemaps. للحصول على عناوين URL من الصفحات.
  • قد ترغب في تقييم المعلومات المهمة لك وتغييرات في كثير من الأحيان ليتم تحديثها بشكل متكرر أكثر من الصفحات الأخرى. ملاحظة: يتلقى العنكبوت بالكامل www الكثير من البيانات --- تدفع ثمن هذا النطاق الترددي. قد ترغب في استخدام طلبات رأس HTTP لتخمين ما إذا كانت صفحة قد تغيرت أم لا.
  • إلى جانب تلقي، تريد معالجة المعلومات وتخزينها. تقوم Google بإنشاء المؤشرات التي تسرد كل كلمة الصفحات التي تحتوي عليه. قد تحتاج إلى أجهزة كمبيوتر تخزين منفصلة وبنية تحتية لتوصيلها. قواعد البيانات العلائقية التقليدية لا تواصل مع حجم البيانات ومتطلبات الأداء لتخزين / فهرسة www كاملة.

هذا كثير من العمل. ولكن إذا كان هدفك أكثر تواضعا من قراءة شبكة الاتصالات العالمية كله، فيمكنك تخطي بعض الأجزاء. إذا كنت ترغب فقط في تنزيل نسخة من Wiki وما إلى ذلك. تستمر في مواصفات WGET.

ملاحظة: إذا كنت لا تصدق الكثير من العمل، فقد ترغب في قراءة كيفية إعادة اختراع Google معظم عجلات الحوسبة (أعلى Kernel Linux الأساسية) لبناء العناكب الجيدة. حتى لو قطعت الكثير من الزوايا، فهو الكثير من العمل.

اسمحوا لي أن أضيف بضعة ملاحظات تقنية أخرى في ثلاث نقاط

اتصالات متوازية / اتصال مأخذ غير متزامن

يمكنك تشغيل العديد من برامج العنكبوت في العمليات الموازية أو المواضيع. ولكن تحتاج إلى حوالي 5000-10000 اتصالات موازية من أجل الاستفادة الجيدة من اتصال الشبكة الخاص بك. وهذا مقدار العمليات المتوازية / المواضيع ينتج الكثير من النفقات العامة.

الحل الأفضل هو المدخلات / الإخراج غير متزامن: معالجة حوالي 1000 اتصال مواز نظرا لأن Linux Kernel 2.4، إلا أن لينكس لديه دعم ممتاز للتوسع (أوصي أيضا بدراسة الملفات المعينة بالذاكرة) تحسنت باستمرار في الإصدارات الأحدث.

ملاحظة: استخدام I / O غير متزامن يساعد على استخدام "لغة سريعة": من الأفضل كتابة عملية مدفوعة بالصناد لمدة 1000 اتصال مكتوب في بيرل مقارنة بتشغيل 1000 عملية مكتوبة في C. إذا قمت بذلك بشكل صحيح، يمكنك تشبع اتصال 100 ميغابايت مع العمليات المكتوبة في بيرل.

من الإجابة الأصلية: الجانب السفلي من هذا النهج هو أنه سيتعين عليك تطبيق مواصفات HTTP بنفسك في شكل غير متزامن (لا أدرك مكتبة قابلة للاستخدام التي تقوم بذلك). من الأسهل بكثير القيام بذلك باستخدام بروتوكول HTTP / 1.0 Simpler أكثر من بروتوكول HTTP / 1.1 الحديث. ربما لن تستفيد من مزايا HTTP / 1.1 للمتصفحات العادية على أي حال، لذلك قد يكون هذا مكانا جيدا لإنقاذ بعض تكاليف التطوير.

تحرير بعد خمس سنوات:اليوم، هناك الكثير من تقنية المصدر المجانية / المفتوحة المتاحة لمساعدتك في هذا العمل. أنا شخصيا أحب غير متزامن تنفيذ HTTP. من node.js. --- يوفر عليك كل العمل المذكور في الفقرة الأصلية أعلاه. بالطبع، اليوم هناك أيضا الكثير من الوحدات المتاحة بسهولة للمكونات الأخرى التي تحتاجها في العنكبوت الخاص بك. ملاحظة، ومع ذلك، فإن جودة وحدات الطرف الثالث قد تختلف اختلافا كبيرا. يجب عليك التحقق من كل ما تستخدمه. معلومات الشيخوخة: في الآونة الأخيرة، كتبت عنكبوتا باستخدام Node.js ووجدت موثوقية وحدات NPM لمعالجة HTML للربط واستخراج البيانات غير كافية. بالنسبة لهذه الوظيفة، "الاستعانة بمصادر خارجية" هذه المعالجة لعملية مكتوبة بلغة برمجة أخرى. لكن الأمور تتغير بسرعة وبنها قرأت هذه التعليق، قد تكون هذه المشكلة بالفعل شيء من الماضي ...

تقسيم العمل على عدة خوادم

لا يمكن لكمبيوتر واحد مواكبة العنكبوت كامل www. تحتاج إلى توزيع عملك على العديد من الخوادم وتبادل المعلومات بينهما. أقترح تعيين بعض "نطاقات من أسماء النطاقات" معينة لكل خادم: احتفظ بقاعدة بيانات مركزية بأسماء النطاق مع مرجع إلى كمبيوتر عنكبوت.

استخراج عناوين URL من صفحات الويب المستلمة في دفعات: فرزها وفقا لأسماء النطاقات الخاصة بهم؛ قم بإزالة التكرارات وإرسالها إلى كمبيوتر العنكبوت المسؤول. على هذا الكمبيوتر، احتفظ بفهرس عناوين URL التي يتم جلبها بالفعل وجلب عناوين URL المتبقية.

إذا حافظت على قائمة انتظار عناوين URL في انتظار أن يتم جلبها على كل كمبيوتر عنكبوت، فلن يكون لديك اختناقات أداء. لكنها الكثير من البرمجة لتنفيذ هذا.

قراءة المعايير

ذكرت عدة معايير (http / 1.x، robots.txt، ملفات تعريف الارتباط). خذ وقتك لقراءتها وتنفيذها. إذا قمت فقط باتباع أمثلة على المواقع التي تعرفها، فسوف ترتكب أخطاء (ننسى أجزاء المعيار غير ذات الصلة بعيناتك) وتتسبب في مشكلة بالنسبة لتلك المواقع التي تستخدم هذه الميزات الإضافية.

إنه ألم لقراءة المستند القياسي HTTP / 1.1. ولكن جميع التفاصيل الصغيرة تضاف إليها لأن شخص ما يحتاج حقا إلى تفاصيل القليل واستخدامه الآن.

نصائح أخرى

لست متأكدا بالضبط ما كان مؤلفه الأصلي للتعليق يشير إليه، لكنني أستطيع أن أخمن أن WGET بطيء كبريد، لأنه يبدو أنه يستخدم فقط مؤشر ترابط واحد من التنفيذ (على الأقل ما أظهرته).

العناكب "الحقيقية" مثل hertrix. استخدم الكثير من التوازي والحيل لتحسين سرعة الزحف الخاصة بهم، بينما تكون لطيفة في وقت واحد للموقع الإلكتروني أنها تزحف. هذا يعني عادة الحد من الزيارات لموقع واحد بمعدل 1 في الثانية لكل ثانية (أو نحو ذلك)، والزحف على مواقع متعددة في نفس الوقت.

مرة أخرى، كل هذا مجرد تخمين بناء على ما أعرفه عن العناكب بشكل عام، وما نشرته هنا.

لسوء الحظ، العديد من العناكب على الويب "الحقيقية" الأكثر شهرة هي مصدر مغلقة، ومغلقة بالفعل ثنائية. ومع ذلك، هناك عدد من التقنيات الأساسية WGE مفقود:

  • تماثل؛ أنت لن تكون قادرا على مواكبة الويب بأكمله دون استرداد صفحات متعددة في وقت واحد
  • تحديد الأولويات؛ بعض الصفحات هي أكثر أهمية بالنسبة للبريد أكثر من غيرها
  • قصر معدل سيتم حظرك بسرعة إذا استمرت في سحب الصفحات بأسرع ما يمكن
  • حفظ لشيء آخر غير النظام المحلي؛ الويب كبير بما يكفي أنه لن يصلح في شجرة دليل واحدة
  • إعادة تشغيل الصفحات بشكل دوري دون إعادة تشغيل العملية بأكملها؛ في الممارسة العملية، مع عنكبيدر حقيقي، ستحتاج إلى إعادة فحص الصفحات "المهمة" للتحديثات بشكل متكرر، في حين أن الصفحات الأقل مثيرة للاهتمام يمكن أن تذهب لعدة أشهر.

هناك أيضا مدخلات أخرى مختلفة يمكن استخدامها مثل Sitemaps وما شابه ذلك. Point IS، WGET غير مصمم على العنكبوت بالكامل، وليس حقا شيئا يمكن التقاطه في نموذج رمز صغير، حيث إنها مشكلة في الأسلوب الكلي بالكامل المستخدم، بدلا من أي خطأ فرعي صغير يخطئ للمهمة.

لن أذهب إلى تفاصيل حول كيفية العنكبوت الإنترنت، وأعتقد أن التعليق WGET فيما يتعلق بالبريد الإلكتروني موقع واحد لا يزال تحديا خطيرا.

  • كنسخة عنكبوت تحتاج إلى معرفة متى تتوقف، لا تذهب إلى الزحف العودية لمجرد تغيير عنوان URL مثل التاريخ = 1/1/1900 إلى 1/2/1900 وما إلى ذلك
  • حتى التحدي الأكبر لفرز إعادة كتابة عنوان URL (ليس لدي أدنى فكرة عما أذا من أي وقت مضى كيف تتعامل جوجل أو أي مقابض أخرى). إنه تحد كبير جدا للزحف بما فيه الكفاية ولكن ليس كثيرا. وكيف يمكن للمرء التعرف تلقائيا على إعادة كتابة عنوان URL مع بعض المعلمات العشوائية والتغييرات العشوائية في المحتوى؟
  • تحتاج إلى تحليل فلاش / جافا سكريبت على الأقل ما يصل إلى مستوى
  • تحتاج إلى النظر في بعض مشكلات HTTP المجنونة مثل يتمركز بطاقة شعار. حتى تحليل HTML ليس بالأمر السهل، بالنظر إلى أن معظم مواقع الويب ليست XHTML ومتصفحات مرنة للغاية في بناء الجملة.

لا أعرف مقدار هذه المنفذة أو التي تم تنفيذه في WGET ولكن قد ترغب في إلقاء نظرة على HTTRACK لفهم تحديات هذه المهمة.

أحب أن أعطيك بعض أمثلة التعليمات البرمجية ولكن هذه مهام كبيرة وسوف يكون العنكبوت اللائق حوالي 5000 loc بدون مكتبات الطرف الثالث.

+ بعض منهم يفسرون بالفعل @ yaakov-belch لذلك أنا لن اكتب لهم مرة أخرى

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top