Python β€” ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ

Автор ΡΡ‚Π°Ρ‚ΡŒΠΈ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ сСгодня, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΅Ρ‘ Ρ†Π΅Π»ΡŒ β€” Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π΅Π±-скрапСра Π½Π° Python с использованиСм Selenium, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт поиск Ρ†Π΅Π½ Π½Π° Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚Ρ‹. ΠŸΡ€ΠΈ поискС Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π³ΠΈΠ±ΠΊΠΈΠ΅ Π΄Π°Ρ‚Ρ‹ (+- 3 дня ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π΄Π°Ρ‚). Π‘ΠΊΡ€Π°ΠΏΠ΅Ρ€ сохраняСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска Π² Excel-Ρ„Π°ΠΉΠ»Π΅ ΠΈ отправляСт Ρ‚ΠΎΠΌΡƒ, ΠΊΡ‚ΠΎ Π΅Π³ΠΎ запустил, элСктронноС письмо с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ свСдСниями ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π½Π°ΠΉΡ‚ΠΈ. Π—Π°Π΄Π°Ρ‡Π° этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠ°ΠΌ Π² поискС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Ρ‹Π³ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Python — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ

Если Π²Ρ‹, Ρ€Π°Π·Π±ΠΈΡ€Π°ΡΡΡŒ с ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ, почувствуСтС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΠ»ΠΈΡΡŒ β€” взглянитС Π½Π° эту ΡΡ‚Π°Ρ‚ΡŒΡŽ.

Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ?

Π’Ρ‹ Π²ΠΎΠ»ΡŒΠ½Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ описываСмой здСсь систСмой Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Π°ΠΌ хочСтся. Π―, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, примСнял Π΅Ρ‘ для поиска Ρ‚ΡƒΡ€ΠΎΠ² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ дня ΠΈ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² Π² ΠΌΠΎΠΉ Ρ€ΠΎΠ΄Π½ΠΎΠΉ Π³ΠΎΡ€ΠΎΠ΄. Если Π²Ρ‹ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΠΎ настроСны Π½Π° поиск Π²Ρ‹Π³ΠΎΠ΄Π½Ρ‹Ρ… Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² β€” Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скрипт Π½Π° сСрвСрС (простой сСрвСр, Π·Π° 130 Ρ€ΡƒΠ±Π»Π΅ΠΉ Π² мСсяц, Π²ΠΏΠΎΠ»Π½Π΅ для этого ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚) ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ запускался Π±Ρ‹ ΠΎΠ΄ΠΈΠ½-Π΄Π²Π° Ρ€Π°Π·Π° Π² дСнь. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π²Π°ΠΌ ΠΏΠΎ элСктронной ΠΏΠΎΡ‡Ρ‚Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ всё Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ скрипт сохранял Π±Ρ‹ Excel-Ρ„Π°ΠΉΠ» с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ поиска Π² Dropbox-ΠΏΠ°ΠΏΠΊΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‚ΠΊΡƒΠ΄Π° ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΈ Π² любоС врСмя.

Python — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ
Π― ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΡˆΡ‘Π» Ρ‚Π°Ρ€ΠΈΡ„ΠΎΠ² с ошибками, Π½ΠΎ полагаю, Ρ‡Ρ‚ΠΎ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ

ΠŸΡ€ΠΈ поискС, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ «гибкая Π΄Π°Ρ‚Π°Β», скрипт Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ прСдлоТСния, находящиСся Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ‚Ρ€Ρ‘Ρ… Π΄Π½Π΅ΠΉ ΠΎΡ‚ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π°Ρ‚. Π₯отя ΠΏΡ€ΠΈ запускС скрипта выполняСтся поиск ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ, Π΅Π³ΠΎ нСслоТно Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΌΠΎΠ³ Π±Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ нСскольким направлСниям ΠΏΠΎΠ»Ρ‘Ρ‚ΠΎΠ². Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ Ρ‚Π°Ρ€ΠΈΡ„Ρ‹, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ вСсьма интСрСсными.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π²Π΅Π±-скрапСр?

