Advertisement
  1. Code
  2. Ruby
Code

بناء اول web scraper خاص بك، الجزء 1

by
Length:LongLanguages:

Arabic (العربية/عربي) translation by Ayman Amar (you can also view the original English article)

Rubyland لديها جوهرتين احتلت مستخرج الويب "web scraper" على مدى السنوات القليلة الماضية: Nokogiri و Mechanize. نحن ننشئ مقالا عن كل من هذه قبل وضعها في العمل مع مثال.

المواضيع

  • مستخرج الويب ؟
  • الإذن
  • المشكل
  • Nokogiri
  • الاستخراج؟
  • الصفحات
  • API
  • Node Navigation

مستخرج الويب ؟

هناك مصطلحات أكثر جمالا من الويب أو شاشة الإستخراج. حصاد الويب واستخراج بيانات الويب تظهر لكم بشكل كبير ما يجري. يمكننا جعل استخراج البيانات من صفحات الويب تلقائي، وهذه ليست معقدة أيضا.

بطريقة تسمح لك هذه الأدوات بمحاكاة تصفح الإنترنت اليدوي وجعله تلقائي. تكتب البرنامج الذي يستخرج فقط نوع البيانات التي تهمك. استهداف بيانات محددة يكاد يكون سهلا مثل استخدام محددات CSS.

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

اليوم، لا أهتم كثيرا لإذابة العقل UX هذا. مستخرج يمكنه أن يقوم بالتحميل لي ولن يأخذ مني سوى بضع دقائق. ليست مشكلة كبيرة!

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

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

ماذا عن الAPI؟ سؤال جيد جداً. إذا كان يمكنك الوصول إلى خدمة مع API، وغالبا ما يكون هناك حاجة صغيرة لكتابة المستخرج الخاص بك. هذا الاسلوب غالبا ما يكون لمواقع الويب التي لا تقدم هذا النوع من الأشياء. بدون API، غالبا ما تكون هذه هي الطريقة الوحيدة لجعل استخراج المعلومات من مواقع الويب تلقائي.

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

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

الإذن

قبل أن تبدأ الإستخراج، تأكد من الحصول على الإذن من المواقع التي تحاول الوصول لاستخراج البيانات. إذا كان الموقع يحتوي على API أو تغذية RSS، على سبيل المثال، قد لا يكون من الأسهل فقط الحصول على هذا المحتوى المرغوب، بل قد يكون أيضا الخيار القانوني للاختيار.

ليس الجميع سوف يقدر ذلك إذا كنت تقوم باستخراج واسع على مواقعهم - مفهومة لذلك. قم بدراسة الموقع المعين الذي أنت مهتم به، ولا تضع نفسك في ورطة. وهناك احتمالات منخفضة أنك سوف تلحق أضرارا جسيمة، ولكن المجازفة بخطر غير معروف ليست طريقة.

المشكلة

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

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

هذا الصيف الماضي بدأت في الجد وعملت على موقع Middleman الذي يتم استضافته عبر صفحات GitHub. للموسم الثاني من العرض، أردت شيئا جديدا. تصميم جديد ومبسط، تخفيض السعر لنشر حلقات جديدة، ولا معارك قبضات مع Heroku—heaven! كان الشيء الذي لدي الكذب حول 139 حلقة التي تحتاج إلى استيرادها وتحويلها أولا من أجل العمل مع Middleman.

بالنسبة للمنشورات، يستخدم ميدلمان ملفات .markdown التي تسمى المسألة الأمامية للبيانات - الذي يحل محل قاعدة البيانات الخاصة بي أساسا. القيام بهذا النقل يدويا ليس خيارا ل 139 حلقة. هذا هو الحساب. كنت بحاجة إلى معرفة وسيلة لتحليل HTML من موقعي القديم، استخراج المحتوى ذات الصلة، ونقله إلى منشورات المدونة التي أستخدم لنشر حلقات بودكاست جديدة على Middleman.

لذلك، على المواد الثلاث المقبلة، سوف أعرف لكم الأدوات المستخدمة عادة في Rubyland لمثل هذه المهام. في النهاية، سوف نذهب إلى الحل ليعرض لك شيئا عملي كذلك.

Nokogiri

حتى لو كنت جديدا تماما على Ruby/القضبان، وهناك احتمالات جيدة جدا ان كنت قد سمعت بالفعل عن هذه الجواهر قليلا. يتم إسقاط الاسم في كثير من الأحيان والعصي معك بسهولة. لست متأكدا لاكن الكثير يعرفون أن nokogiri باليابانية هي "منشار".

إنه اسم مناسب عند فهم ما تفعله الأداة. خالق هذه الجوهرة هو التندرلوف الجميل، آرون باترسون. Nokogiri يحول وثائق XML و HTML إلى بنية بيانات—هيكل شجرة بيانات، ليكون أكثر دقة. الأداة سريعة وjقدم واجهة جميلة كذلك. عموما، انها مكتبة قوية جدا حيث تعتني بالعديد من احتياجات HTML كشط الخاص بك.

يمكنك استخدام Nokogiri ليس فقط لتحليل HTML;XML هي لعبة عادلة كذلك. فهو يوفر لك خيارات كل من لغة مسار XML وواجهات CSS لاجتياز المستندات التي تقوم تحميلها. مسار لغة XML، أو XPath باختصار، هي لغة استعلام.

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

