پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا

مضمون جو مصنف، جنهن جو ترجمو اسان اڄ شايع ڪري رهيا آهيون، چوي ٿو ته ان جو مقصد اهو آهي ته سيلينيم استعمال ڪندي پٿون ۾ ويب اسڪراپر جي ترقي بابت، جيڪو ايئر لائن ٽڪيٽ جي قيمتن جي ڳولا ڪري ٿو. جڏهن ٽڪيٽن جي ڳولا ۾، لچڪدار تاريخون استعمال ڪيون وينديون آهن (+- مخصوص تاريخن جي نسبت 3 ڏينهن). اسڪراپر ڳولا جي نتيجن کي ايڪسل فائل ۾ محفوظ ڪري ٿو ۽ ان شخص کي موڪلي ٿو جيڪو ڳولا ڪري ٿو هڪ اي ميل سان گڏ انهن کي ڇا مليو. هن منصوبي جو مقصد مسافرن کي بهترين ڊيل ڳولڻ ۾ مدد ڪرڻ آهي.

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا

جيڪڏھن، مواد کي سمجھڻ دوران، توھان محسوس ڪيو وڃائجي، ھڪڙي نظر وٺو هي مضمون.

اسان ڇا ڳولڻ وارا آهيون؟

توهان هتي بيان ڪيل سسٽم کي استعمال ڪرڻ لاء آزاد آهيو جيئن توهان چاهيو ٿا. مثال طور، مون ان کي استعمال ڪيو هفتي جي آخر ۾ سياحن ۽ ٽڪيٽن جي ڳولا لاءِ منهنجي شهر ڏانهن. جيڪڏهن توهان منافعي بخش ٽڪيٽون ڳولڻ ۾ سنجيده آهيو، توهان سرور تي اسڪرپٽ هلائي سگهو ٿا (سادو سرور130 روبل هڪ مهيني لاء، هن لاء ڪافي مناسب آهي) ۽ پڪ ڪريو ته اهو هڪ ڏينهن يا ٻه ڀيرا هلندو آهي. ڳولا جا نتيجا توهان ڏانهن اي ميل ذريعي موڪليا ويندا. ان کان علاوه، مان هر شي کي ترتيب ڏيڻ جي صلاح ڏيان ٿو ته اسڪرپٽ هڪ ايڪسل فائل کي ڊروپباڪس فولڊر ۾ ڳولا جي نتيجن سان محفوظ ڪري ٿو، جيڪو توهان کي اهڙي فائلن کي ڪٿي به ۽ ڪنهن به وقت ڏسڻ جي اجازت ڏيندو.

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا
مون اڃا تائين غلطين سان ٽيرف نه مليا آهن، پر مان سمجهان ٿو ته اهو ممڪن آهي

جڏهن ڳولها، جيئن اڳ ۾ ئي ذڪر ڪيو ويو آهي، هڪ "لچڪدار تاريخ" استعمال ڪيو ويندو آهي؛ اسڪرپٽ آڇون ڳولي ٿو جيڪي ڏنل تاريخن جي ٽن ڏينهن اندر آهن. جيتوڻيڪ جڏهن اسڪرپٽ هلائي رهيو آهي، اهو صرف هڪ طرفي ۾ آڇون ڳولي ٿو، ان کي تبديل ڪرڻ آسان آهي ته جيئن اهو ڪيترن ئي پروازن جي هدايتن تي ڊيٽا گڏ ڪري سگهي. ان جي مدد سان، توهان شايد غلط تعرفن کي ڳولي سگهو ٿا؛ اهڙيون ڳولها تمام دلچسپ ٿي سگهن ٿيون.

توهان کي ٻي ويب اسڪراپر جي ضرورت ڇو آهي؟

جڏهن مون پهريون ڀيرو ويب اسڪراپنگ شروع ڪيو، مون کي ايمانداري سان ان ۾ خاص دلچسپي نه هئي. مون کي اڳڪٿي ماڊلنگ جي ميدان ۾ وڌيڪ منصوبا ڪرڻ چاهيو ٿا, مالي تجزيي, ۽ ممڪن طور تي, تحليل جي ميدان ۾ جذباتي رنگن جي متن. پر اهو ظاهر ٿيو ته اهو معلوم ڪرڻ ڏاڍو دلچسپ هو ته هڪ پروگرام ڪيئن ٺاهيو جيڪو ويب سائيٽن مان ڊيٽا گڏ ڪري. جيئن ته مون هن موضوع ۾ مشغول ڪيو، مون محسوس ڪيو ته ويب اسڪراپنگ انٽرنيٽ جو "انجن" آهي.

توهان شايد سوچيو ته اهو هڪ تمام جرئت وارو بيان آهي. پر غور ڪيو ته گوگل هڪ ويب اسڪراپر سان شروع ڪيو جيڪو ليري پيج جاوا ۽ پٿون استعمال ڪندي ٺاهيو. گوگل روبوٽ انٽرنيٽ جي ڳولا ڪري رهيو آهي، ڪوشش ڪري رهيو آهي ته هو پنهنجي صارفين کي انهن جي سوالن جا بهترين جواب فراهم ڪن. ويب اسڪراپنگ کي لامحدود استعمال ڪيو ويو آهي، ۽ جيتوڻيڪ جيڪڏهن توهان ڊيٽا سائنس ۾ ڪنهن ٻئي شيء ۾ دلچسپي وٺندا آهيو، توهان کي ڪجهه اسڪريپنگ صلاحيتن جي ضرورت پوندي جيڪا ڊيٽا حاصل ڪرڻ لاء توهان کي تجزيو ڪرڻ جي ضرورت آهي.

