Cara menyimpan dan memuat cookie menggunakan Python + Selenium WebDriver

107

Bagaimana cara menyimpan semua cookie di Selenium WebDriver Python ke file txt, lalu memuatnya nanti? Dokumentasi tidak menjelaskan banyak hal tentang fungsi getCookies.

Aaron Hiniker
sumber

Jawaban:

180

Anda dapat menyimpan cookie saat ini sebagai objek python menggunakan acar. Sebagai contoh:

import pickle
import selenium.webdriver 

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))

dan nanti untuk menambahkannya kembali:

import pickle
import selenium.webdriver 

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)
Ali-Akber Saifee
sumber
1
Saya mendapatkan kesalahan "protokol acar harus <= 2". Menggunakan kode acar yang Anda posting. Apa artinya ini? Apakah itu mengacu pada argumen?
Aaron Hiniker
Apakah ini akan melakukan hal yang sama? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker
1
Hai Aaron, saya telah mengubah sampel sedikit - pada dasarnya tanda 'b' ditambahkan ke bagian buka file. Bisakah kamu mencoba dengan itu?
Ali-Akber Saifee
Kesalahan yang sama, saya tidak terbiasa dengan acar jadi saya tidak yakin apa itu. "tingkatkan ValueError (" protokol acar harus <=% d "% HIGHEST_PROTOCOL"
Aaron Hiniker
5
Saya punya masalah dengan ini. Ini berfungsi dengan baik namun ketika saya mencoba untuk drive.add_cookiet lagi saya mendapat pesan kesalahan yang mengatakan "kadaluwarsa" kunci tidak valid. Saya menggunakan chromedriver di Mac OS
Solal
55

Ketika Anda membutuhkan cookie dari sesi ke sesi, ada cara lain untuk melakukannya, gunakan opsi Chrome pengguna-data-dir untuk menggunakan folder sebagai profil, saya menjalankan:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")

Anda dapat melakukan di sini login yang memeriksa interaksi manusia, saya melakukan ini dan kemudian cookie yang saya perlukan sekarang setiap kali saya memulai Webdriver dengan folder itu semuanya ada di sana. Anda juga dapat menginstal Ekstensi secara manual dan memilikinya di setiap sesi. Saat saya menjalankan, semua cookie ada di sana:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com") #Now you can see  the cookies, the settings, extensions, etc, and the logins done in the previous session are present here. 

Keuntungannya adalah Anda dapat menggunakan banyak folder dengan pengaturan dan cookie yang berbeda, Ekstensi tanpa perlu memuat, membongkar cookie, menginstal dan mencopot ekstensi, mengubah pengaturan, mengubah login melalui kode, dan dengan demikian tidak ada cara untuk memiliki logika pemutusan program, dll. Juga ini lebih cepat daripada harus melakukan semuanya dengan kode.

Eduard Florinescu
sumber
4
Ini adalah solusi terbaik bagi saya saat berurusan dengan login Google. Di beberapa titik, penggunaan pengembangan saya ditandai sebagai aktivitas yang mencurigakan.
Moshe Stauber
2
@ p1g1n ditandai sebelum atau sesudah menggunakan solusi ini
Eduard Florinescu
3
Maaf, itu ditandai sebelum menggunakan solusi. Sekarang saya tetap login agar tidak ada aktivitas yang mencurigakan.
Moshe Stauber
2
chrome_options = Options()berikan aku name 'Options' is not defined...?
Dan
4
@Dan Anda perlu:from selenium.webdriver.chrome.options import Options
Eduard Florinescu
32

