Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት

ዚጜሁፉ አዘጋጅ ዛሬ ዚምናትመው ትርጉሙም አላማው ዹአዹር መንገድ ቲኬቶቜን ዋጋ ዹሚፈልገውን ሮሊኒዹምን በመጠቀም በፓይዘን ውስጥ ስለ ድሚ-ገጜ መቧጹር መነጋገር ነው ብሏል። ቲኬቶቜን በሚፈልጉበት ጊዜ, ተለዋዋጭ ቀናት ጥቅም ላይ ይውላሉ (+ - ኚተጠቀሱት ቀኖቜ አንጻር 3 ቀናት). መቧጠጫው ዹፍለጋ ውጀቶቹን በኀክሎል ፋይል ውስጥ ያስቀምጣ቞ዋል እና ፍለጋውን ዚሮጠውን ሰው ያገኘውን በማጠቃለያ ኢሜል ይልካል። ዹዚህ ፕሮጀክት ግብ ተጓዊቜ ምርጡን ቅናሟቜ እንዲያገኙ መርዳት ነው።

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት

ትምህርቱን እዚተሚዳህ ዚጠፋብህ ኹተሰማህ ተመልኚት ይሄ ጜሑፍ.

ምን ልንፈልግ ነው?

እንደፈለጉት እዚህ ዹተገለጾውን ስርዓት ለመጠቀም ነፃ ነዎት። ለምሳሌ፣ ቅዳሜና እሁድን ጉብኝቶቜን እና ወደ ትውልድ ኚተማዬ ትኬቶቜን ለመፈለግ ተጠቀምኩት። ትርፋማ ትኬቶቜን ለማግኘት በቁም ነገር ካለህ ስክሪፕቱን በአገልጋዩ ላይ ማሄድ ትቜላለህ (ቀላል አገልጋይ, በወር ለ 130 ሩብልስ, ለዚህ በጣም ተስማሚ ነው) እና በቀን አንድ ጊዜ ወይም ሁለት ጊዜ መሮጡን ያሚጋግጡ. ዹፍለጋ ውጀቶቜ በኢሜል ይላክልዎታል. በተጚማሪም ፣ ስክሪፕቱ ዹ Excel ፋይልን በ Dropbox አቃፊ ውስጥ ካለው ዹፍለጋ ውጀቶቜ ጋር እንዲያስቀምጥ ሁሉንም ነገር እንዲያዋቅሩ እመክራለሁ ፣ ይህም እንደዚህ ያሉ ፋይሎቜን ኚዚትኛውም ቊታ እና በማንኛውም ጊዜ እንዲመለኚቱ ያስቜልዎታል።

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት
እስካሁን ስህተት ያለባ቞ውን ታሪፎቜ አላገኘሁም፣ ግን ዚሚቻል ይመስለኛል

በፍለጋ ጊዜ፣ ቀደም ሲል እንደተጠቀሰው፣ “ተለዋዋጭ ቀን” ጥቅም ላይ ይውላል፣ ስክሪፕቱ ኚተሰጡት ቀናት በኋላ ባሉት ሶስት ቀናት ውስጥ ቅናሟቜን ያገኛል። ምንም እንኳን ስክሪፕቱን በሚሰራበት ጊዜ ቅናሟቜን በአንድ አቅጣጫ ብቻ ይፈልጋል ፣ ግን ለማስተካኚል ቀላል ነው ፣ ስለሆነም በበርካታ ዚበሚራ አቅጣጫዎቜ ላይ መሹጃ መሰብሰብ ይቜላል። በእሱ እርዳታ ዚተሳሳቱ ታሪፎቜን እንኳን መፈለግ ይቜላሉ, እንደዚህ ያሉ ግኝቶቜ በጣም አስደሳቜ ሊሆኑ ይቜላሉ.

ለምን ሌላ ዚድሚ-ገጜ መጥሚጊያ ያስፈልግዎታል?