مون کي هتي استعمال ٿيندڙ ٽيڪنالاجي مان ڪجهه شاندار مليو ڪتاب ويب اسڪراپنگ بابت، جيڪو مون تازو حاصل ڪيو. اهو ڪيترن ئي سادي مثالن ۽ خيالن تي مشتمل آهي عملي طور لاڳو ڪرڻ لاءِ جيڪي توهان سکيو آهي. ان کان علاوه، اتي هڪ تمام دلچسپ باب آهي reCaptcha چيڪن کي نظرانداز ڪرڻ تي. اها خبر مون لاءِ آئي، ڇاڪاڻ ته مون کي اها به خبر نه هئي ته اهڙن مسئلن کي حل ڪرڻ لاءِ خاص اوزار ۽ ايستائين جو پوريون خدمتون به آهن.

ڇا توهان سفر ڪرڻ پسند ڪندا آهيو؟!

هن سيڪشن جي عنوان ۾ پيدا ڪيل سادي ۽ بلڪه بي ضرر سوال لاء، توهان اڪثر ڪري هڪ مثبت جواب ٻڌي سگهو ٿا، ان شخص جي سفر جي ڪجهه ڪهاڻيون سان گڏ، جن کي اهو پڇيو ويو هو. اسان مان گهڻا متفق هوندا ته سفر هڪ بهترين طريقو آهي پاڻ کي نئين ثقافتي ماحول ۾ وسارڻ ۽ پنهنجي افق کي وسيع ڪرڻ. بهرحال، جيڪڏهن توهان ڪنهن کان پڇو ته ڇا اهي ايئر لائن ٽڪيٽ ڳولڻ پسند ڪن ٿا، مون کي پڪ آهي ته جواب ايترو مثبت نه هوندو. حقيقت جي طور تي، پٿون هتي اسان جي مدد لاء اچي ٿو.

پهريون ڪم جيڪو اسان کي حل ڪرڻ جي ضرورت آهي هڪ سسٽم ٺاهڻ جي رستي تي هوائي ٽڪيٽن تي معلومات ڳولڻ لاء هڪ مناسب پليٽ فارم چونڊيو جنهن مان اسان معلومات وٺنداسين. هن مسئلي کي حل ڪرڻ مون لاء آسان نه هو، پر آخر ۾ مون ڪيڪ سروس چونڊيو. مون ڪوشش ڪئي Momondo، Skyscanner، Expedia، ۽ ڪجھ ٻين جون خدمتون، پر انھن وسيلن تي روبوٽ جي حفاظت جو ميکانيزم ناقابل برداشت ھو. ڪيترين ئي ڪوششن کان پوءِ، جنهن دوران مون کي ٽريفڪ لائيٽن، پيادلن جي ڪراسنگ ۽ سائيڪلن سان منهن ڏيڻو پيو، سسٽم کي يقين ڏيارڻ جي ڪوشش ڪئي ته مان انسان آهيان، مون فيصلو ڪيو ته ڪيڪ منهنجي لاءِ مناسب آهي، ان حقيقت جي باوجود ته تمام گهڻا صفحا لوڊ ٿيل آهن. ٿوري وقت ۾، ۽ چيڪ پڻ شروع ٿئي ٿو. مون 4 کان 6 ڪلاڪن جي وقفي تي سائيٽ تي درخواستون موڪلڻ لاءِ بوٽ ٺاهڻ جو انتظام ڪيو، ۽ هر شي ٺيڪ ڪم ڪيو. وقت بوقت، مشڪلاتون پيدا ٿينديون آهن جڏهن ڪيڪ سان ڪم ڪندي، پر جيڪڏهن اهي توهان کي چيڪن سان ڇڪڻ شروع ڪن ٿا، ته پوء توهان کي انهن سان دستي طور تي ڊيل ڪرڻ جي ضرورت آهي ۽ پوء بوٽ لانچ ڪريو، يا ڪجهه ڪلاڪ انتظار ڪريو ۽ چيڪ بند ٿيڻ گهرجي. جيڪڏهن ضروري هجي ته، توهان آساني سان ٻئي پليٽ فارم لاءِ ڪوڊ ٺاهي سگهو ٿا، ۽ جيڪڏهن توهان ائين ڪريو ٿا، ته توهان تبصرن ۾ ان جي رپورٽ ڪري سگهو ٿا.

جيڪڏهن توهان صرف ويب اسڪراپنگ سان شروع ڪري رهيا آهيو ۽ توهان کي خبر ناهي ته ڪجهه ويب سائيٽون ان سان ڇو جدوجهد ڪن ٿيون، پوءِ ان کان اڳ جو توهان هن علائقي ۾ پنهنجو پهريون پروجيڪٽ شروع ڪريو، پنهنجو پاڻ تي احسان ڪريو ۽ گوگل سرچ ڪريو لفظن تي ”ويب اسڪراپنگ آداب“. . توهان جا تجربا توهان جي سوچڻ کان جلدي ختم ٿي سگهن ٿا جيڪڏهن توهان ويب اسڪراپنگ کي غير معقول طريقي سان ڪندا آهيو.

شروع ڪرائڻ