Ingat, Anda hanya dapat menambahkan cookie untuk domain saat ini. Jika Anda ingin menambahkan cookie untuk akun Google Anda, lakukan

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)
Ekssonik
sumber
1
Ini harus ada dalam dokumentasi mereka :(
Tjorriemorrie
1
@Tjorriemorrie selenium-python.readthedocs.io/…
Mauricio Cortazar
3
@MauricioCortazar tidak mengatakan apa-apa tentang persyaratan domain, yang saya maksudkan
Tjorriemorrie
2
@Tjorriemorrie itu manusia biasa, cookie hanya disimpan di domain, bahkan subdomain tidak diizinkan
Mauricio Cortazar
1
Komentar ini tampaknya relevan jika menyangkut beberapa domain yang menggunakan cookie dari domain root. Misalnya, google.com dapat menjadi domain root, dan domain atau subdomain lain yang dimiliki oleh Google dapat menggunakan cookie yang sama. Saya lebih menyukai solusi dari @Eduard Florinescu karena ini (dan alasan lainnya) karena tidak perlu menggunakan browser. Dapatkan sebelum memuat cookie, cookie sudah ada di sana dari direktori data. Sepertinya browser.get tambahan diperlukan di sini sebelum memuat file cookie (sesuai komentar ini), meskipun tidak mengujinya.
Roel Van de Paar
12

Berdasarkan jawaban oleh @Eduard Florinescu tetapi dengan kode yang lebih baru dan impor yang hilang ditambahkan:

$ cat work-auth.py 
#!/usr/bin/python3

# Setup:
# sudo apt-get install chromium-chromedriver
# sudo -H python3 -m pip install selenium

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
chrome_options.add_argument("user-data-dir=chrome-data") 
driver.get('https://www.somedomainthatrequireslogin.com')
time.sleep(30)  # Time to enter credentials
driver.quit()

$ cat work.py 
#!/usr/bin/python3

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
driver.get('https://www.somedomainthatrequireslogin.com')  # Already authenticated
time.sleep(10)
driver.quit()
Roel Van de Paar
sumber
3
Bahan acar tidak berhasil untuk saya. (Ini adalah kedua kalinya saya mencoba menggunakannya.) Jadi saya menggunakan metode Anda yang juga tidak berhasil untuk saya pada awalnya. Perubahan yang harus saya lakukan: Saya harus mengetik chrome_options.add_argument ('no-sandbox') karena masalah yang didokumentasikan di github.com/theintern/intern/issues/878 dan saya harus menjadikan user-data-dir jalur lengkap di lingkungan Windows 10 saya.
Eric Klien
Tidak berfungsi untuk situs web saya yang menyimpan data otentikasi dalam cookie
Wildhammer
12

Hanya sedikit modifikasi untuk kode yang ditulis oleh @Roel Van de Paar, karena semua penghargaan diberikan padanya. Saya menggunakan ini di Windows dan berfungsi dengan sempurna, baik untuk mengatur dan menambahkan cookie:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('chromedriver.exe',options=chrome_options)
driver.get('https://web.whatsapp.com')  # Already authenticated
time.sleep(30)
Jagadeeswara Reddy P.
sumber
2
Bekerja dengan sempurna! Terima kasih telah memposting kode untuk windows! Anda menyelamatkan hari saya!
Anatol
Terima kasih! Sangat sederhana, dan itu membuatku gila untuk sementara waktu. Suara untuk semua orang! :)
MT
0

ini adalah kode yang saya gunakan di windows, Berhasil.

 for item in COOKIES.split(';'):
            name,value = item.split('=',1)
            name=name.replace(' ','').replace('\r','').replace('\n','')
            value = value.replace(' ','').replace('\r','').replace('\n','')
            cookie_dict={  
                    'name':name,
                    'value':value,
                    "domain": "",  # google chrome
                    "expires": "",
                    'path': '/',
                    'httpOnly': False,
                    'HostOnly': False,
                    'Secure': False
                    }
            self.driver_.add_cookie(cookie_dict)
yong kamu
sumber
-2

os saya adalah Windows 10, dan versi chrome adalah 75.0.3770.100. Saya telah mencoba solusi 'user-data-dir', tidak berhasil. coba solusi dari @ Eric Klien juga gagal. akhirnya saya buat setting chrome seperti gambar, berhasil! tapi tidak berhasil di windows server 2012.

pengaturan

masukkan deskripsi gambar di sini

Battlesteed
sumber
4
png tampaknya dalam bahasa yang tidak begitu familiar seperti bahasa Inggris. Harap pastikan bahwa Anda memposting hanya dalam bahasa Inggris.
amonk