پایتون - د هغو کسانو لپاره د ارزانه هوایی ټیکټونو موندلو کې معاون چې سفر کول خوښوي

د مقالې لیکوال ، هغه ژباړه چې موږ یې نن خپروو ، وايي چې د دې هدف د سیلینیم په کارولو سره په پایتون کې د ویب سکریپر پراختیا په اړه خبرې کول دي ، کوم چې د هوایی ډګر ټیکټ نرخونه لټوي. کله چې د ټکټونو لټون کول، انعطاف وړ نیټې کارول کیږي (د ټاکل شوي نیټې په پرتله + - 3 ورځې). سکریپر د لټون پایلې په ایکسل فایل کې خوندي کوي او هغه کس ته لیږي چې لټون یې پرمخ وړی د هغه څه لنډیز سره بریښنالیک لیږي چې دوی یې موندلي. د دې پروژې هدف د مسافرینو سره د غوره معاملو موندلو کې مرسته کول دي.

پایتون - د هغو کسانو لپاره د ارزانه هوایی ټیکټونو موندلو کې معاون چې سفر کول خوښوي

که، د موادو د پوهیدو په وخت کې، تاسو د ورکیدو احساس کوئ، یو نظر وګورئ دا مقاله

موږ د څه په لټه کې یو؟

تاسو وړیا یاست چې دلته بیان شوي سیسټم وکاروئ لکه څنګه چې تاسو غواړئ. د مثال په توګه، ما دا زما د ښار ښار ته د اونۍ پای سفرونو او ټیکټونو لټون کولو لپاره کارولی. که تاسو د ګټور ټکټونو موندلو په اړه جدي یاست ، تاسو کولی شئ سکریپټ په سرور کې پرمخ وړئ (ساده سرور، په میاشت کې د 130 روبلو لپاره ، د دې لپاره خورا مناسب دی) او ډاډ ترلاسه کړئ چې دا په ورځ کې یو یا دوه ځله تیریږي. د لټون پایلې به تاسو ته د بریښنالیک له لارې واستول شي. سربیره پردې ، زه د هرڅه تنظیم کولو وړاندیز کوم ترڅو سکریپټ د ډراپ باکس فولډر کې د لټون پایلو سره د Excel فایل خوندي کړي ، کوم چې تاسو ته اجازه درکوي دا ډول فایلونه له هر ځای او هر وخت څخه وګورئ.

پایتون - د هغو کسانو لپاره د ارزانه هوایی ټیکټونو موندلو کې معاون چې سفر کول خوښوي
ما تر اوسه د غلطیو سره تعرفې نه دي موندلي، مګر زه فکر کوم چې دا ممکنه ده

کله چې لټون کول، لکه څنګه چې مخکې یادونه وشوه، "انعطاف وړ نیټه" کارول کیږي؛ سکریپټ وړاندیزونه موندلي چې د ورکړل شوي نیټې څخه په دریو ورځو کې وي. که څه هم کله چې سکریپټ چلوي، دا یوازې په یو لوري کې د وړاندیزونو لټون کوي، د دې تعدیل کول اسانه دي ترڅو دا د ډیری الوتنې لارښوونو کې ډاټا راټول کړي. د دې په مرسته، تاسو حتی د غلط تعرفو په لټه کې شئ؛ دا ډول موندنې خورا په زړه پورې کیدی شي.

تاسو ولې بل ویب سکریپر ته اړتیا لرئ؟

کله چې ما لومړی د ویب سکریپینګ پیل کړ، زه په صادقانه توګه په ځانګړې توګه په دې کې دلچسپي نه لرم. ما غوښتل د وړاندوینې ماډلینګ ، مالي تحلیل ، او احتمالا د متنونو احساساتي رنګ تحلیل کولو په برخه کې نورې پروژې ترسره کړم. مګر دا معلومه شوه چې دا خورا په زړه پورې وه چې معلومه کړي چې څنګه یو پروګرام رامینځته کړي چې د ویب پاڼو څخه ډاټا راټولوي. لکه څنګه چې ما دې موضوع ته اشاره وکړه، ما پوهیده چې ویب سکریپینګ د انټرنیټ "انجن" دی.

تاسو شاید فکر وکړئ چې دا خورا زړور بیان دی. مګر په پام کې ونیسئ چې ګوګل د ویب سکریپر سره پیل کړی چې لیري پاڼه د جاوا او پایتون په کارولو سره رامینځته کړی. ګوګل روبوټونه د انټرنیټ سپړنه کوي، هڅه کوي خپلو کاروونکو ته د دوی پوښتنو ته غوره ځوابونه چمتو کړي. د ویب سکریپینګ نه ختمیدونکي کارونې لري، او حتی که تاسو د ډیټا ساینس کې بل څه سره علاقه لرئ، تاسو به د سکریپینګ ځینې مهارتونو ته اړتیا ولرئ ترڅو هغه معلومات ترلاسه کړئ چې تاسو یې تحلیل کولو ته اړتیا لرئ.

ما دلته ځینې تخنیکونه په زړه پورې موندلي کتاب د ویب سکریپینګ په اړه، کوم چې ما پدې وروستیو کې ترلاسه کړی. دا د هغه څه د عملي پلي کولو لپاره ډیری ساده مثالونه او نظرونه لري چې تاسو زده کړل. سربیره پردې ، د reCaptcha چکونو څخه د تیریدو په اړه خورا په زړه پوري فصل شتون لري. دا زما لپاره د خبر په توګه راغلی، ځکه چې زه حتی نه پوهیږم چې د داسې ستونزو د حل لپاره ځانګړي وسایل او حتی ټول خدمتونه شتون لري.

سفر کول خوښوی؟!

د دې برخې په سرلیک کې راپورته شوې ساده او بې ضرره پوښتنې ته ، تاسو ډیری وختونه د هغه چا د سفرونو څو کیسې سره یو مثبت ځواب اوریدلی شئ چې له چا څخه یې پوښتنه کړې وه. زموږ څخه ډیری به موافق وي چې سفر کول په نوي کلتوري چاپیریال کې د ځان ډوبولو او خپل افق پراخولو لپاره عالي لاره ده. په هرصورت، که تاسو له یو چا څخه وپوښتئ چې ایا دوی د هوایی ډګر ټکټونو لټون خوښوي، زه ډاډه یم چې ځواب به دومره مثبت نه وي. د حقیقت په توګه، پایتون دلته زموږ مرستې ته راځي.

لومړی کار چې موږ یې د هوایی ټکټونو په اړه د معلوماتو لټون کولو لپاره د سیسټم رامینځته کولو په لاره کې حل کولو ته اړتیا لرو یو مناسب پلیټ فارم غوره کول دي چې موږ به یې معلومات واخلو. د دې ستونزې حل کول زما لپاره اسانه نه و، مګر په پای کې ما د کییک خدمت غوره کړ. ما د Momondo، Skyscanner، Expedia، او یو څو نورو خدماتو هڅه وکړه، مګر په دې سرچینو کې د روبوټ محافظت میکانیزمونه د پام وړ و. له څو هڅو وروسته، چې په ترڅ کې مې د ترافیکي څراغونو، پیاده روونو او بایسکلونو سره معامله وکړه، هڅه مې وکړه چې سیسټمونو ته قانع کړم چې زه انسان یم، ما پریکړه وکړه چې کیک زما لپاره غوره دی، سره له دې چې حتی که ډیری پاڼې بار شوي وي. په لنډ وخت کې، او چکونه هم پیل کیږي. ما اداره وکړه چې بوټ د 4 څخه تر 6 ساعتونو وقفې کې سایټ ته غوښتنې واستوي ، او هرڅه سم کار کوي. د وخت په تیریدو سره ، ستونزې رامینځته کیږي کله چې د کایاک سره کار کوي ، مګر که دوی تاسو ته د چکونو سره مخ کول پیل کړي ، نو تاسو اړتیا لرئ یا په لاسي ډول ورسره معامله وکړئ او بیا بوټ لانچ کړئ ، یا یو څو ساعته انتظار وکړئ او چیکونه باید ودریږي. که اړتیا وي، تاسو کولی شئ په اسانۍ سره د بل پلیټ فارم لپاره کوډ تطبیق کړئ، او که تاسو داسې کوئ، تاسو کولی شئ په نظرونو کې راپور ورکړئ.