هتي اسان جي ويب اسڪراپر ڪوڊ ۾ ڇا ٿيندو جو هڪ عام جائزو آهي:

  • گھربل لائبريريون درآمد ڪريو.
  • گوگل ڪروم ٽيب کولڻ.
  • هڪ فنڪشن کي ڪال ڪريو جيڪو بوٽ شروع ڪري ٿو، ان کي پاس ڪري ٿو شهرن ۽ تاريخون جيڪي ٽڪيٽن جي ڳولا ۾ استعمال ڪيا ويندا.
  • هي فنڪشن پهرين ڳولا جا نتيجا وٺي ٿو، بهترين ترتيب سان ترتيب ڏنل، ۽ وڌيڪ نتيجا لوڊ ڪرڻ لاءِ هڪ بٽڻ تي ڪلڪ ڪري ٿو.
  • ٻيو فنڪشن سڄي صفحي مان ڊيٽا گڏ ڪري ٿو ۽ ڊيٽا فريم موٽائي ٿو.
  • ٻن پوئين قدمن کي ترتيب ڏيڻ جي قسمن کي ٽڪيٽ جي قيمت (سستا) ۽ پرواز جي رفتار (تيز ترين) ذريعي استعمال ڪيو ويو آهي.
  • اسڪرپٽ جي استعمال ڪندڙ کي هڪ اي ميل موڪليو ويو آهي جنهن ۾ ٽڪيٽ جي قيمتن جو خلاصو (سست ترين ٽڪيٽون ۽ سراسري قيمت)، ۽ معلومات سان گڏ هڪ ڊيٽا فريم ٽن مٿي ذڪر ڪيل اشارن جي ترتيب سان هڪ ايڪسل فائل طور محفوظ ڪيو ويو آهي.
  • مٿي ڏنل سڀئي عمل هڪ مخصوص وقت کان پوء هڪ چڪر ۾ ڪيا ويا آهن.

اهو ياد رکڻ گهرجي ته هر Selenium پروجيڪٽ ويب ڊرائيور سان شروع ٿئي ٿو. مان استعمال ڪريان ٿو ڪروم ڊرائيور، مان گوگل ڪروم سان ڪم ڪريان ٿو، پر ٻيا اختيار آھن. PhantomJS ۽ Firefox پڻ مشهور آهن. ڊرائيور کي ڊائون لوڊ ڪرڻ کان پوء، توهان کي ان کي مناسب فولڊر ۾ رکڻو پوندو، ۽ اهو ان جي استعمال لاء تياري مڪمل ڪري ٿو. اسان جي اسڪرپٽ جون پھريون لائينون ھڪ نئين ڪروم ٽيب کي کولينديون آھن.

ذهن ۾ رکو ته منهنجي ڪهاڻي ۾ آئون نئين افقون کولڻ جي ڪوشش نه ڪري رهيو آهيان هوائي ٽڪيٽن تي وڏيون ڊيل ڳولڻ لاء. اهڙيون آڇون ڳولڻ جا وڌيڪ جديد طريقا آهن. مان صرف هن مواد جي پڙهندڙن کي هن مسئلي کي حل ڪرڻ لاء هڪ سادي پر عملي طريقو پيش ڪرڻ چاهيان ٿو.

هتي اهو ڪوڊ آهي جنهن بابت اسان مٿي ڳالهايو آهي.

from time import sleep, strftime
from random import randint
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import smtplib
from email.mime.multipart import MIMEMultipart

# Используйте тут ваш путь к chromedriver!
chromedriver_path = 'C:/{YOUR PATH HERE}/chromedriver_win32/chromedriver.exe'

driver = webdriver.Chrome(executable_path=chromedriver_path) # Этой командой открывается окно Chrome
sleep(2)

ڪوڊ جي شروعات ۾ توهان ڏسي سگهو ٿا پيڪيج درآمد حڪم جيڪي اسان جي سڄي منصوبي ۾ استعمال ڪيا ويا آهن. سو، randint نئين سرچ آپريشن شروع ڪرڻ کان پهريان بي ترتيب واري سيڪنڊن لاءِ بوٽ کي ”سمڻ“ ٺاهڻ لاءِ استعمال ڪيو ويو. عام طور تي، هڪ به بوٽ ان کان سواء نٿو ڪري سگهي. جيڪڏهن توهان مٿي ڏنل ڪوڊ کي هلائيندا آهيو، هڪ ڪروم ونڊو کلي ويندي، جنهن کي بوٽ سائيٽن سان ڪم ڪرڻ لاءِ استعمال ڪندو.

اچو ته ٿورو تجربو ڪريون ۽ kayak.com ويب سائيٽ کي الڳ ونڊو ۾ کوليون. اسان اهو شهر چونڊينداسين جتان اسان پرواز ڪرڻ وارا آهيون، ۽ جنهن شهر ۾ اسان وڃڻ چاهيون ٿا، انهي سان گڏ پرواز جي تاريخون. جڏهن تاريخون چونڊيو، پڪ ڪريو ته +-3 ڏينهن جي حد استعمال ڪئي وئي آهي. مون ڪوڊ لکيو آهي انهي حساب ۾ رکندي ته سائيٽ اهڙين درخواستن جي جواب ۾ ڇا پيدا ڪري ٿي. جيڪڏهن، مثال طور، توهان کي صرف مخصوص تاريخن لاءِ ٽڪيٽون ڳولڻ جي ضرورت آهي، پوءِ اتي هڪ وڏو امڪان آهي ته توهان کي بوٽ ڪوڊ تبديل ڪرڻو پوندو. جڏهن آئون ڪوڊ بابت ڳالهائيندو آهيان، آئون مناسب وضاحت ڏيان ٿو، پر جيڪڏهن توهان مونجهارو محسوس ڪيو، مون کي خبر ڏيو.

ھاڻي سرچ بٽڻ تي ڪلڪ ڪريو ۽ ايڊريس بار ۾ لنڪ ڏسو. اهو انهي لنڪ سان ملندڙ هجڻ گهرجي جيڪو آئون هيٺ ڏنل مثال ۾ استعمال ڪريان ٿو جتي متغير جو اعلان ڪيو ويو آهي kayak، جيڪو URL کي ذخيرو ڪري ٿو، ۽ طريقو استعمال ڪيو ويندو آهي get ويب ڊرائيور. ڳولا واري بٽڻ تي ڪلڪ ڪرڻ کان پوء، نتيجن کي صفحي تي ظاهر ٿيڻ گهرجي.

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا
جڏهن مون حڪم استعمال ڪيو get ڪجھ منٽن اندر ٻه يا ٽي ڀيرا وڌيڪ، مون کي چيو ويو ته ري ڪيپچا استعمال ڪندي تصديق مڪمل ڪريو. توهان هن چيڪ کي دستي طور تي پاس ڪري سگهو ٿا ۽ تجربو جاري رکو جيستائين سسٽم نئين چيڪ کي هلائڻ جو فيصلو ڪري. جڏهن مون اسڪرپٽ کي آزمايو، اهو محسوس ٿيو ته پهريون سرچ سيشن هميشه آساني سان هليو ويو، تنهنڪري جيڪڏهن توهان ڪوڊ سان تجربو ڪرڻ چاهيو ٿا، توهان کي صرف وقتي طور تي دستي طور تي چيڪ ڪرڻو پوندو ۽ ڪوڊ کي هلائڻ ڏيو، ڳولا جي سيشن جي وچ ۾ ڊگهو وقفو استعمال ڪندي. ۽، جيڪڏهن توهان ان جي باري ۾ سوچيو، هڪ شخص کي ٽڪيٽ جي قيمتن جي باري ۾ معلومات جي ضرورت ناهي، جيڪا 10 منٽن جي وقفي تي ڳولا جي عملن جي وچ ۾ ملي ٿي.

XPath استعمال ڪندي صفحي سان ڪم ڪرڻ

تنهن ڪري، اسان هڪ ونڊو کوليو ۽ سائيٽ کي لوڊ ڪيو. قيمت ۽ ٻي معلومات حاصل ڪرڻ لاءِ، اسان کي استعمال ڪرڻ جي ضرورت آهي XPath ٽيڪنالاجي يا CSS چونڊيندڙ. مون فيصلو ڪيو ته XPath سان لٺ ۽ CSS چونڊيندڙن کي استعمال ڪرڻ جي ضرورت محسوس نه ڪئي، پر ان طريقي سان ڪم ڪرڻ بلڪل ممڪن آهي. XPath استعمال ڪندي ھڪڙي صفحي جي چوڌاري نيويگيٽ ڪرڻ مشڪل ٿي سگھي ٿو، ۽ جيتوڻيڪ توھان استعمال ڪريو ٽيڪنڪ جيڪي مون بيان ڪيا آھن هي آرٽيڪل، جنهن ۾ صفحي جي ڪوڊ مان لاڳاپيل سڃاڻپ ڪندڙ کي نقل ڪرڻ شامل آهي، مون محسوس ڪيو ته اهو آهي، حقيقت ۾، ضروري عناصر تائين رسائي جو بهترين طريقو ناهي. رستي ۾، ۾ هي ڪتاب XPath ۽ CSS چونڊيندڙن کي استعمال ڪندي صفحن سان ڪم ڪرڻ جي بنيادي ڳالهين جو هڪ بهترين تفصيل فراهم ڪري ٿو. اھو اھو آھي جيڪو لاڳاپيل ويب ڊرائيور جو طريقو ڏسڻ ۾ اچي ٿو.

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا
سو، اچو ته بوٽ تي ڪم جاري رکون. اچو ته پروگرام جي صلاحيتن کي استعمال ڪريون سستا ٽڪيٽون چونڊڻ لاءِ. هيٺ ڏنل تصوير ۾، XPath چونڊيندڙ ڪوڊ ڳاڙهي ۾ نمايان ٿيل آهي. ڪوڊ ڏسڻ لاءِ، توھان کي صفحي جي عنصر تي ساڄي ڪلڪ ڪرڻ جي ضرورت آھي جنھن ۾ توھان دلچسپي رکو ٿا ۽ ظاھر ٿيندڙ مينيو مان Inspect ڪمانڊ چونڊيو. هي حڪم مختلف صفحي جي عناصر لاء سڏي سگهجي ٿو، جنهن جو ڪوڊ ڏيکاريو ويندو ۽ نمايان ڪيو ويندو ڪوڊ ڏسندڙ ۾.

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا
صفحي جو ڪوڊ ڏسو

ڪوڊ مان چونڊيندڙن کي نقل ڪرڻ جي نقصانن بابت منهنجي دليل جي تصديق ڳولڻ لاءِ، هيٺين خاصيتن تي ڌيان ڏيو.

هي اهو آهي جيڪو توهان حاصل ڪيو جڏهن توهان ڪوڊ ڪاپي ڪريو ٿا:

//*[@id="wtKI-price_aTab"]/div[1]/div/div/div[1]/div/span/span

اهڙي شيءِ کي نقل ڪرڻ لاءِ، توهان کي ڪوڊ جي سيڪشن تي صحيح ڪلڪ ڪرڻ جي ضرورت آهي جنهن ۾ توهان دلچسپي رکو ٿا ۽ چونڊيو ڪاپي > ڪاپي XPath ڪمانڊ مينيو مان جيڪو ظاهر ٿئي ٿو.

ھتي اھو آھي جيڪو مان استعمال ڪيو ويو آھي بيان ڪرڻ لاءِ سستا بٽڻ:

cheap_results = ‘//a[@data-code = "price"]’

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا
ڪاپي ڪمانڊ> ڪاپي XPath

اهو بلڪل واضح آهي ته ٻيو اختيار تمام سادو ڏسڻ ۾ اچي ٿو. جڏهن استعمال ڪيو وڃي، اهو هڪ عنصر جي ڳولا ڪري ٿو جيڪو خاصيت آهي data-codeجي برابر price. جڏهن پهريون اختيار استعمال ڪندي، عنصر ڳولهيو ويندو آهي id جيڪو برابر آهي wtKI-price_aTab، ۽ عنصر ڏانهن XPath رستو نظر اچي ٿو /div[1]/div/div/div[1]/div/span/span. هڪ XPath سوال هن طرح هڪ صفحي ڏانهن چال ڪندو، پر صرف هڪ ڀيرو. مان هينئر ئي چئي سگهان ٿو id صفحي جي لوڊ ٿيڻ تي ايندڙ وقت تبديل ٿي ويندي. ڪردار جي ترتيب wtKI هر دفعي صفحي جي لوڊ ٿيڻ تي متحرڪ طور تي تبديليون اينديون آهن، تنهنڪري اهو ڪوڊ جيڪو استعمال ڪري ٿو اهو ايندڙ صفحي جي ٻيهر لوڊ ٿيڻ کان پوء بيڪار ٿيندو. تنهن ڪري XPath کي سمجهڻ لاءِ ڪجهه وقت وٺو. هي علم توهان جي سٺي خدمت ڪندو.

بهرحال، اهو ياد رکڻ گهرجي ته نقل ڪرڻ XPath چونڊيندڙن کي ڪارائتو ٿي سگهي ٿو جڏهن بلڪل سادي سائيٽن سان ڪم ڪري، ۽ جيڪڏهن توهان هن سان آرام سان آهيو، ان سان ڪو به غلط ناهي.

هاڻي اچو ته سوچيو ته ڇا ڪجي جيڪڏهن توهان کي گهربل ڳولا جا نتيجا ڪيترن ئي لائينن ۾ حاصل ڪرڻ گهرجن، هڪ فهرست جي اندر. تمام سادو. هر نتيجو هڪ اعتراض جي اندر هڪ طبقي سان آهي resultWrapper. سڀني نتيجن کي لوڊ ڪندي هڪ لوپ ۾ ڪري سگهجي ٿو جيئن هيٺ ڏيکاريل آهي.

اهو ياد رکڻ گهرجي ته جيڪڏهن توهان مٿين کي سمجھندا آهيو، ته پوء توهان کي آساني سان سمجھڻ گهرجي تمام گهڻو ڪوڊ جيڪو اسان تجزيو ڪنداسين. جيئن ته هي ڪوڊ هلندو آهي، اسان رسائي حاصل ڪندا آهيون جيڪا اسان کي گهربل هجي (حقيقت ۾، عنصر جنهن ۾ نتيجو لپي ويو آهي) ڪنهن قسم جي رستي جي وضاحت واري ميڪانيزم (XPath) استعمال ڪندي. اهو ڪيو ويو آهي عنصر جو متن حاصل ڪرڻ ۽ ان کي هڪ اعتراض ۾ رکڻ لاءِ جنهن مان ڊيٽا پڙهي سگهجي (پهريون استعمال ٿيل flight_containers، پوء - flights_list).

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا
پهرين ٽي لائينون ڏيکاريل آهن ۽ اسان واضح طور تي هر شي کي ڏسي سگهون ٿا جيڪو اسان کي گهربل آهي. بهرحال، اسان وٽ معلومات حاصل ڪرڻ جا وڌيڪ دلچسپ طريقا آهن. اسان کي هر عنصر کان الڳ الڳ ڊيٽا وٺڻ جي ضرورت آهي.

ڪم تي وڃ!

هڪ فنڪشن لکڻ جو آسان طريقو اضافي نتيجا لوڊ ڪرڻ آهي، تنهنڪري اهو آهي جتي اسان شروع ڪنداسين. مان ان پروازن جو تعداد وڌائڻ چاهيان ٿو جن جي باري ۾ پروگرام معلومات حاصل ڪري ٿو، خدمت ۾ شڪ پيدا ڪرڻ کان سواءِ جيڪو انسپيڪشن ڏانهن وٺي وڃي ٿو، تنهن ڪري آئون ڪلڪ ڪريان ٿو وڌيڪ نتيجا لوڊ ڪريو بٽڻ تي هڪ ڀيرو جڏهن صفحو ظاهر ٿئي ٿو. هن ڪوڊ ۾، توهان کي بلاڪ تي ڌيان ڏيڻ گهرجي try، جنهن کي مون شامل ڪيو ڇاڪاڻ ته ڪڏهن ڪڏهن بٽڻ صحيح طرح سان لوڊ نٿو ٿئي. جيڪڏهن توهان پڻ هن کي منهن ڏيو ٿا، فنڪشن ڪوڊ ۾ هن فنڪشن کي ڪالون تبصرو ڪريو start_kayak، جنهن کي اسين هيٺ ڏسنداسين.

# Загрузка большего количества результатов для того, чтобы максимизировать объём собираемых данных
def load_more():
    try:
        more_results = '//a[@class = "moreButton"]'
        driver.find_element_by_xpath(more_results).click()
        # Вывод этих заметок в ходе работы программы помогает мне быстро выяснить то, чем она занята
        print('sleeping.....')
        sleep(randint(45,60))
    except:
        pass

ھاڻي، ھن فنڪشن جي ھڪڙي ڊگھي تجزيي کان پوء (ڪڏھن ڪڏھن مان کڻي وڃان ٿو)، اسان ھڪڙي فنڪشن جو اعلان ڪرڻ لاء تيار آھيون جيڪو صفحي کي ڇڪيندو.

