Lanike71 Δημοσ. 12 Ιανουαρίου 2020 Δημοσ. 12 Ιανουαρίου 2020 Καλημέρα, λίγο τη βοήθειά σας, Κάνω scrape σε μία σελίδα με selenium, chromedriver και python. Αν και έψαξα πολύ, δε μπορώ να βρω άκρη με τα cookies, γιατί κάθε φορά που ανοίγει το παράθυρο του chrome, πετά μπροστά και το γνωστό μήνυμα για cookies κλπ. Οπότε βγάζει σφάλμα παρακάτω στο scraping. Όποιος μπορεί ας βοηθήσει.
Technology fan Δημοσ. 12 Ιανουαρίου 2020 Δημοσ. 12 Ιανουαρίου 2020 (επεξεργασμένο) Καλησπέρα, Και μένα με είχε παιδεψει παλιότερα αρκετά, η λύση που είχα βρει ήταν η εξης: Ανοίγεις την σελίδα που θέλεις, και την πρώτη φορά μόνο πατάς τα 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`. Επεξ/σία 12 Ιανουαρίου 2020 από Technology fan
Lanike71 Δημοσ. 13 Ιανουαρίου 2020 Μέλος Δημοσ. 13 Ιανουαρίου 2020 (επεξεργασμένο) Σε ευχαριστώ για την απάντηση, θα δοκιμάσω και θα σου πω. Δοκίμασα πολλά, ένα πιθανό (για σένα), ίσως είναι να μπορέσει ο driver να κάνει switch στο ενεργό παράθυρο ή frame και εκεί να εντοπίσει το button για να κάνει click. Στη δικιά μου περίπτωση δε δούλεψε πάντως... Επίσης κάτι που συνάντησα σε scraping πινάκων και μου έκανε εντύπωση: Αν στην html, μέσα σε <table>, υπάρχει <body>, τότε ο "γονέας" του <tr> είναι το <body>, οπότε σε αυτό θα ψάξεις για το αντικείμενο. Δες μήπως είναι αυτή η περίπτωσή σου. Επεξ/σία 13 Ιανουαρίου 2020 από Lanike71
Lanike71 Δημοσ. 13 Ιανουαρίου 2020 Μέλος Δημοσ. 13 Ιανουαρίου 2020 Τελικά δε δούλεψε, μου πετάει σφάλμα για το sessionId. Προφανώς τα παλαιότερα cookies δε γίνονται αποδεκτά, πρέπει να είναι από το συγκεκριμένο session. Θα προχωρήσω παρακάτω και αν βρω λύση, έχει καλώς. Άλλωστε είναι μόνο για προσωπική χρήση ο κώδικας.
Theo1903 Δημοσ. 13 Ιανουαρίου 2020 Δημοσ. 13 Ιανουαρίου 2020 Καλησπέρα και απο εμένα , το να κάνεις κάθε φορά "αποδοχή" νομίζω είναι η πιο σίγουρη λύση . Σε αντίστοιχο δικό μου πρόβλημα είχα βρεί 2 λύσεις : -είτε καλείς το onclick action του "Accept cookies" απο τον driver -είτε ψάχνεις το xpath του κουμπιού και κάνεις παραδοσιακά click() . Προσωπικά θυμάμαι είχα βάλει και ένα sleep time στο load γιατι το script που έψαχνε για το αν έχεις cookies έτρεχε ασύγχρονα και μπορεί να σε "πιάσει" σε οποιαδήποτε στιγμή
Lanike71 Δημοσ. 13 Ιανουαρίου 2020 Μέλος Δημοσ. 13 Ιανουαρίου 2020 (επεξεργασμένο) 2 ώρες πριν, Theo1903 είπε Καλησπέρα και απο εμένα , το να κάνεις κάθε φορά "αποδοχή" νομίζω είναι η πιο σίγουρη λύση . Σε αντίστοιχο δικό μου πρόβλημα είχα βρεί 2 λύσεις : -είτε καλείς το onclick action του "Accept cookies" απο τον driver -είτε ψάχνεις το xpath του κουμπιού και κάνεις παραδοσιακά click() . Προσωπικά θυμάμαι είχα βάλει και ένα sleep time στο load γιατι το script που έψαχνε για το αν έχεις cookies έτρεχε ασύγχρονα και μπορεί να σε "πιάσει" σε οποιαδήποτε στιγμή Με το xpath δε δούλεψε σε μένα, παρ' όλο που το βρήκα. Να τρέξω το action, να σου πω την αλήθεια, δε δοκίμασα (ούτε και το σκέφτηκα). Η σελίδα αν θέλει κάποιος να δοκιμάσει είναι η whoscored.com Επεξ/σία 13 Ιανουαρίου 2020 από Lanike71
k33theod Δημοσ. 14 Ιανουαρίου 2020 Δημοσ. 14 Ιανουαρίου 2020 Στις 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 στον κώδικα;
Technology fan Δημοσ. 14 Ιανουαρίου 2020 Δημοσ. 14 Ιανουαρίου 2020 3 ώρες πριν, k33theod είπε Ποτέ δεν αλλάζεις το first_time πως θα εκτελεστεί το else στον κώδικα; Ναι την λογική έβαλα μόνο, Αφού σωθεί το cookie το θέτεις False και είσαι οκ, ναι ιδανικά θα πρεπε να γίνει bind με την υπαρξη του αρχείου
Lanike71 Δημοσ. 14 Ιανουαρίου 2020 Μέλος Δημοσ. 14 Ιανουαρίου 2020 (επεξεργασμένο) Και για να μην ανοίγω νέο θέμα: Ενώ καταφέρνω να κάνω κλικ μέσω 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, τα κελιά αλλάζουν αλλά δεν υπάρχουν δεδομένα...Απλά κενά. Επεξ/σία 14 Ιανουαρίου 2020 από Lanike71
Theo1903 Δημοσ. 15 Ιανουαρίου 2020 Δημοσ. 15 Ιανουαρίου 2020 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() 1
Lanike71 Δημοσ. 15 Ιανουαρίου 2020 Μέλος Δημοσ. 15 Ιανουαρίου 2020 Κάτσε περίμενε, γιατί εδώ έχουμε θέμα. Έτρεξα το path που έδωσες και όντως δούλεψε και σ' ευχαριστώ, αλλά το θέμα είναι ότι το path που δίνει το developer's tools δεν είναι το ίδιο με αυτό που έδωσες εσύ. Εγώ παίρνω //*[@id="qcCmpButtons"]/button[2] Εσύ πώς πήρες το path; Επίσης αν έχεις χρόνο, ρίξε μία ματιά στο επόμενο ερώτημά μου, γιατί δε μπορεί να παρσάρει τον πίνακα, μετά το click του defensive.
Lanike71 Δημοσ. 15 Ιανουαρίου 2020 Μέλος Δημοσ. 15 Ιανουαρίου 2020 Τελικά τα κατάφερα μέσω Λαμίας, στη δεύτερη ερώτηση, αλλά τα κατάφερα. Συγκεκριμένα, δεν έπρεπε να στοχεύσω μόνο το <table>, αλλά όλο το div που κρατά το table. Περίεργο αλλά δούλεψε... Όλα καλά λοιπόν.
Στεφανος123 Δημοσ. 18 Ιανουαρίου 2020 Δημοσ. 18 Ιανουαρίου 2020 (επεξεργασμένο) Στις 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. Επεξ/σία 18 Ιανουαρίου 2020 από Στεφανος123
Lanike71 Δημοσ. 19 Ιανουαρίου 2020 Μέλος Δημοσ. 19 Ιανουαρίου 2020 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 δευτερόλεπτα, είναι αρκετά για να φορτώσουν τα πάντα. Θα το διορθώσω, καθώς φαίνεται(είναι) πιο σωστό αυτό που λες.
Στεφανος123 Δημοσ. 24 Ιανουαρίου 2020 Δημοσ. 24 Ιανουαρίου 2020 Στις 19/1/2020 στις 11:54 ΠΜ, Lanike71 είπε Αν και το είδα να χρησιμοποιείται, προτίμησα να παίξω με τη χρονική αναμονή, καθώς θεώρησα ότι 30 δευτερόλεπτα, είναι αρκετά για να φορτώσουν τα πάντα. Θα το διορθώσω, καθώς φαίνεται(είναι) πιο σωστό αυτό που λες. Ναι γιατι σκεψου να χρησιμοποιεις σε πολλα σημεια την αναμονη των 30 δευτερολεπτων, θα αργει πολυ να τελειωνει με αποτελεσμα και να επιβραδυνει ολο το process. Σκεψου να θες να τρεχεις scripts το ενα μετα το αλλο και να χρησιμοποιεις τα 30 δευτερολεπτα. Χανεις την ταχυτητα που προσφερει το Selenium και δεν ειναι efficient.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα