Προς το περιεχόμενο

Selenium και cookies


Lanike71

Προτεινόμενες αναρτήσεις

Καλημέρα, λίγο τη βοήθειά σας,

Κάνω scrape σε μία σελίδα με selenium, chromedriver και python.

Αν και έψαξα πολύ, δε μπορώ να βρω άκρη με τα cookies, γιατί κάθε φορά που ανοίγει το παράθυρο του chrome, πετά μπροστά και το γνωστό μήνυμα για cookies κλπ. Οπότε βγάζει σφάλμα παρακάτω στο scraping.

Όποιος μπορεί ας βοηθήσει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Καλησπέρα,

Και μένα με είχε παιδεψει παλιότερα αρκετά, η λύση που είχα βρει ήταν η εξης:

Ανοίγεις την σελίδα που θέλεις, και την πρώτη φορά μόνο πατάς τα  accept με το χέρι, και σώζεις τα cookies σε ένα αρχείο της επιλογής σου, και κλείνεις τη σελίδα, σε κάθε επομενο ανοιγμα σελίδας κάνεις load τα cookies.

 

Python Snippet:

 

def save_cookie(driver, path):
    with open(path, 'wb') as filehandler:
        pickle.dump(driver.get_cookies(), filehandler)

def load_cookie(driver, path):
     with open(path, 'rb') as cookiesfile:
         cookies = pickle.load(cookiesfile)
         for cookie in cookies:
            #  print(cookie)
             driver.add_cookie(cookie)

first_time=True

if first_time:
    # do this only on first time
    wd.get('https://www.your_web_page_to_visit.com')
    # once the page loads login manually and do all the I am not robot stuff
    # when finish press enter in the console
    foo = input()
    save_cookie(wd, '/tmp/cookie')
else:
    wd.get('https://www.your_web_page_to_visit.com')
    load_cookie(wd,'/tmp/cookie')
    wd.get('https://www.your_web_page_to_visit.com')

 

Αν βρεις καλύτερη προσέγγιση με ενδιαφέρει, πάντως δεν είχα καταφέρει να κάνω το click μεσω selenium καθώς δε μπορουσα να το κάνω `detect`.

Επεξ/σία από Technology fan
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Σε ευχαριστώ για την απάντηση, θα δοκιμάσω και θα σου πω.

Δοκίμασα πολλά, ένα πιθανό (για σένα), ίσως είναι να μπορέσει ο driver να κάνει switch στο ενεργό παράθυρο ή frame και εκεί να εντοπίσει το button για να κάνει click.

Στη δικιά μου περίπτωση δε δούλεψε πάντως...

Επίσης κάτι που συνάντησα σε scraping πινάκων και μου έκανε εντύπωση:

Αν στην html, μέσα σε <table>, υπάρχει <body>, τότε ο "γονέας" του <tr> είναι το <body>, οπότε σε αυτό θα ψάξεις για το αντικείμενο.

Δες μήπως είναι αυτή η περίπτωσή σου. 

Επεξ/σία από Lanike71
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τελικά δε δούλεψε, μου πετάει σφάλμα για το sessionId.

Προφανώς τα παλαιότερα cookies δε γίνονται αποδεκτά, πρέπει να είναι από το συγκεκριμένο session.

Θα προχωρήσω παρακάτω και αν βρω λύση, έχει καλώς. Άλλωστε είναι μόνο για προσωπική χρήση ο κώδικας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα και απο εμένα ,

το να κάνεις κάθε φορά "αποδοχή" νομίζω είναι η πιο σίγουρη λύση .

Σε αντίστοιχο δικό μου πρόβλημα είχα βρεί 2 λύσεις : 
-είτε καλείς το onclick action του "Accept cookies" απο τον driver
-είτε ψάχνεις το xpath του κουμπιού και κάνεις παραδοσιακά click() .
 

Προσωπικά θυμάμαι είχα βάλει και ένα sleep time στο load γιατι το script που έψαχνε για το αν έχεις cookies έτρεχε ασύγχρονα και μπορεί να σε "πιάσει" σε οποιαδήποτε στιγμή

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
2 ώρες πριν, Theo1903 είπε

Καλησπέρα και απο εμένα ,

το να κάνεις κάθε φορά "αποδοχή" νομίζω είναι η πιο σίγουρη λύση .

Σε αντίστοιχο δικό μου πρόβλημα είχα βρεί 2 λύσεις : 
-είτε καλείς το onclick action του "Accept cookies" απο τον driver
-είτε ψάχνεις το xpath του κουμπιού και κάνεις παραδοσιακά click() .
 

Προσωπικά θυμάμαι είχα βάλει και ένα sleep time στο load γιατι το script που έψαχνε για το αν έχεις cookies έτρεχε ασύγχρονα και μπορεί να σε "πιάσει" σε οποιαδήποτε στιγμή

Με το xpath δε δούλεψε σε μένα, παρ' όλο που το βρήκα. Να τρέξω το action, να σου πω την αλήθεια, δε δοκίμασα (ούτε και το σκέφτηκα).

Η σελίδα αν θέλει κάποιος να δοκιμάσει είναι η whoscored.com

Επεξ/σία από Lanike71
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 12/1/2020 στις 4:04 ΜΜ, Technology fan είπε

 


def save_cookie(driver, path):
    with open(path, 'wb') as filehandler:
        pickle.dump(driver.get_cookies(), filehandler)

def load_cookie(driver, path):
     with open(path, 'rb') as cookiesfile:
         cookies = pickle.load(cookiesfile)
         for cookie in cookies:
            #  print(cookie)
             driver.add_cookie(cookie)

first_time=True

if first_time:
    # do this only on first time
    wd.get('https://www.your_web_page_to_visit.com')
    # once the page loads login manually and do all the I am not robot stuff
    # when finish press enter in the console
    foo = input()
    save_cookie(wd, '/tmp/cookie')
else:
    wd.get('https://www.your_web_page_to_visit.com')
    load_cookie(wd,'/tmp/cookie')
    wd.get('https://www.your_web_page_to_visit.com')

Αν βρεις καλύτερη προσέγγιση με ενδιαφέρει, πάντως δεν είχα καταφέρει να κάνω το click μεσω selenium καθώς δε μπορουσα να το κάνω `detect`.

Ποτέ δεν αλλάζεις το first_time πως θα εκτελεστεί το else στον κώδικα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

3 ώρες πριν, k33theod είπε

Ποτέ δεν αλλάζεις το first_time πως θα εκτελεστεί το else στον κώδικα;

Ναι την λογική έβαλα μόνο, Αφού σωθεί το cookie το θέτεις  False και είσαι οκ, ναι ιδανικά θα πρεπε να γίνει bind με την υπαρξη του αρχείου

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Και για να μην ανοίγω νέο θέμα:

Ενώ καταφέρνω να κάνω κλικ μέσω selenium, τα κελιά του πίνακα αλλάζουν τιμές, αυτό φαίνεται και μέσω των developer tools που έχει ο chrome, δεν καταφέρνω με τον ίδιο κώδικα να πάρω τα κελιά του πίνακα, που υποτίθεται ότι έχω αλλάξει μέσω κλικ. Συγκεκριμένα πετάει κενά strings.


btn_defensive = driver.find_element_by_xpath('//*[@id="stage-team-stats-options"]/li[2]/a')
btn_defensive.click()

time.sleep(10)

my_table = driver.find_element_by_xpath('//*[@id="top-team-stats-summary-grid"]') # Find the table

tbody = my_table.find_element_by_tag_name('tbody') # Get the tbody of the table

rows = tbody.find_elements_by_tag_name('tr') # Get all rows of the table

#print(len(rows)) #test

for row in rows:
    cells = row.find_elements_by_tag_name('td') # get all cells for every row
    for cell in cells:
        print(cell.text) # print cell text

Mε τον ίδιο κώδικα, παίρνω κανονικά τον πίνακα, πριν το κλικ.

https://www.whoscored.com/Regions/252/Tournaments/2/Seasons/7811/Stages/17590/TeamStatistics/England-Premier-League-2019-2020

Συγκεκριμένα, αν πατηθεί το Defensive, τα κελιά αλλάζουν αλλά δεν υπάρχουν δεδομένα...Απλά κενά.

Επεξ/σία από Lanike71
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

On 13/01/2020 at 20:04, Lanike71 said:

Με το xpath δε δούλεψε σε μένα, παρ' όλο που το βρήκα. Να τρέξω το action, να σου πω την αλήθεια, δε δοκίμασα (ούτε και το σκέφτηκα).

Η σελίδα αν θέλει κάποιος να δοκιμάσει είναι η whoscored.com

αχαχχα είμαστε πολύ κοντά απ'ότι φαίνεται . Σε μια απο τις σελίδες που είχα κάνει αυτο που ανέφερα είναι η : https://int.soccerway.com/

Η οποία παρεπιμπτόντως ,βλέπω οτι έχει ακριβώς το ίδιο structure στο popup για το accept cookies .

btw το δοκίμασα και δούλεψε με ακριβώς το ίδιο path :

 element=self.driver.find_element_by_xpath("(//*[@class='qc-cmp-button'])[1]")
 element.click()

  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κάτσε περίμενε, γιατί εδώ έχουμε θέμα.

Έτρεξα το path που έδωσες και όντως δούλεψε και σ' ευχαριστώ, αλλά το θέμα είναι ότι το path που δίνει το developer's tools δεν είναι το ίδιο με αυτό που έδωσες εσύ.

Εγώ παίρνω 

//*[@id="qcCmpButtons"]/button[2]

Εσύ πώς πήρες το path;

Επίσης αν έχεις χρόνο, ρίξε μία ματιά στο επόμενο ερώτημά μου, γιατί δε μπορεί να παρσάρει τον πίνακα, μετά το click του defensive.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τελικά τα κατάφερα μέσω Λαμίας, στη δεύτερη ερώτηση, αλλά τα κατάφερα.

Συγκεκριμένα, δεν έπρεπε να στοχεύσω μόνο το <table>, αλλά όλο το div που κρατά το table. Περίεργο αλλά δούλεψε...

Όλα καλά λοιπόν.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
Στις 15/1/2020 στις 6:42 ΜΜ, Lanike71 είπε

Τελικά τα κατάφερα μέσω Λαμίας, στη δεύτερη ερώτηση, αλλά τα κατάφερα.

Συγκεκριμένα, δεν έπρεπε να στοχεύσω μόνο το <table>, αλλά όλο το div που κρατά το table. Περίεργο αλλά δούλεψε...

Όλα καλά λοιπόν.

Ναι γιατι το Selenium λειτουργει τοσο γρηγορα που πολλες φορες δε προλαβαινει να βρει το σημειο που του εχεις πει στο DOM γιατι το DOM δεν εχει προλαβει να γινει rendered με αποτελεσμα να σκαει, για αυτο στοχευοντας στο parent element επαιξε.

Πιο σωστο θα ηταν κρατωντας το αρχικο σου element, να χρησιμοποιουσες τη λογικη του Selenium  wait the element to be rendered then proceed to the next line of command. Αν το googlareis θα βρεις πως ειναι το Implementation του.

Aφου παιζει αστο, απλα ανεφερα το παραπανω για future case development.

 

Επεξ/σία από Στεφανος123
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

20 ώρες πριν, Στεφανος123 είπε

Ναι γιατι το Selenium λειτουργει τοσο γρηγορα που πολλες φορες δε προλαβαινει να βρει το σημειο που του εχεις πει στο DOM γιατι το DOM δεν εχει προλαβει να γινει rendered με αποτελεσμα να σκαει, για αυτο στοχευοντας στο parent element επαιξε.

Πιο σωστο θα ηταν κρατωντας το αρχικο σου element, να χρησιμοποιουσες τη λογικη του Selenium  wait the element to be rendered then proceed to the next line of command. Αν το googlareis θα βρεις πως ειναι το Implementation του.

Aφου παιζει αστο, απλα ανεφερα το παραπανω για future case development.

Αν και το είδα να χρησιμοποιείται, προτίμησα να παίξω με τη χρονική αναμονή, καθώς θεώρησα ότι 30 δευτερόλεπτα, είναι αρκετά για να φορτώσουν τα πάντα.

Θα το διορθώσω, καθώς φαίνεται(είναι) πιο σωστό αυτό που λες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 19/1/2020 στις 11:54 ΠΜ, Lanike71 είπε

Αν και το είδα να χρησιμοποιείται, προτίμησα να παίξω με τη χρονική αναμονή, καθώς θεώρησα ότι 30 δευτερόλεπτα, είναι αρκετά για να φορτώσουν τα πάντα.

Θα το διορθώσω, καθώς φαίνεται(είναι) πιο σωστό αυτό που λες.

Ναι γιατι σκεψου να χρησιμοποιεις σε πολλα σημεια την αναμονη των 30 δευτερολεπτων, θα αργει πολυ να τελειωνει με αποτελεσμα και να επιβραδυνει ολο το process. Σκεψου να θες να τρεχεις scripts το ενα μετα το αλλο και να χρησιμοποιεις τα 30 δευτερολεπτα. Χανεις την ταχυτητα που προσφερει το Selenium και δεν ειναι efficient.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...