مون اڳ ۾ ئي گڏ ڪيو آهي گهڻو ڪجهه جيڪو هيٺين فنڪشن ۾ گهربل آهي سڏيو ويندو آهي page_scrape. ڪڏهن ڪڏهن واپسي واري رستي واري ڊيٽا کي گڏ ڪيو ويندو آهي، تنهنڪري آئون ان کي الڳ ڪرڻ لاء هڪ سادي طريقو استعمال ڪريان ٿو. مثال طور، جڏهن آئون پهريون ڀيرو متغير استعمال ڪريان ٿو section_a_list и section_b_list. اسان جو فنڪشن هڪ ڊيٽا فريم ڏي ٿو flights_df، هي اسان کي اجازت ڏئي ٿو مختلف ڊيٽا جي ترتيب جي طريقن مان حاصل ڪيل نتيجن کي الڳ ڪري ۽ بعد ۾ انهن کي گڏ ڪري.

def page_scrape():
    """This function takes care of the scraping part"""
    
    xp_sections = '//*[@class="section duration"]'
    sections = driver.find_elements_by_xpath(xp_sections)
    sections_list = [value.text for value in sections]
    section_a_list = sections_list[::2] # так мы разделяем информацию о двух полётах
    section_b_list = sections_list[1::2]
    
    # Если вы наткнулись на reCaptcha, вам может понадобиться что-то предпринять.
    # О том, что что-то пошло не так, вы узнаете исходя из того, что вышеприведённые списки пусты
    # это выражение if позволяет завершить работу программы или сделать ещё что-нибудь
    # тут можно приостановить работу, что позволит вам пройти проверку и продолжить скрапинг
    # я использую тут SystemExit так как хочу протестировать всё с самого начала
    if section_a_list == []:
        raise SystemExit
    
    # Я буду использовать букву A для уходящих рейсов и B для прибывающих
    a_duration = []
    a_section_names = []
    for n in section_a_list:
        # Получаем время
        a_section_names.append(''.join(n.split()[2:5]))
        a_duration.append(''.join(n.split()[0:2]))
    b_duration = []
    b_section_names = []
    for n in section_b_list:
        # Получаем время
        b_section_names.append(''.join(n.split()[2:5]))
        b_duration.append(''.join(n.split()[0:2]))

    xp_dates = '//div[@class="section date"]'
    dates = driver.find_elements_by_xpath(xp_dates)
    dates_list = [value.text for value in dates]
    a_date_list = dates_list[::2]
    b_date_list = dates_list[1::2]
    # Получаем день недели
    a_day = [value.split()[0] for value in a_date_list]
    a_weekday = [value.split()[1] for value in a_date_list]
    b_day = [value.split()[0] for value in b_date_list]
    b_weekday = [value.split()[1] for value in b_date_list]
    
    # Получаем цены
    xp_prices = '//a[@class="booking-link"]/span[@class="price option-text"]'
    prices = driver.find_elements_by_xpath(xp_prices)
    prices_list = [price.text.replace('$','') for price in prices if price.text != '']
    prices_list = list(map(int, prices_list))

    # stops - это большой список, в котором первый фрагмент пути находится по чётному индексу, а второй - по нечётному
    xp_stops = '//div[@class="section stops"]/div[1]'
    stops = driver.find_elements_by_xpath(xp_stops)
    stops_list = [stop.text[0].replace('n','0') for stop in stops]
    a_stop_list = stops_list[::2]
    b_stop_list = stops_list[1::2]

    xp_stops_cities = '//div[@class="section stops"]/div[2]'
    stops_cities = driver.find_elements_by_xpath(xp_stops_cities)
    stops_cities_list = [stop.text for stop in stops_cities]
    a_stop_name_list = stops_cities_list[::2]
    b_stop_name_list = stops_cities_list[1::2]
    
    # сведения о компании-перевозчике, время отправления и прибытия для обоих рейсов
    xp_schedule = '//div[@class="section times"]'
    schedules = driver.find_elements_by_xpath(xp_schedule)
    hours_list = []
    carrier_list = []
    for schedule in schedules:
        hours_list.append(schedule.text.split('n')[0])
        carrier_list.append(schedule.text.split('n')[1])
    # разделяем сведения о времени и о перевозчиках между рейсами a и b
    a_hours = hours_list[::2]
    a_carrier = carrier_list[1::2]
    b_hours = hours_list[::2]
    b_carrier = carrier_list[1::2]

    
    cols = (['Out Day', 'Out Time', 'Out Weekday', 'Out Airline', 'Out Cities', 'Out Duration', 'Out Stops', 'Out Stop Cities',
            'Return Day', 'Return Time', 'Return Weekday', 'Return Airline', 'Return Cities', 'Return Duration', 'Return Stops', 'Return Stop Cities',
            'Price'])

    flights_df = pd.DataFrame({'Out Day': a_day,
                               'Out Weekday': a_weekday,
                               'Out Duration': a_duration,
                               'Out Cities': a_section_names,
                               'Return Day': b_day,
                               'Return Weekday': b_weekday,
                               'Return Duration': b_duration,
                               'Return Cities': b_section_names,
                               'Out Stops': a_stop_list,
                               'Out Stop Cities': a_stop_name_list,
                               'Return Stops': b_stop_list,
                               'Return Stop Cities': b_stop_name_list,
                               'Out Time': a_hours,
                               'Out Airline': a_carrier,
                               'Return Time': b_hours,
                               'Return Airline': b_carrier,                           
                               'Price': prices_list})[cols]
    
    flights_df['timestamp'] = strftime("%Y%m%d-%H%M") # время сбора данных
    return flights_df

مون ڪوشش ڪئي ته متغيرن کي نالو ڏيو ته جيئن ڪوڊ سمجھ ۾ اچي. ياد رکو ته متغيرن سان شروع ٿي a رستي جي پهرين مرحلي سان تعلق رکي ٿو، ۽ b - ٻئي ڏانهن. اچو ته ايندڙ فنڪشن ڏانهن وڃو.

سپورٽ ميڪانيزم