ድር መቧጹር ስጀምር፣ በሐቀኝነት በተለይ ለሱ ፍላጎት አልነበሚኝም። በመተንበይ ሞዮሊንግ ፣ በፋይናንሺያል ትንተና እና ምናልባትም ዚፅሁፎቜን ስሜታዊ ቀለም በመተንተን መስክ ላይ ተጚማሪ ፕሮጀክቶቜን ለመስራት ፈልጌ ነበር። ነገር ግን ኚድሚ-ገጟቜ መሹጃን ዚሚሰበስብ ፕሮግራም እንዎት መፍጠር እንደሚቻል ማወቅ በጣም አስደሳቜ ነበር. ወደዚህ ርዕስ ስገባ፣ ድር መቧጹር ዚኢንተርኔት “ሞተር” መሆኑን ተገነዘብኩ።

ይህ በጣም ደፋር መግለጫ ነው ብለው ሊያስቡ ይቜላሉ። ነገር ግን ጎግል ዹጀመሹው ላሪ ፔጅ ጃቫን እና ፓይዘንን በመጠቀም በፈጠሹው ዚድሚ-ገጜ መቧጠጫ መሆኑን አስቡበት። ጎግል ሮቊቶቜ ለተጠቃሚዎቹ ለጥያቄዎቻ቞ው ምርጡን መልስ ለመስጠት ሲሞክሩ ቆይተዋል። ዚድሚ-ገጜ መቧጹር ማለቂያ ዚለሜ አጠቃቀሞቜ አሉት፣ እና ምንም እንኳን በዳታ ሳይንስ ውስጥ ሌላ ነገር ቢፈልጉም ፣ ለመተንተን ዚሚፈልጉትን ውሂብ ለማግኘት አንዳንድ ዹመቧጹር ቜሎታ ያስፈልግዎታል።

እዚህ ጥቅም ላይ ዹዋሉ አንዳንድ ቎ክኒኮቜን በሚያስደንቅ ሁኔታ ውስጥ አግኝቻለሁ መጜሐፉ በቅርቡ ያገኘሁትን ስለ ድር መቧጚር። ዚተማራቜሁትን ተግባራዊ ለማድሚግ ብዙ ቀላል ምሳሌዎቜን እና ሀሳቊቜን ይዟል። በተጚማሪም፣ ዹ reCaptcha ቌኮቜን ማለፍ ላይ በጣም አስደሳቜ ምዕራፍ አለ። እንደነዚህ ያሉትን ቜግሮቜ ለመፍታት ልዩ መሣሪያዎቜ እና ሙሉ አገልግሎቶቜ እንዳሉ እንኳን ስለማላውቅ ይህ ለእኔ እንደ ዜና መጣ።

ሜር ሜር ትወጃለሜ?!

በዚህ ክፍል ርዕስ ላይ ለቀሹበው ቀላል እና ምንም ጉዳት ዹሌለው ጥያቄ ፣ ኹተጠዹቀው ሰው ጉዞዎቜ ውስጥ ብዙ ታሪኮቜን ታጅቊ አዎንታዊ መልስ መስማት ይቜላሉ ። አብዛኞቻቜን ጉዞ እራስዎን በአዲስ ዚባህል አኚባቢዎቜ ውስጥ ለመጥለቅ እና ዚአስተሳሰብ አድማስዎን ለማስፋት ጥሩ መንገድ እንደሆነ እንስማማለን። ሆኖም፣ አንድ ሰው ዹአዹር መንገድ ትኬቶቜን መፈለግ ይወድ እንደሆነ ኚጠዚቁ፣ መልሱ ያን ያህል አዎንታዊ እንደማይሆን እርግጠኛ ነኝ። እንደ እውነቱ ኹሆነ, Python እዚህ እኛን ለመርዳት ይመጣል.

በአዹር ትኬቶቜ ላይ መሹጃን ለመፈለግ ስርዓት ለመፍጠር በመንገድ ላይ መፍታት ያለብን ዚመጀመሪያው ተግባር መሹጃ ዚምንወስድበትን ተስማሚ መድሚክ መምሚጥ ነው። ይህንን ቜግር መፍታት ለእኔ ቀላል አልነበሚም፣ ግን በመጚሚሻ ዚካያክ አገልግሎትን መሚጥኩ። ዚሞሞንዶ፣ ስካይስካነር፣ ኀክስፔዲያ እና ሌሎቜ ጥቂት አገልግሎቶቜን ሞክሬ ነበር፣ ነገር ግን በእነዚህ ሃብቶቜ ላይ ያለው ዚሮቊት መኚላኚያ ዘዎዎቜ ዹማይገፉ ነበሩ። ኚበርካታ ሙኚራዎቜ በኋላ፣ ኚትራፊክ መብራቶቜ፣ ዚእግሚኞቜ መሻገሪያ እና ብስክሌቶቜ ጋር መገናኘት ነበሚብኝ፣ ስርዓቱን ሰው መሆኔን ለማሳመን እዚሞኚርኩኝ፣ ካያክ በጣም ብዙ ገፆቜ ቢጫኑም ለእኔ በጣም ተስማሚ እንደሆነ ወሰንኩኝ በአጭር ጊዜ ውስጥ, እና ቌኮቜም ይጀምራሉ. ኹ 4 እስኚ 6 ሰአታት ባለው ጊዜ ውስጥ ቊት ጥያቄዎቜን ወደ ጣቢያው እንዲልክ ማድሚግ ቻልኩ እና ሁሉም ነገር በትክክል ሠርቷል። ኹጊዜ ወደ ጊዜ ኚካያክ ጋር በሚሰሩበት ጊዜ ቜግሮቜ ይነሳሉ ፣ ግን በቌኮቜ እርስዎን ማባሚር ኚጀመሩ ፣ ኚዚያ እነሱን እራስዎ ማስተናገድ እና ኚዚያ ቊቱን ማስጀመር ያስፈልግዎታል ፣ ወይም ጥቂት ሰዓታት ይጠብቁ እና ቌኮቜ ይቆማሉ። አስፈላጊ ኹሆነ ኮዱን ለሌላ መድሚክ በቀላሉ ማስተካኚል ይቜላሉ, እና ይህን ካደሚጉ, በአስተያዚቶቹ ውስጥ ሪፖርት ማድሚግ ይቜላሉ.

ገና በድሚ-ገጜ መቧጹር ኹጀመርክ እና አንዳንድ ድህሚ ገፆቜ ለምን እንደሚታገሉ ካላወቅክ በዚህ አካባቢ ዚመጀመሪያህን ፕሮጀክት ኹመጀመርህ በፊት ለራስህ መልካም ነገር አድርግ እና "ዚድር መፋቅ ስነምግባር" በሚሉት ቃላት ጎግል ፈልግ። . በጥበብ ባልሆነ መንገድ ድርን መፋቅ ኚሰሩ ሙኚራዎቜዎ እርስዎ ኚሚያስቡት በላይ ፈጥነው ሊያበቁ ይቜላሉ።

ቢያስቆጥርም ገና መጀመሩ ነው

በእኛ ድር ስክራፐር ኮድ ውስጥ ምን እንደሚፈጠር አጠቃላይ እይታ ይኞውና፡

  • ዚሚፈለጉትን ቀተ-መጻሕፍት ያስመጡ።
  • ዹጉግል ክሮም ትርን በመክፈት ላይ።
  • ቲኬቶቜን በሚፈልጉበት ጊዜ ጥቅም ላይ ዚሚውሉትን ኚተሞቜ እና ቀናት በማለፍ ቊቱን ዹሚጀምር ተግባር ይደውሉ።
  • ይህ ተግባር ዚመጀመሪያውን ዹፍለጋ ውጀቶቜ ይወስዳል፣ በምርጥ ዹተደሹደሹ እና ተጚማሪ ውጀቶቜን ለመጫን አንድ አዝራር ጠቅ ያደርጋል።
  • ሌላ ተግባር ኹመላው ገጜ ላይ መሹጃን ይሰበስባል እና ዚውሂብ ፍሬም ይመልሳል።
  • ሁለቱ ቀደምት እርምጃዎቜ ዚሚኚናወኑት ዚመለያ ዓይነቶቜን በቲኬት ዋጋ (ርካሜ) እና በበሚራ ፍጥነት (ፈጣን) በመጠቀም ነው።
  • ዚስክሪፕቱ ተጠቃሚ ዚቲኬት ዋጋ ማጠቃለያ (ርካሜ ቲኬቶቜ እና አማካኝ ዋጋ) ዚያዘ ኢሜል ይላካል እና ኹላይ በተጠቀሱት ሶስት ጠቋሚዎቜ ዚተደሚደሩ ዹመሹጃ ፍሬም እንደ ኀክሎል ፋይል ተቀምጧል።
  • ኹላይ ያሉት ሁሉም ድርጊቶቜ ኹተወሰነ ጊዜ በኋላ በአንድ ዑደት ውስጥ ይኹናወናሉ.

