تحليل موقع مسرح السينما في غولانغ

مرحباً بالجميع ، في هذه المقالة سنلقي نظرة على عينة صغيرة من التعليمات البرمجية مكتوبة لجمع البيانات من موقع بلغة البرمجة الشائعة Go اليوم.

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

بالنسبة لأحد المشاريع الداخلية ، احتجنا إلى جمع بيانات حول الأفلام التي يتم تأجيرها وجدول العروض ، والآن سننظر في أول (أبسط) نسخة من المحلل اللغوي ، والتي بدأ بها كل شيء.

بالنسبة لأولئك الذين كسالى جدا لقراءة رمز المقالة ، أقدم على الفور رابطًا إلى المستودع .

في الإصدار الأول ، تمكن المحلل اللغوي من جمع المعلومات التالية فقط:

  • حول الجلسات في سينما واحدة ،
  • وصف مفصل ،
  • عنوان،
  • ستوديو ،

واحفظه في JSON. في البداية ، تحتاج إلى تحديد المكتبة المناسبة للتحليل.

تقدم Google عددًا كبيرًا من الخيارات للاستعلام `golang web scraping` ، وينعكس الكثير منها في هذه القائمة ، أنصحك بالتعرف عليها ، لقد اخترت geziyor ، لأنها تدعم JS Rendering (والتي ، بالمناسبة ، لن نستخدمها في هذا على سبيل المثال ، هذه الميزة مفيدة جدًا عند تحليل المواقع) وهي سهلة الاستخدام للغاية.

لذلك ، يتم تحديد المكتبة ، والخطوة التالية هي تثبيتها والبدء في استخدامها في التعليمات البرمجية.
تثبيت المكتبة بسيط للغاية:

go get -u github.com/geziyor/geziyor

الآن دعنا ننتقل إلى كتابة التعليمات البرمجية.

داخل نص الوظيفة الرئيسية ، نطلق على المحلل اللغوي ، ونعطيه عنوان URL للصفحة التي سنبدأ من خلالها جمع البيانات ونشير إلى أننا نريد تصدير النتيجة إلى ملف JSON:


func main() { 
    geziyor.NewGeziyor(&geziyor.Options{ 
        StartURLs: []string{"https://kinoteatr.ru/raspisanie-kinoteatrov/city/#"}, 
        ParseFunc: parseMovies, 
        Exporters: []export.Exporter{&export.JSON{}}, 
    }).Start() 
}

لقد تم البدء ، ولكن لا يوجد منطق كافٍ لجمع البيانات ، لذلك نحتاج إلى تنفيذ وظيفة parseMovies .

سيكون منطق المجموعة كما يلي:

  • ابحث عن كتلة تحتوي على معلومات الفيلم ،
  • مجموعة من المعلومات حول جميع الجلسات داخل هذه الكتلة ،
  • مجموعة من اسم الفيلم والاستوديو السينمائي ،
  • جمع رابط لصفحة تحتوي على معلومات تفصيلية حول الفيلم ،
  • مجموعة من الأوصاف من هذه الصفحة

دعنا ننتقل إلى تنفيذ هذه الوظيفة.


هنا ، يتم تحديد جميع الكتل التي تحتوي على معلومات حول الفيلم لمزيد من المعالجة.

func parseMovies(g *geziyor.Geziyor, r *client.Response) {
    r.HTMLDoc.Find("div.shedule_movie").Each(func(i int, s *goquery.Selection) { 

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


var sessions = strings.Split(s.Find(".shedule_session_time").Text(), " \n ") 
sessions = sessions[:len(sessions)-1] 

for i := 0; i < len(sessions); i++ { 
    sessions[i] = strings.Trim(sessions[i], "\n ") 
}

هذه الكتلة من التعليمات البرمجية مسؤولة عن الحصول على صفحة تحتوي على معلومات تفصيلية حول الفيلم والحصول على وصفه.


if href, ok := s.Find("a.gtm-ec-list-item-movie").Attr("href"); ok {
    g.Get(r.JoinURL(href), func(_g *geziyor.Geziyor, _r *client.Response) {
        description = _r.HTMLDoc.Find("span.announce p.movie_card_description_inform").Text() 
        description = strings.ReplaceAll(description, "\t", "") 
        description = strings.ReplaceAll(description, "\n", "") 
        description = strings.TrimSpace(description) 

يستدعي هذا واجهة برمجة التطبيقات لتصدير النتائج إلى ملف JSON.


g.Exports <- map[string]interface{}{ 
    "title":        strings.TrimSpace(s.Find("span.movie_card_header.title").Text()), 
    "subtitle":    strings.TrimSpace(s.Find("span.sub_title.shedule_movie_text").Text()), 
    "sessions":    sessions, 
    "description": description, 
}

مرحى ، لقد انتهيت! يبقى فقط لدمج الكتل المكتوبة من التعليمات البرمجية معًا وبدء التحليل.

هذه هي الطريقة التي يعمل بها المحلل اللغوي ، نرى رسائل على الاستلام الناجح للصفحات في المحطة الطرفية ، وهذا مناسب.



هكذا تبدو نتيجة التحليل.



شكرًا لقراءة المقال ، أحب البرمجة على Go.

All Articles