صفحات

ما نحتاج دائما للبدء به هو جلب الصفحة الفعلية التي نهتم بها. نحدد أي نوع من مستند Nokogiri نريد تحليل-XML أو HTML على سبيل المثال:

some_scraper.rb

Nokogiri:XML و Nokogiri:HTML يمكن أن تأخذ كائنات IO أو كائنات سلسلة. ما حدث أعلاه واضح. هذه تفتح وتجلب الصفحة المعينة باستخدامopen-uri ومن ثم تحمل هيكلها، XML أو HTML في مستند Nokogiri جديد. XML ليست شيئا للمبتدئين التعامل معه في أغلب الأحيان.

لذلك، أوصي بأن نركز على تحليل HTML في الوقت الحالي. لماذا open-uri ؟ هذه الوحدة من مكتبة Ruby القياسية تمكننا من الاستيلاء على الموقع دون ضجة كبيرة. لأن كائنات IO هي لعبة عادلة، يمكننا أن نقوم باستخدام سهل لopen-uri.

API

دعونا نضع هذا في الممارسة مع مثال صغير:

at_css

some_podcast_scraper.rb

ما قمنا به هنا يمثل جميع الخطوات التي عادة ما تكون مرتبطة مع مستخرج الويب فقط على المستوى الجزئي. نقرر URL الذي نحتاج إليه والموقع الذي نحتاج إلى جلبه، ونحمله في مستند Nokogiri جديد. ثم نفتح هذه الصفحة ونستهدف قسما معينا.

هنا أردت فقط أن أعرف عنوان أحدث حلقة. استخدام أسلوب at_css ومحدد CSS ل h2.post-title كل ما أريده هو استهداف نقطة الاستخراج. مع هذا الأسلوب سوف نقوم فقط باستخراج هذا العنصر مفرد، على الرغم ذالك. هذا يعطينا محدد كامل - الذي هو في معظم الوقت ليس بالضبط ما نحتاج إليه. لذلك نستخلص فقط جزء النص الداخلي من هذه العقدة عبر طريقة النص. للمقارنة، يمكنك التحقق من الإخراج لكل من الهيدر والنص أدناه.

الإخراج

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

انتباه!

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

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

css

لن يعطينا اسلوب cssعنصر واحد فقط من الخيارات بل أي عنصر يطابق معايير البحث على الصفحة. جميلة أنيقة ومباشرة!

some_scraper.rb

الإخراج

الاختلاف الصغير الوحيد في هذا المثال هو أنني أكرر الرؤوس الخام أولا. كما استخرجت النص الداخلي باسلوب النص. Nokogiri يتوقف تلقائيا في نهاية الصفحة ولا يحاول متابعة ترقيم الصفحات في أي مكان تلقائيا.

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

some_scraper.rb

الإخراج

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

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

السمات

ما يمكن أن يكون في متناول يدي في هذه المرحلة هو استخراج hrefللحلقات بانفراد كذلك. هذا لا يمكن أن يكون أبسط.

some_scraper.rb

الأجزاء الأكثر أهمية لجذب الاهتمام هنا هي [:href] و podcast_url. إذا وضعت علامة على [:] يمكنك ببساطة استخراج السمة من الهدف المحدد. أنا استخرجت قليلا، ولكن يمكنك أن ترى بوضوح أكثر كيف يعمل أدناه.

للحصول على URL كامل ومفيد، قمت بحفظ نطاق الجذر في متغير وبنيت URL كامل لكل حلقة.

دعونا نلقي نظرة سريعة على الإخراج:

الإخراج

أنيق، أليس كذلك؟ يمكنك القيام بنفس الشيء لاستخراج [:class] من محدد.

إذا كانت هذه العقدة تحتوي على أكثر من فئة واحدة، سوف تحصل على قائمة من كل منهم.

Node Navigation

  • الأصل
  • الأطفال
  • previous_sibling
  • next_sibling

عادة نتعامل مع شجرة هياكل في CSS أو حتى jQuery. سيكون مؤلما إذا Nokogiri لم تقدم API مفيد للتحرك داخل مثل هذه الأشجار.

some_scraper.rb

الإخراج

كما ترى بنفسك، هذه بعض الاشياء القوية جدا، وخصوصا عندما ترى ما كان .parent قادر على الإلتقاط دفعة واحدة. بدلا من تحديد مجموعة من العقد يدويا، هل يمكن إلتقاطها بالجملة.

يمكنك حتى سلسلتهم للمزيد من الانخراط. يمكنك أن تأخذ هذا المعقد كما تريد، بطبيعة الحال، ولكن أود أن أنبهك بأن تبقي الأمور بسيطة. يمكن وبشكل سريع أن تصبح غير عملية ويصعب فهمها. تذكر، "ابقيه بسيط، غبي!"

some_scraper.rb

الإخراج

افكار اخيرة

Nokogiri ليست مكتبة ضخمة، ولكن لديها الكثير لتقدمه. أوصيك أن تلعب مع ما تعلمته حتى الآن وتوسيع معرفتك من خلال مستنداتها عند ضرب الجدار. ولكن لا تضع نفسك في ورطة!

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.