Когда я Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ занялся Π²Π΅Π±-скрапингом, ΠΌΠ½Π΅, чСстно говоря, это Π±Ρ‹Π»ΠΎ Π½Π΅ особСнно интСрСсно. МнС Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ большС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² сфСрС ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·Π½ΠΎΠ³ΠΎ модСлирования, финансового Π°Π½Π°Π»ΠΈΠ·Π°, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² области Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ окраски тСкстов. Но оказалось, Ρ‡Ρ‚ΠΎ это ΠΎΡ‡Π΅Π½ΡŒ интСрСсно β€” Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая собираСт Π΄Π°Π½Π½Ρ‹Π΅ с Π²Π΅Π±-сайтов. По ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ я Π²Π½ΠΈΠΊΠ°Π» Π² эту Ρ‚Π΅ΠΌΡƒ, я понял, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Π΅Π±-скрапинг являСтся Β«Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΌΒ» ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это β€” слишком смСлоС заявлСниС. Но ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компания Google Π½Π°Ρ‡Π°Π»Π°ΡΡŒ с Π²Π΅Π±-скрапСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π›Π°Ρ€Ρ€ΠΈ ПСйдТ создал с использованиСм Java ΠΈ Python. Π ΠΎΠ±ΠΎΡ‚Ρ‹ Google исслСдовали ΠΈ ΠΈΡΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ своим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° ΠΈΡ… вопросы. Π£ Π²Π΅Π±-скрапинга Π΅ΡΡ‚ΡŒ бСсконСчноС мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² примСнСния, ΠΈ Π΄Π°ΠΆΠ΅ Ссли Π²Π°ΠΌ, Π² сфСрС Data Science, интСрСсно Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Ρ‚ΠΎ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π·Π°Π²Π΅ΡΡ‚ΠΈΡΡŒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для Π°Π½Π°Π»ΠΈΠ·Π°, понадобятся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π²Ρ‹ΠΊΠΈ скрапинга.

НСкоторыС ΠΈΠ· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… здСсь ΠΏΡ€ΠΈΡ‘ΠΌΠΎΠ² я Π½Π°ΡˆΡ‘Π» Π² Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ ΠΎ Π²Π΅Π±-скрапингС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Π΄Π°Π²Π½ΠΎ обзавёлся. Π’ Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ мноТСство простых ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈ ΠΈΠ΄Π΅ΠΉ ΠΏΠΎ практичСскому ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ ΠΈΠ·ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ интСрСсная Π³Π»Π°Π²Π° ΠΎΠ± ΠΎΠ±Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ reCaptcha. Для мСня это стало Π½ΠΎΠ²ΠΎΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ я ΠΈ Π½Π΅ Π·Π½Π°Π» ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты ΠΈ Π΄Π°ΠΆΠ΅ Ρ†Π΅Π»Ρ‹Π΅ сСрвисы для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

Π›ΡŽΠ±ΠΈΡ‚Π΅ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ?!

На простой ΠΈ довольно Π±Π΅Π·ΠΎΠ±ΠΈΠ΄Π½Ρ‹ΠΉ вопрос, вынСсСнный Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ этого Ρ€Π°Π·Π΄Π΅Π»Π°, часто ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚, снабТённый ΠΏΠ°Ρ€ΠΎΠΉ историй ΠΈΠ· ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠΉ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠΌΡƒ Π΅Π³ΠΎ Π·Π°Π΄Π°Π»ΠΈ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· нас согласится с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΡ β€” это прСкрасный способ погруТСния Π² Π½ΠΎΠ²Ρ‹Π΅ ΠΊΡƒΠ»ΡŒΡ‚ΡƒΡ€Π½Ρ‹Π΅ срСды ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ собствСнного ΠΊΡ€ΡƒΠ³ΠΎΠ·ΠΎΡ€Π°. Однако Ссли Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ вопрос ΠΎ Ρ‚ΠΎΠΌ, нравится Π»ΠΈ Π΅ΠΌΡƒ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚Ρ‹, Ρ‚ΠΎ я ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ. БобствСнно говоря, Ρ‚ΡƒΡ‚ Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Python.