اسان وٽ ھاڻي ھڪڙو فنڪشن آھي جيڪو اسان کي اضافي ڳولا جا نتيجا لوڊ ڪرڻ جي اجازت ڏئي ٿو ۽ انھن نتيجن کي پروسيس ڪرڻ لاء ھڪڙو فنڪشن. اهو آرٽيڪل هتي ختم ٿي سگهي ٿو، ڇاڪاڻ ته اهي ٻه فنڪشن مهيا ڪن ٿا جيڪي توهان کي صفحا اسڪري ڪرڻ جي ضرورت آهي جيڪي توهان پنهنجو پاڻ کي کوليو ٿا. پر اسان اڃا تائين مٿي ذڪر ڪيل ڪجهه معاون ميکانيزم تي غور نه ڪيو آهي. مثال طور، هي اي ميل موڪلڻ جو ڪوڊ آهي ۽ ڪجهه ٻيون شيون. اهو سڀ ڪجهه فنڪشن ۾ ملي سگهي ٿو start_kayak، جنهن تي اسان هاڻي غور ڪنداسين.

هن فنڪشن کي ڪم ڪرڻ لاء، توهان کي شهرن ۽ تاريخن بابت معلومات جي ضرورت آهي. هن معلومات کي استعمال ڪندي، اهو هڪ متغير ۾ لنڪ ٺاهي ٿو kayak, جيڪو توھان کي ھڪڙي صفحي ڏانھن وٺي وڃڻ لاءِ استعمال ڪيو ويندو آھي جنھن ۾ ڳولھا جا نتيجا شامل ھوندا آھن انھن جي سوال جي بھترين ميچ جي ترتيب سان. پهرين اسڪراپنگ سيشن کان پوء، اسان قيمت سان ڪم ڪنداسين ٽيبل جي مٿين صفحي تي. يعني، اسان کي گهٽ ۾ گهٽ ٽڪيٽ جي قيمت ۽ سراسري قيمت ملندي. هي سڀ، سائيٽ پاران جاري ڪيل اڳڪٿي سان گڏ، اي ميل ذريعي موڪليو ويندو. صفحي تي، لاڳاپيل ٽيبل مٿي کاٻي ڪنڊ ۾ هجڻ گهرجي. ھن جدول سان ڪم ڪرڻ، رستي ۾، ھڪڙي غلطي ٿي سگھي ٿي جڏھن ڳولھيو صحيح تاريخون استعمال ڪندي، ڇاڪاڻ⁠تہ ھن حالت ۾ ٽيبل صفحي تي ڏيکاريل نه آھي.

def start_kayak(city_from, city_to, date_start, date_end):
    """City codes - it's the IATA codes!
    Date format -  YYYY-MM-DD"""
    
    kayak = ('https://www.kayak.com/flights/' + city_from + '-' + city_to +
             '/' + date_start + '-flexible/' + date_end + '-flexible?sort=bestflight_a')
    driver.get(kayak)
    sleep(randint(8,10))
    
    # иногда появляется всплывающее окно, для проверки на это и его закрытия можно воспользоваться блоком try
    try:
        xp_popup_close = '//button[contains(@id,"dialog-close") and contains(@class,"Button-No-Standard-Style close ")]'
        driver.find_elements_by_xpath(xp_popup_close)[5].click()
    except Exception as e:
        pass
    sleep(randint(60,95))
    print('loading more.....')
    
#     load_more()
    
    print('starting first scrape.....')
    df_flights_best = page_scrape()
    df_flights_best['sort'] = 'best'
    sleep(randint(60,80))
    
    # Возьмём самую низкую цену из таблицы, расположенной в верхней части страницы
    matrix = driver.find_elements_by_xpath('//*[contains(@id,"FlexMatrixCell")]')
    matrix_prices = [price.text.replace('$','') for price in matrix]
    matrix_prices = list(map(int, matrix_prices))
    matrix_min = min(matrix_prices)
    matrix_avg = sum(matrix_prices)/len(matrix_prices)
    
    print('switching to cheapest results.....')
    cheap_results = '//a[@data-code = "price"]'
    driver.find_element_by_xpath(cheap_results).click()
    sleep(randint(60,90))
    print('loading more.....')
    
#     load_more()
    
    print('starting second scrape.....')
    df_flights_cheap = page_scrape()
    df_flights_cheap['sort'] = 'cheap'
    sleep(randint(60,80))
    
    print('switching to quickest results.....')
    quick_results = '//a[@data-code = "duration"]'
    driver.find_element_by_xpath(quick_results).click()  
    sleep(randint(60,90))
    print('loading more.....')
    