که تاسو یوازې د ویب سکریپینګ سره پیل کوئ او نه پوهیږئ چې ولې ځینې ویب پاڼې د دې سره مبارزه کوي، نو مخکې له دې چې تاسو پدې سیمه کې خپله لومړۍ پروژه پیل کړئ، خپل ځان ته یو احسان وکړئ او د "ویب سکریپینګ آداب" کلمو کې د ګوګل لټون وکړئ. . ستاسو تجربې ممکن ستاسو د فکر په پرتله ډیر ژر پای ته ورسیږي که تاسو په ناپوهۍ سره ویب سکریپینګ کوئ.

تر لاسه کول پیل شول

دلته یو عمومي کتنه ده چې زموږ په ویب سکریپر کوډ کې به څه پیښ شي:

  • اړین کتابتونونه وارد کړئ.
  • د ګوګل کروم ټب خلاصول.
  • یو فنکشن ته زنګ ووهئ چې بوټ پیل کوي ، دا ښارونه او نیټې تیریږي چې د ټکټونو په لټون کې به کارول کیږي.
  • دا فنکشن د لټون لومړنۍ پایلې اخلي، د غوره لخوا ترتیب شوي، او د نورو پایلو پورته کولو لپاره تڼۍ کلیک کوي.
  • بل فنکشن د ټولې پاڼې څخه ډاټا راټولوي او د معلوماتو چوکاټ بیرته راګرځوي.
  • دوه مخکیني مرحلې د ټکټ قیمت (ارزانه) او د الوتنې سرعت (چټک) لخوا د ترتیب کولو ډولونو په کارولو سره ترسره کیږي.
  • د سکریپټ کارونکي ته یو بریښنالیک لیږل کیږي چې د ټیکټ نرخونو لنډیز لري (ارزانه ټیکټونه او اوسط نرخ) ، او د معلوماتو چوکاټ د معلوماتو سره د پورته ذکر شوي دریو شاخصونو لخوا ترتیب شوی د Excel فایل په توګه خوندي شوی.
  • پورته ټولې کړنې د یوې ټاکلې مودې وروسته په یوه دوره کې ترسره کیږي.

دا باید په یاد ولرئ چې هره سیلینیم پروژه د ویب چلونکي سره پیل کیږي. زه کاروم کروم ډرایور، زه د ګوګل کروم سره کار کوم، مګر نور اختیارونه شتون لري. 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 په څو دقیقو کې له دوه یا دریو څخه ډیر ځله ، زما څخه وغوښتل شو چې د reCaptcha په کارولو سره تایید بشپړ کړم. تاسو کولی شئ دا چیک په لاسي ډول تیر کړئ او تجربې ته دوام ورکړئ تر هغه چې سیسټم د نوي چیک چلولو پریکړه وکړي. کله چې ما سکریپټ ازموینه وکړه ، داسې بریښي چې د لټون لومړۍ ناسته تل په اسانۍ سره روانه وه ، نو که تاسو غواړئ د کوډ سره تجربه وکړئ ، نو تاسو باید په دوره توګه په لاسي ډول چیک کړئ او اجازه ورکړئ کوډ چل کړئ ، د لټون غونډو ترمینځ اوږد وقفې په کارولو سره. او، که تاسو د دې په اړه فکر کوئ، امکان نلري چې یو څوک د ټیکټ نرخونو په اړه معلوماتو ته اړتیا ولري چې د لټون عملیاتو ترمنځ د 10 دقیقو وقفو کې ترلاسه شوي.

د XPath په کارولو سره د یوې پاڼې سره کار کول

نو، موږ یوه کړکۍ پرانستله او سایټ یې پورته کړ. د قیمت او نورو معلوماتو ترلاسه کولو لپاره، موږ اړتیا لرو د XPath ټیکنالوژۍ یا CSS انتخاب کونکي وکاروو. ما پریکړه وکړه چې د XPath سره ودریږم او د CSS انتخاب کونکو کارولو اړتیا یې احساس نه کړه، مګر د دې لارې کار کول خورا ممکن دي. د XPath په کارولو سره د یوې پاڼې شاوخوا ګرځیدل ستونزمن کیدی شي، او حتی که تاسو هغه تخنیکونه کاروئ چې ما تشریح کړی دا مقاله، چې د پاڼې کوډ څخه د اړونده پیژندونکو کاپي کول پکې شامل وو، ما پوهیده چې دا په حقیقت کې اړین عناصرو ته د لاسرسي غوره لاره نه ده. په لاره کې، په دا کتاب د XPath او CSS انتخاب کونکو په کارولو سره د پاڼو سره د کار کولو اساساتو خورا ښه توضیحات وړاندې کوي. دا هغه څه دي چې د اړوند ویب ډرایور میتود ورته ښکاري.

پایتون - د هغو کسانو لپاره د ارزانه هوایی ټیکټونو موندلو کې معاون چې سفر کول خوښوي
نو ، راځئ چې په بوټ کار کولو ته دوام ورکړو. راځئ چې د ارزانه ټکټونو غوره کولو لپاره د پروګرام وړتیاوو څخه کار واخلو. په لاندې عکس کې، د XPath انتخاب کوډ په سور کې روښانه شوی. د کوډ لیدلو لپاره، تاسو اړتیا لرئ د پاڼې عنصر باندې ښي کلیک وکړئ چې تاسو یې لیوالتیا لرئ او د هغه مینو څخه چې ښکاره کیږي د تفتیش کمانډ غوره کړئ. دا کمانډ د مختلف مخ عناصرو لپاره بلل کیدی شي، کوم چې کوډ به د کوډ لیدونکي کې ښکاره او روښانه شي.

پایتون - د هغو کسانو لپاره د ارزانه هوایی ټیکټونو موندلو کې معاون چې سفر کول خوښوي
د پاڼې کوډ وګورئ

د کوډ څخه د انتخاب کونکو کاپي کولو زیانونو په اړه زما د استدلال تصدیق موندلو لپاره ، لاندې ځانګړتیاو ته پاملرنه وکړئ.

دا هغه څه دي چې تاسو یې ترلاسه کوئ کله چې تاسو کوډ کاپي کړئ:

//*[@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) په کارولو سره ازموینه وکړه. ما دا د Gmail حساب سره سم کار کولو لپاره ازموینه نه ده کړې، دا بریښنالیک سیسټم خورا مشهور دی، مګر ډیری احتمالي اختیارونه شتون لري. که تاسو د هاټ میل حساب کاروئ ، نو د هرڅه کار کولو لپاره ، تاسو اړتیا لرئ خپل معلومات کوډ ته دننه کړئ.

که تاسو غواړئ پوه شئ چې واقعیا د دې فنکشن لپاره د کوډ په ځانګړو برخو کې څه ترسره کیږي ، تاسو کولی شئ دوی کاپي کړئ او تجربه یې کړئ. د کوډ سره تجربه کول د ریښتیا د پوهیدو یوازینۍ لار ده.

چمتو سیسټم

اوس چې موږ هر هغه څه ترسره کړل چې موږ یې په اړه خبرې کولې، موږ کولی شو یو ساده لوپ جوړ کړو چې زموږ دندو ته وایي. سکریپټ د کاروونکو څخه د ښارونو او نیټو په اړه د معلوماتو غوښتنه کوي. کله چې د سکریپټ په دوامداره توګه بیا پیل کولو سره ازموینه کول، تاسو احتمال نه لرئ چې دا ډاټا هر ځل په لاسي ډول داخل کړئ، نو د ازموینې وخت لپاره اړونده لینونه د دوی لاندې د کمنټ کولو سره تبصره کیدی شي، په کوم کې چې د معلوماتو لخوا اړین معلومات. سکریپټ هارډ کوډ شوی دی.

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

Add a comment