ΠŸΠ΅Ρ€Π²ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π° ΠΏΡƒΡ‚ΠΈ создания систСмы поиска свСдСний ΠΏΠΎ Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚Π°ΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π±ΠΎΡ€ подходящСй ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. РСшСниС этой Π·Π°Π΄Π°Ρ‡ΠΈ далось ΠΌΠ½Π΅ Π½Π΅Π»Π΅Π³ΠΊΠΎ, Π½ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ я Π²Ρ‹Π±Ρ€Π°Π» сСрвис Kayak. Π― ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» сСрвисы Momondo, Skyscanner, Expedia, Π΄Π° ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π½ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΠ² Π½Π° этих рСсурсах Π±Ρ‹Π»ΠΈ Π½Π΅ΠΏΡ€ΠΎΠ±ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌΠΈ. ПослС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ, Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒ систСмы Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ я Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ со свСтофорами, ΠΏΠ΅ΡˆΠ΅Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°ΠΌΠΈ ΠΈ вСлосипСдами, я Ρ€Π΅ΡˆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ большС всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Kayak, нСсмотря Π΄Π°ΠΆΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚ΡƒΡ‚, Ссли Π·Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ страниц, Ρ‚ΠΎΠΆΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. МнС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΎΡ‚ отправлял Π±Ρ‹ запросы ΠΊ сайту Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°Ρ… ΠΎΡ‚ 4 Π΄ΠΎ 6 часов, ΠΈ всё Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ. ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈ слоТности Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Kayak, Π½ΠΎ Ссли вас Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π΄ΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ, Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, послС Ρ‡Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΎΡ‚, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ нСсколько часов, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ. Π’Ρ‹, Ссли Π½ΡƒΠΆΠ½ΠΎ, Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ для Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π° Ссли Π²Ρ‹ Ρ‚Π°ΠΊ ΠΈ сдСлаСтС β€” ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этом Π² коммСнтариях.

Если Π²Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ знакомство с Π²Π΅Π±-скрапингом, ΠΈ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Π±-сайты всСми силами с Π½ΠΈΠΌ Π±ΠΎΡ€ΡŽΡ‚ΡΡ, Ρ‚ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ своСму ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π² этой области β€” ΠΎΠΊΠ°ΠΆΠΈΡ‚Π΅ сСбС услугу ΠΈ ΠΏΠΎΠΈΡ‰ΠΈΡ‚Π΅ Π² Google ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ словам Β«web scraping etiquetteΒ». Π’Π°ΡˆΠΈ экспСримСнты ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ скорСС, Ρ‡Π΅ΠΌ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Π² Ρ‚ΠΎΠΌ случаС, Ссли Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π²Π΅Π±-скрапингом Π½Π΅Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ.

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ΠΎΡ‚ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ нашСго Π²Π΅Π±-скрапСра:

  • Π˜ΠΌΠΏΠΎΡ€Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.
  • ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Google Chrome.
  • Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая запускаСт Π±ΠΎΡ‚Π°, пСрСдавая Π΅ΠΌΡƒ Π³ΠΎΡ€ΠΎΠ΄Π° ΠΈ Π΄Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ поискС Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ².
  • Π­Ρ‚Π° функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска, отсортированныС ΠΏΠΎ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΡŽ наибольшСй ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (best), ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².
  • Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° функция собираСт Π΄Π°Π½Π½Ρ‹Π΅ со всСй страницы ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„Ρ€Π΅ΠΉΠΌ Π΄Π°Π½Π½Ρ‹Ρ….
  • Π”Π²Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… шага Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с использованиСм Ρ‚ΠΈΠΏΠΎΠ² сортировки ΠΏΠΎ Ρ†Π΅Π½Π΅ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² (cheap) ΠΈ ΠΏΠΎ скорости ΠΏΠ΅Ρ€Π΅Π»Ρ‘Ρ‚Π° (fastest).
  • ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ скрипта отправляСтся элСктронноС письмо, содСрТащСС ΠΊΡ€Π°Ρ‚ΠΊΡƒΡŽ сводку ΠΎ Ρ†Π΅Π½Π°Ρ… Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² (самыС Π΄Π΅ΡˆΡ‘Π²Ρ‹Π΅ Π±ΠΈΠ»Π΅Ρ‚Ρ‹ ΠΈ срСдняя Ρ†Π΅Π½Π°), Π° Ρ„Ρ€Π΅ΠΉΠΌ Π΄Π°Π½Π½Ρ‹Ρ… со свСдСниями, отсортированными ΠΏΠΎ Ρ‚Ρ€Ρ‘ΠΌ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹ΠΌ показатСлям, сохраняСтся Π² Π²ΠΈΠ΄Π΅ Excel-Ρ„Π°ΠΉΠ»Π°.
  • ВсС Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ дСйствия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅ Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Надо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Selenium начинаСтся с Π²Π΅Π±-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ 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 дня. Π― написал ΠΊΠΎΠ΄ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ сайт Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ запросы. Если ΠΆΠ΅ Π²Π°ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π±ΠΈΠ»Π΅Ρ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π°Ρ‚Ρ‹, Ρ‚ΠΎ высока Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ придётся Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π±ΠΎΡ‚Π°. Рассказывая ΠΎ ΠΊΠΎΠ΄Π΅, я дСлаю ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ пояснСния, Π½ΠΎ Ссли Π²Ρ‹ почувствуСтС, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΡƒΡ‚Π°Π»ΠΈΡΡŒ β€” Π΄Π°ΠΉΡ‚Π΅ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ запуска поиска ΠΈ смотрим Π½Π° ссылку Π² строкС адрСса. Она Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Ρ‚Ρƒ ссылку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅, Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ пСрСмСнная kayak, хранящая URL, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ get Π²Π΅Π±-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. ПослС наТатия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ поиска Π½Π° страницС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Python — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ
Когда я использовал ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ get большС Π΄Π²ΡƒΡ…-Ρ‚Ρ€Ρ‘Ρ… Ρ€Π°Π· Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΈΠ½ΡƒΡ‚, ΠΌΠ½Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π»ΠΈ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ с использованиСм reCaptcha. Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ экспСримСнты Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° систСма Π½Π΅ Ρ€Π΅ΡˆΠΈΡ‚ ΡƒΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ. Когда я тСстировал скрипт, создалось Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ сСанс поиска всСгда ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, поэтому, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ, Π²Π°ΠΌ придётся лишь пСриодичСски Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ сСансами поиска. Π”Π° ΠΈ, Ссли Π²Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ вряд Π»ΠΈ понадобятся свСдСния ΠΎ Ρ†Π΅Π½Π°Ρ… Π½Π° Π±ΠΈΠ»Π΅Ρ‚Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ с 10-ΠΌΠΈΠ½ΡƒΡ‚Π½Ρ‹ΠΌΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ опСрациями поиска.

Π Π°Π±ΠΎΡ‚Π° со страницСй с использованиСм XPath

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ ΠΎΠΊΠ½ΠΎ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΈ сайт. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ свСдСния ΠΎ Ρ†Π΅Π½Π°Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ XPath ΠΈΠ»ΠΈ CSS-сСлСкторами. Π― Ρ€Π΅ΡˆΠΈΠ» ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° XPath ΠΈ Π½Π΅ ΠΎΡ‰ΡƒΡ‚ΠΈΠ» Π½ΡƒΠΆΠ΄Ρ‹ Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ CSS-сСлСкторов, Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ страницС с использованиСм XPath ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСпростым Π΄Π΅Π»ΠΎΠΌ, ΠΈ Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Ρ‚Π΅ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я описывал Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π³Π΄Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΎΡΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ· ΠΊΠΎΠ΄Π° страницы, я понял, Ρ‡Ρ‚ΠΎ это, Π½Π° самом Π΄Π΅Π»Π΅, Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ обращСния ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ элСмСнтам. ΠšΡΡ‚Π°Ρ‚ΠΈ, Π² этой ΠΊΠ½ΠΈΠ³Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ описаниС основ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со страницами с использованиСм XPath ΠΈ CSS-сСлСкторов. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π΅Π±-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°.