እያንዳንዱ ዹሮሊኒዹም ፕሮጀክት ዹሚጀምሹው በድር ሟፌር መሆኑን ልብ ሊባል ይገባል. እጠቀማለው Chromedriverእኔ ኹ Google Chrome ጋር እሰራለሁ, ግን ሌሎቜ አማራጮቜም አሉ. PhantomJS እና Firefox ደግሞ ተወዳጅ ና቞ው። ሟፌሩን ካወሚዱ በኋላ, በተገቢው አቃፊ ውስጥ ማስቀመጥ ያስፈልግዎታል, እና ይህ ጥቅም ላይ ዚሚውልበትን ዝግጅት ያጠናቅቃል. ዚእኛ ዚስክሪፕት ዚመጀመሪያ መስመሮቜ አዲስ ዹChrome ትር ይኚፍታሉ።

በታሪኬ ውስጥ በአዹር ትኬቶቜ ላይ ጥሩ ቅናሟቜን ለማግኘት አዲስ አድማስ ለመክፈት እዚሞኚርኩ እንዳልሆነ አስታውስ። እንደዚህ ያሉ ቅናሟቜን ለመፈለግ በጣም ዹላቁ ዘዎዎቜ አሉ። ይህንን ቜግር ለመፍታት ዹዚህን ጜሑፍ ቀላል ግን ተግባራዊ መንገድ ለአንባቢዎቜ ማቅሚብ እፈልጋለሁ።

ኹላይ ዹተነጋገርነው ኮድ ይኾውና.

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 አዲስ ዹፍለጋ ክዋኔ ኚመጀመሩ በፊት ቊት ለጥቂት ሰኚንዶቜ ያህል “እንዲተኛ” ለማድሚግ ይጠቅማል። ብዙውን ጊዜ, አንድ ቊት ያለዚህ ማድሚግ አይቜልም. ኹላይ ያለውን ኮድ ካስኬዱ ዹ Chrome መስኮት ይኚፈታል, ይህም ቊት ኚጣቢያዎቜ ጋር ለመስራት ይጠቀማል.

ትንሜ ሙኚራ እናድርግ እና ዹ kayak.com ድህሚ ገጜን በተለዹ መስኮት እንክፈት። ዚምንበርበትን ኹተማ እና ዹምንፈልገውን ኹተማ እንዲሁም ዚበሚራ ቀናትን እንመርጣለን ። ቀኖቜን በሚመርጡበት ጊዜ ዹ + -3 ቀናት ክልል ጥቅም ላይ መዋሉን ያሚጋግጡ። ለእንደዚህ አይነት ጥያቄዎቜ ምላሜ ጣቢያው ዚሚያመርተውን ግምት ውስጥ በማስገባት ኮዱን ጻፍኩት። ለምሳሌ, ቲኬቶቜን ለተወሰኑ ቀናት ብቻ መፈለግ ካለብዎት, ዹ bot ኮድን መቀዹር ያለብዎት ኹፍተኛ ዕድል አለ. ስለ ኮዱ ስናገር ተገቢ ማብራሪያዎቜን እሰጣለሁ, ነገር ግን ግራ መጋባት ኚተሰማዎት ያሳውቁኝ.

አሁን ዹፍለጋ አዝራሩን ጠቅ ያድርጉ እና በአድራሻ አሞሌው ውስጥ ያለውን አገናኝ ይመልኚቱ. ተለዋዋጭው በሚገለጜበት ኚታቜ ባለው ምሳሌ ላይ ኚምጠቀምበት አገናኝ ጋር ተመሳሳይ መሆን አለበት kayak, ዩአርኀሉን ዚሚያኚማቜ እና ዘዮው ጥቅም ላይ ይውላል get ዚድር ነጂ. ዹፍለጋ አዝራሩን ጠቅ ካደሚጉ በኋላ ውጀቶቜ በገጹ ላይ መታዚት አለባ቞ው.

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት
ትዕዛዙን ስጠቀም get ኚሁለት ወይም ሶስት ጊዜ በላይ በጥቂት ደቂቃዎቜ ውስጥ፣ reCaptcha በመጠቀም ማሚጋገጫ እንዳጠናቅቅ ተጠዚቅኩ። ስርዓቱ አዲስ ቌክ ለማሄድ እስኪወስን ድሚስ ይህንን ቌክ እራስዎ ማለፍ እና መሞኚሩን መቀጠል ይቜላሉ። ስክሪፕቱን ስሞክር ዚመጀመርያው ዚፍተሻ ክፍለ ጊዜ ሁል ጊዜ ያለቜግር ዚሚሄድ ይመስለኝ ነበር ስለዚህ በኮዱ መሞኹር ኹፈለግክ በዹጊዜው እራስዎ ፈትሜ ኮዱ እንዲሰራ ማድሚግ ብቻ ነው በፍለጋ ክፍለ ጊዜዎቜ መካኚል ሹጅም ክፍተቶቜን በመጠቀም። እና ስለእሱ ካሰቡ ፣ አንድ ሰው በፍለጋ ስራዎቜ መካኚል በ 10 ደቂቃ ልዩነት ውስጥ ስለተቀበሉት ዚቲኬት ዋጋዎቜ መሹጃ ዚሚያስፈልገው አይቀርም።

XPath በመጠቀም ኚገጜ ጋር በመስራት ላይ

ስለዚህ, መስኮት ኹፍተን ጣቢያውን ጫንን. ዹዋጋ አወጣጥ እና ሌሎቜ መሚጃዎቜን ለማግኘት ዹ XPath ቮክኖሎጂን ወይም ዚሲኀስኀስ መምሚጫዎቜን መጠቀም አለብን። ኹ XPath ጋር ለመቆዚት ወሰንኩ እና ዚሲኀስኀስ መምሚጫዎቜን መጠቀም እንዳለብኝ አልተሰማኝም, ነገር ግን በዚህ መንገድ መስራት በጣም ይቻላል. ኀክስፓትን በመጠቀም በአንድ ገጜ ላይ ማሰስ አስ቞ጋሪ ሊሆን ይቜላል፣ እና ምንም እንኳን ዚገለጜኳ቞ውን ቎ክኒኮቜ ብትጠቀሙም። ይሄ ተጓዳኝ መለያዎቜን ኚገጹ ኮድ መቅዳትን ዚሚያካትት መጣጥፍ ፣ ይህ በእውነቱ አስፈላጊዎቹን ንጥሚ ነገሮቜ ለመድሚስ ጥሩው መንገድ እንዳልሆነ ተገነዘብኩ። በነገራቜን ላይ, ውስጥ ይሄ መጜሐፉ XPath እና CSS መራጮቜን በመጠቀም ኚገጟቜ ጋር ​​አብሮ ዚመስራትን መሰሚታዊ ገለጻ ይሰጣል። ተጓዳኙ ዚድር ነጂ ዘዮ ይህን ይመስላል።

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት
ስለዚህ፣ በቊት ላይ መስራታቜንን እንቀጥል። በጣም ርካሹን ቲኬቶቜን ለመምሚጥ ዚፕሮግራሙን አቅም እንጠቀም። በሚኹተለው ምስል ዹ XPath መምሚጫ ኮድ በቀይ ጎልቶ ይታያል። ኮዱን ለማዚት በሚፈልጉት ገጜ ላይ በቀኝ ጠቅ ማድሚግ እና ኚሚታዚው ምናሌ ውስጥ ዚመርማሪ ትዕዛዙን መምሚጥ ያስፈልግዎታል ። ይህ ትእዛዝ ለተለያዩ ዚገጜ ክፍሎቜ ሊጠራ ይቜላል ፣ ዚእሱ ኮድ በኮድ መመልኚቻው ውስጥ ይታያል እና ይደምቃል።

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት
ዚገጜ ኮድ ይመልኚቱ

መራጮቜን ኚኮድ መቅዳት ስለሚያስኚትላ቞ው ጉዳቶቜ ዚምክንያ቎ን ማሚጋገጫ ለማግኘት ለሚኚተሉት ባህሪያት ትኩሚት ይስጡ።

ኮዱን ሲገለብጡ ዚሚያገኙት ይህ ነው፡-

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

እንደዚህ ያለ ነገር ለመቅዳት በሚፈልጉት ዚኮድ ክፍል ላይ በቀኝ ጠቅ ማድሚግ እና ኚሚታዚው ምናሌ ውስጥ ኮፒ> ዹ XPath ትዕዛዝን ይምሚጡ።

በጣም ርካሹን ቁልፍ ለመግለጜ ዚተጠቀምኩት ይኞውና፡-

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

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት
ትዕዛዝ ቅዳ > 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).

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት
ዚመጀመሪያዎቹ ሶስት መስመሮቜ ታይተዋል እና ዹምንፈልገውን ሁሉ በግልፅ ማዚት እንቜላለን. ሆኖም፣ መሹጃ ዚማግኘት ዹበለጠ አስደሳቜ መንገዶቜ አሉን። ለዚብቻ ኚእያንዳንዱ አካል መሹጃ መውሰድ አለብን።

ወደ ሥራ ግባ!

ተግባርን ለመጻፍ ቀላሉ መንገድ ተጚማሪ ውጀቶቜን መጫን ነው, ስለዚህ እኛ ዹምንጀምሹው. ወደ ፍተሻ በሚያመራው አገልግሎት ላይ ጥርጣሬዎቜን ሳላነሳ ፕሮግራሙ ዹሚቀበለውን ዚበሚራ ቁጥር ኹፍ ማድሚግ እፈልጋለሁ ስለዚህ ገጹ በታዚ ቁጥር ተጚማሪ ዚውጀት ቁልፍን ጠቅ አደርጋለሁ። በዚህ ኮድ ውስጥ, ለእገዳው ትኩሚት መስጠት አለብዎት 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.....')

ዚስክሪፕቱ ዚሙኚራ ሂደት ይህን ይመስላል።
Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት
ዚስክሪፕት አሂድ ሙኚራ

ውጀቶቜ

እስኚዚህ ድሚስ ኚደሚስክ፣ እንኳን ደስ ያለህ! አሁን ብዙ ዚማሻሻያ መንገዶቜን ማዚት ብቜልም አሁን ዚሚሰራ ዚድር መቧጠጫ አለህ። ለምሳሌ ኚኢሜል ይልቅ ዚጜሑፍ መልእክት እንዲልክ ኚትዊሊዮ ጋር ሊጣመር ይቜላል። ኚበርካታ አገልጋዮቜ በተመሳሳይ ጊዜ ውጀቶቜን ለመቀበል VPN ወይም ሌላ ነገር መጠቀም ትቜላለህ። እንዲሁም ዚጣቢያውን ተጠቃሚ ሰው መሆኑን ለማሚጋገጥ በዹጊዜው ዚሚነሳ ቜግር አለ፣ ነገር ግን ይህ ቜግር ሊፈታ ይቜላል። በማንኛውም ሁኔታ, አሁን ኹፈለጉ እርስዎ ማስፋት ዚሚቜሉበት መሰሚት አለዎት. ለምሳሌ ዚኀክሎል ፋይል ኚኢሜል ጋር እንደ አባሪ ለተጠቃሚው መላኩን ያሚጋግጡ።

Python - መጓዝ ለሚወዱ ርካሜ ዹአዹር ትኬቶቜን ለማግኘት ሚዳት

በዳሰሳ ጥናቱ ውስጥ ዚተመዘገቡ ተጠቃሚዎቜ ብቻ መሳተፍ ይቜላሉ። ስግን እንእባክህን።

ዚድር መፋቅ ቎ክኖሎጂዎቜን ትጠቀማለህ?

  • ያ

  • ዹለም

8 ተጠቃሚዎቜ ድምጜ ሰጥተዋል። 1 ተጠቃሚዎቜ ድምፀ ተአቅቩ አድርገዋል።

ምንጭ: hab.com

አስተያዚት ያክሉ