#     load_more()
    
    print('starting third scrape.....')
    df_flights_fast = page_scrape()
    df_flights_fast['sort'] = 'fast'
    sleep(randint(60,80))
    
    # Сохранение нового фрейма в Excel-файл, имя которого отражает города и даты
    final_df = df_flights_cheap.append(df_flights_best).append(df_flights_fast)
    final_df.to_excel('search_backups//{}_flights_{}-{}_from_{}_to_{}.xlsx'.format(strftime("%Y%m%d-%H%M"),
                                                                                   city_from, city_to, 
                                                                                   date_start, date_end), index=False)
    print('saved df.....')
    
    # Можно следить за тем, как прогноз, выдаваемый сайтом, соотносится с реальностью
    xp_loading = '//div[contains(@id,"advice")]'
    loading = driver.find_element_by_xpath(xp_loading).text
    xp_prediction = '//span[@class="info-text"]'
    prediction = driver.find_element_by_xpath(xp_prediction).text
    print(loading+'n'+prediction)
    
    # иногда в переменной loading оказывается эта строка, которая, позже, вызывает проблемы с отправкой письма
    # если это прозошло - меняем её на "Not Sure"
    weird = '¯_(ツ)_/¯'
    if loading == weird:
        loading = 'Not sure'
    
    username = '[email protected]'
    password = 'YOUR PASSWORD'

    server = smtplib.SMTP('smtp.outlook.com', 587)
    server.ehlo()
    server.starttls()
    server.login(username, password)
    msg = ('Subject: Flight Scrapernn
Cheapest Flight: {}nAverage Price: {}nnRecommendation: {}nnEnd of message'.format(matrix_min, matrix_avg, (loading+'n'+prediction)))
    message = MIMEMultipart()
    message['From'] = '[email protected]'
    message['to'] = '[email protected]'
    server.sendmail('[email protected]', '[email protected]', msg)
    print('sent email.....')

مون هن اسڪرپٽ کي Outlook اڪائونٽ (hotmail.com) استعمال ڪندي آزمايو. جي ميل اڪائونٽ سان صحيح ڪم ڪرڻ لاءِ مون ان کي آزمايو ناهي، هي اي ميل سسٽم ڪافي مشهور آهي، پر ان ۾ ڪيترائي ممڪن آپشن آهن. جيڪڏهن توهان Hotmail اڪائونٽ استعمال ڪريو ٿا، ته پوءِ هر شي ڪم ڪرڻ لاءِ، توهان کي صرف پنهنجي ڊيٽا کي ڪوڊ ۾ داخل ڪرڻ جي ضرورت آهي.

جيڪڏھن توھان سمجھڻ چاھيو ٿا ته اصل ۾ ھن فنڪشن لاءِ ڪوڊ جي مخصوص حصن ۾ ڇا ٿي رھيو آھي، توھان انھن کي نقل ڪري سگھوٿا ۽ انھن سان تجربو ڪري سگھو ٿا. ڪوڊ سان تجربو صرف ان کي سمجهڻ جو واحد طريقو آهي.

تيار سسٽم

هاڻي ته اسان سڀ ڪجهه ڪيو آهي جنهن بابت اسان ڳالهايو آهي، اسان هڪ سادي لوپ ٺاهي سگهون ٿا جيڪو اسان جي افعال کي سڏي ٿو. اسڪرپٽ صارف کان شهرن ۽ تاريخن بابت ڊيٽا جي درخواست ڪري ٿي. جڏهن اسڪرپٽ جي مسلسل ٻيهر شروع ڪرڻ سان جانچ ڪري رهيا آهيو، توهان ممڪن ناهي ته هر دفعي هن ڊيٽا کي دستي طور تي داخل ڪرڻ چاهيندا، تنهنڪري لاڳاپيل لائينون، جاچ جي وقت لاء، انهن کي هيٺ ڏنل انهن کي غير تبصري ڪندي تبصرو ڪري سگهجي ٿو، جنهن ۾ ڊيٽا جي ضرورت آهي. اسڪرپٽ هارڊ ڪوڊ ٿيل آهي.

city_from = input('From which city? ')
city_to = input('Where to? ')
date_start = input('Search around which departure date? Please use YYYY-MM-DD format only ')
date_end = input('Return when? Please use YYYY-MM-DD format only ')

# city_from = 'LIS'
# city_to = 'SIN'
# date_start = '2019-08-21'
# date_end = '2019-09-07'

for n in range(0,5):
    start_kayak(city_from, city_to, date_start, date_end)
    print('iteration {} was complete @ {}'.format(n, strftime("%Y%m%d-%H%M")))
    
    # Ждём 4 часа
    sleep(60*60*4)
    print('sleep finished.....')

هي اهو آهي جيڪو اسڪرپٽ جو ٽيسٽ رن وانگر ڏسڻ ۾ اچي ٿو.
پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا
اسڪرپٽ جي ٽيسٽ رن

نتيجو

جيڪڏهن توهان ان کي پري ڪيو آهي، مبارڪون هجن! توهان وٽ هاڻي هڪ ڪم ڪندڙ ويب اسڪراپر آهي، جيتوڻيڪ آئون اڳ ۾ ئي ان کي بهتر ڪرڻ جا ڪيترائي طريقا ڏسي سگهان ٿو. مثال طور، اهو Twilio سان ضم ٿي سگهي ٿو انهي ڪري ته اهو اي ميلن جي بدران ٽيڪسٽ پيغام موڪلي ٿو. توهان استعمال ڪري سگهو ٿا هڪ VPN يا ٻيو ڪجهه هڪ ئي وقت ڪيترن ئي سرورن مان نتيجا حاصل ڪرڻ لاءِ. سائيٽ استعمال ڪندڙ کي چيڪ ڪرڻ ۾ وقتي طور تي هڪ مسئلو پڻ پيدا ٿئي ٿو ته هو هڪ شخص آهي، پر اهو مسئلو پڻ حل ڪري سگهجي ٿو. ڪنهن به صورت ۾، هاڻي توهان وٽ هڪ بنياد آهي ته توهان وڌائي سگهو ٿا جيڪڏهن توهان چاهيو. مثال طور، پڪ ڪريو ته هڪ ايڪسل فائل موڪليو ويو آهي صارف کي اي ميل سان منسلڪ جي طور تي.

پٿون - هڪ اسسٽنٽ ڳولڻ ۾ سستا هوائي ٽڪيٽون انهن لاءِ جيڪي سفر ڪرڻ پسند ڪن ٿا

صرف رجسٽرڊ استعمال ڪندڙ سروي ۾ حصو وٺي سگهن ٿا. سائن ان ڪريو، توهان جي مهرباني.

ڇا توهان ويب اسڪراپنگ ٽيڪنالاجي استعمال ڪندا آهيو؟

  • ته

  • نه

8 صارفين ووٽ ڏنو. 1 استعمال ڪندڙ روڪيو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو