سؤال

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

  1. تجريف شاشة بسيط استنادًا إلى عنوان URL الذي يشير إلى الصفحة التي يوجد بها الجزء الذي أحتاجه. هل أسهل طريقة للقيام بذلك هي استخدام كائن WebClient والحصول على HTML الكامل؟

  2. بمجرد سحب HTML وحفظه، قم بتحليله عبر بعض البرامج النصية واسحب فقط الجزء والقيم التي أحتاجها (على سبيل المثال، قيمة سعر المنتج).مشكلتي هي أن هذا البرنامج النصي يجب أن يكون فريدًا بطريقة ما لكل موقع أقوم بسحبه، ويجب أن يكون قادرًا على التعامل مع HTML القبيح حقًا (لذلك لا أعتقد أن XSLT سيفعل ذلك ...) وأحتاج إلى أن أكون قادرًا على تغييره أثناء التنقل حيث يتم تحديث وتغيير المواقع المستهدفة.سأقوم أخيرًا بأخذ القيم المحددة وكتابتها في قاعدة البيانات لجعلها قابلة للبحث

هل يمكن أن تعطيني بعض التلميحات حول كيفية تصميم أفضل طريقة؟هل ستفعل شيئًا مختلفًا عما هو موضح أعلاه؟

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

المحلول

  1. نعم، يمكن أن يعمل WebClient بشكل جيد لهذا الغرض.سيعمل عنصر التحكم WebBrowser أيضًا وفقًا لمتطلباتك.إذا كنت ستقوم بتحميل المستند إلى HtmlDocument (IE HTML DOM)، فقد يكون من الأسهل استخدام عنصر تحكم متصفح الويب.

  2. يمكن استخدام كائن HtmlDocument المضمن الآن في .NET لتحليل HTML.لقد تم تصميمه ليتم استخدامه مع عنصر تحكم WebBrowser ولكن يمكنك استخدام التنفيذ من mshtml dll أيضًا.لم أستخدم HtmlAgilityPack، لكني سمعت أنه يمكنه القيام بعمل مماثل.

ستقوم كائنات HTML DOM عادةً بمعالجة وإصلاح معظم HTML القبيح الذي ترميه عليهم.فضلا عن السماح بطريقة أفضل لتحليل HTML، document.GetElementsByTag للحصول على مجموعة من كائنات العلامة على سبيل المثال.

أما بالنسبة للتعامل مع المتطلبات المتغيرة للموقع، فيبدو أنه مرشح جيد لـ نمط الاستراتيجية.يمكنك تحميل الاستراتيجيات لكل موقع باستخدام الانعكاس أو شيء من هذا النوع.

لقد عملت على نظام يستخدم XML لتحديد مجموعة عامة من المعلمات لاستخراج النص من صفحات HTML.في الأساس سيحدد عناصر البداية والنهاية لبدء الاستخراج وإنهائه.لقد وجدت أن هذه التقنية تعمل بشكل جيد بما يكفي لعينة صغيرة، ولكنها تصبح مرهقة إلى حد ما ويصعب تخصيصها عندما تصبح مجموعة المواقع أكبر وأكبر.من الصعب الحفاظ على تحديث XML ومحاولة الاحتفاظ بمجموعة عامة من XML وترميز التعامل مع أي نوع من المواقع.ولكن إذا كان نوع وعدد المواقع صغيرًا فقد ينجح هذا.

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

نصائح أخرى

حسنًا ، سأتبع الطريقة التي تصفها.

1.ما مقدار البيانات التي سيتعامل معها؟لا ينبغي أن يمثل جلب HTML الكامل عبر WebClient / HttpWebRequest مشكلة.

2.سأذهب ل أتش تي أم أل أجيليتيباك لتحليل HTML.إنه متسامح جدًا، ويمكنه التعامل مع العلامات القبيحة جدًا.نظرًا لأن HtmlAgilityPack يدعم XPath، فمن السهل جدًا الحصول على تحديدات xpath محددة للمواقع الفردية.

أنا هارب وسأتوسع في هذه الإجابة في أسرع وقت ممكن.

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