Python — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ
Π˜Ρ‚Π°ΠΊ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ Π±ΠΎΡ‚ΠΎΠΌ. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ возмоТностями ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для Π²Ρ‹Π±ΠΎΡ€Π° самых Π΄Π΅ΡˆΡ‘Π²Ρ‹Ρ… Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ². На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ красным Π²Ρ‹Π΄Π΅Π»Π΅Π½ ΠΊΠΎΠ΄ сСлСктора XPath. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄, Π½ΡƒΠΆΠ½ΠΎ Ρ‰Ρ‘Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅ΠΌΡƒ вас элСмСнту страницы ΠΈ Π² появившСмся мСню Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄ (Inspect). Π­Ρ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ для Ρ€Π°Π·Π½Ρ‹Ρ… элСмСнтов страницы, ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π² ΠΎΠΊΠ½Π΅ просмотра ΠΊΠΎΠ΄Π°.

Python — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ
ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΊΠΎΠ΄Π° страницы

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΈΠΌ рассуТдСниям ΠΎ нСдостатках копирования сСлСкторов ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ особСнности.

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ получаСтся ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°:

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

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅, Π½ΡƒΠΆΠ½ΠΎ Ρ‰Ρ‘Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅ΠΌΡƒ вас участку ΠΊΠΎΠ΄Π° ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π² появившСмся мСню ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Copy > Copy XPath.

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ я использовал для опрСдСлСния ΠΊΠ½ΠΎΠΏΠΊΠΈ Cheapest:

cheap_results = β€˜//a[@data-code = "price"]’

Python — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ
Команда Copy > Copy XPath

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ выглядит Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅. ΠŸΡ€ΠΈ Π΅Π³ΠΎ использовании выполняСтся поиск элСмСнта a, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ 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 — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ
Выводятся ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ строки ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‡Ρ‘Ρ‚ΠΊΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. Однако Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ интСрСсныС способы получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Нам Π½ΡƒΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΏΠΎ-ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π—Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ!

Π›Π΅Π³Ρ‡Π΅ всСго Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², поэтому с Π½Π΅Ρ‘ ΠΈ Π½Π°Ρ‡Π½Ρ‘ΠΌ. МнС Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ число ΠΏΠ΅Ρ€Π΅Π»Ρ‘Ρ‚ΠΎΠ², свСдСния ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈ ΠΏΡ€ΠΈ этом Π½Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρƒ сСрвиса подозрСния, приводящиС ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅, поэтому я Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ Ρ‰Ρ‘Π»ΠΊΠ°ΡŽ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Load more results ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° отобраТаСтся страница. Π’ этом ΠΊΠΎΠ΄Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π±Π»ΠΎΠΊ 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, эта почтовая систСма вСсьма популярна, Π½ΠΎ Π΅ΡΡ‚ΡŒ масса Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Если ΠΆΠ΅ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΡƒΡ‡Ρ‘Ρ‚Π½ΡƒΡŽ запись 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 — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ
ВСстовый запуск скрипта

Π˜Ρ‚ΠΎΠ³ΠΈ

Если Π²Ρ‹ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° β€” ΠΏΡ€ΠΈΠΌΠΈΡ‚Π΅ поздравлСния! Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Π²Π΅Π±-скрапСр, хотя я ΡƒΠΆΠ΅ Π²ΠΈΠΆΡƒ мноТСство ΠΏΡƒΡ‚Π΅ΠΉ Π΅Π³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ. НапримСр, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Twilio, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½, вмСсто элСктронных писСм, отправлял Π±Ρ‹ тСкстовыС сообщСния. МоТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ VPN ΠΈΠ»ΠΈ Π΅Ρ‰Ρ‘ Ρ‡Π΅ΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сСрвСров. Π•ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΈ пСриодичСски Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ сайта Π½Π° Ρ‚ΠΎ, являСтся Π»ΠΈ ΠΎΠ½ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ, Π½ΠΎ ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ. Π’ любом случаС, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас имССтся Π±Π°Π·Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹, ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ. НапримСр, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Excel-Ρ„Π°ΠΉΠ» отправлялся Π±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π² Π²ΠΈΠ΄Π΅ влоТСния Π² элСктронноС письмо.

Python — ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π² поискС Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π²Π΅Π±-скрапинга?

  • Π”Π°

  • НСт

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 8 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ВоздСрТался 1 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com