Python Συνταγή 4 – Αυτοματοποίηση με το Mechanical Soup

Αρκετές είναι εκείνες οι φορές στις οποίες θέλουμε να αυτοματοποιήσουμε την αλληλεπίδρασή μας με ένα site . Για παράδειγμα θέλουμε να κάνουμε Χ αριθμό υποβολών στην φόρμα ενός site την πληροφορία που έχουμε σε ένα excel αρχείο ή να συνδεθούμε σε ένα site κάθε μέρα και να βλέπουμε για παράδειγμα την τιμή μίας μετοχής ή την τιμή ενός προϊόντος και να μας έρχεται ειδοποίηση όταν αυτό πάει στην επιθυμητή τιμή.

Το mechanical soup είναι μία βιβλιοθήκη η οποία βασίζεται στο beautiful soup της python και έρχεται να δώσει λύσεις σε αυτά τα προβλήματα. Επίσης είναι πολύ πιο ελαφρύ από το αντίστοιχο Selenium. Παρακάτω δείχνω έναν απλό τρόπο με τον οποίο μπορούμε να συμπληρώσουμε μία contact form και να στείλουμε ένα μήνυμα σε ένα site μέσω Python.

Αρχικά πρέπει να κάνουμε import την βιβλιοθήκη μας κάτι το οποίο γίνεται μέσω της παρακάτω εντολής :

pip install mechanicalsoup

Στη συνέχεια με την παρακάτω εντολή δημιουργούμε ένα αντικείμενο το οποίο το ονομάζω browser και θα χρησιμοποιηθεί για να εξομοιώσει μηχανικά τις λειτουργίες που κάνει ένας browser. Επίσης αφού το δημιουργήσουμε συνδεόμαστε στην σελίδα στην οποία θέλουμε να δουλέψουμε η οποία στην προκειμένη περίπτωση είναι μία δοκιμαστική σελίδα στο site μου.

browser = mechanicalsoup.StatefulBrowser()
browser.open('https://moras.gr/test/')

Μπορούμε εύκολα επίσης να δούμε τον πηγαίο κώδικα της σελίδας με την συνάρτηση get_current_page πάνω στον οποίο θα δουλέψουμε :

print(browser.get_current_page())

Ας υποθέσουμε τώρα για παράδειγμα πώς σας έχω ζαλίσει και θέλετε να με βομβαρδίσετε στα email ώστε να πάρετε το αίμα σας πίσω . Το πρώτο πράγμα που θα πρέπει να κάνετε είναι να βρείτε την φόρμα στην οποία θέλετε να στείλετε τα email . Ρίχνοντας μια ματιά στον κώδικα διαπιστώνουμε πώς η φόρμα που μας ενδιαφέρει έχει μία κλάση css με όνομα elementor-form. Επομένως εαν πληκτρολογήσουμε την παρακάτω εντολή και στη συνέχεια τυπώσουμε το αποτέλεσμα θα δούμε πώς διαλέξαμε σωστά την φόρμα που μας ενδιαφέρει:

#επιλογή φόρμας
browser.select_form('form[class="elementor-form"]')
#εκτύπωση περιεχομένου της φόρμας
browser.get_current_form().print_summary()

Το αποτέλεσμα του παραπάνω κώδικα είναι :

<input name="post_id" type="hidden" value="391"/>
<input name="form_id" type="hidden" value="bc240b3"/>
<input name="queried_id" type="hidden" value="391"/>
<input class="elementor-field elementor-size-sm elementor-field-textual" id="form-field-name" name="form_fields[name]" placeholder="Name" size="1" type="text"/>
<input aria-required="true" class="elementor-field elementor-size-sm elementor-field-textual" id="form-field-email" name="form_fields[email]" placeholder="Email" required="required" size="1" type="email"/>
<textarea class="elementor-field-textual elementor-field elementor-size-sm" id="form-field-message" name="form_fields[message]" placeholder="Message" rows="4"></textarea>
<button class="elementor-button elementor-size-sm" type="submit">
<span>
<span class="elementor-button-icon"></span>
<span class="elementor-button-text">Send</span>
</span>
</button>

Ξεκινάμε τώρα να γεμίζουμε τα πεδία της φόρμας με κώδικα python:

browser["form_fields[name]"]    = 'John Doe'
browser["form_fields[email]"]   = 'nobody@inthisworld.gr'
browser['form_fields[message]']   = 'Μου πήρε δύο λεπτα να σου γεμίσω το mailbox'

Για να κάνουμε submit την φόρμα με τα στοιχεία που συμπληρώσαμε απλά πληκτρολογούμε :

response = browser.submit_selected()

Εάν τρέξουμε τώρα το script θα δούμε ότι το email θα φύγει κανονικά . Μπορούμε για debugging να πληκτρολογήσουμε την παρακάτω εντολή η οποία θα ανοίξει έναν κανονικό browser με την φόρμα συμπληρωμένη με τα στοιχεία που δώσαμε παραπάνω

browser.launch_browser()

Ενώ όπως θα δούμε στο mailbox μας το email έχει έρθει κανονικά.

Εύλογα θα αναρωτηθεί κανείς πώς γράφοντας μια απλή for στον παραπάνω κώδικα θα μπορούσαμε μέσω ενός vpn να γεμίζαμε όλα τα mailbox κάθε site. Φυσικά αυτό μπορεί να μπλοκαριστεί εύκολα αν και αρκετά είναι εκείνα τα site τα οποία δεν παίρνουν κανένα μέτρο ασφαλείας. Σε κάθε περίπτωση όμως μπορούμε με το mechanicalsoup να κάνουμε χρήσιμους αυτοματισμούς εκμεταλλευόμενοι την δύναμη των libraries της python.