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.

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)

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.


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)

1
Ini harus ada dalam dokumentasi mereka :(
Tjorriemorrie


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()

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)

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)

-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


4
png tampaknya dalam bahasa yang tidak begitu familiar seperti bahasa Inggris. Harap pastikan bahwa Anda memposting hanya dalam bahasa Inggris.
amonk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.