Cách lưu và tải cookie bằng Python + Selenium WebDriver


106

Làm cách nào để lưu tất cả cookie trong Selenium WebDriver của Python vào tệp txt, rồi tải chúng sau? Tài liệu không nói nhiều về hàm getCookies.

Câu trả lời:


179

Bạn có thể lưu cookie hiện tại dưới dạng đối tượng python bằng cách sử dụng pickle. Ví dụ:

import pickle
import selenium.webdriver 

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

và sau đó để thêm lại chúng:

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
Tôi nhận được lỗi "giao thức dưa chua phải <= 2". Sử dụng mã dưa bạn đã đăng. Điều đó có nghĩa là gì? Nó đề cập đến các đối số?
Aaron Hiniker

Điều này sẽ làm điều tương tự? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker

1
Xin chào Aaron, tôi đã sửa đổi mẫu một chút - về cơ bản cờ 'b' đã được thêm vào các phần mở tệp. Bạn có thể thử với điều đó?
Ali-Akber Saifee

Cùng một lỗi, mình không rành về dưa chua nên không rõ là bị gì. "raise ValueError (" giao thức pickle phải <=% d "% HIGHEST_PROTOCOL"
Aaron Hiniker 25/02/13

5
Tôi có một vấn đề với điều này. Nó hoạt động tốt tuy nhiên khi tôi thử drive.add_cookielại lần nữa, tôi nhận được thông báo lỗi cho biết khóa "hết hạn" không hợp lệ. Tôi đang sử dụng chromedriver trên Mac OS
Solal

55

Khi bạn cần cookie từ phiên này sang phiên khác, có một cách khác để thực hiện, sử dụng tùy chọn user-data-dir của Chrome để sử dụng các thư mục làm hồ sơ, tôi chạy:

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

Bạn có thể thực hiện ở đây các thông tin đăng nhập để kiểm tra sự tương tác của con người, tôi làm điều này và sau đó là các cookie tôi cần bây giờ mỗi khi tôi khởi động Webdriver với thư mục đó, mọi thứ đều có trong đó. Bạn cũng có thể cài đặt các Tiện ích mở rộng theo cách thủ công và có chúng trong mỗi phiên. Tôi chạy vài giây, tất cả cookie đều ở đó:

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. 

Ưu điểm là bạn có thể sử dụng nhiều thư mục với các cài đặt và cookie khác nhau, Tiện ích mở rộng mà không cần tải, dỡ cookie, cài đặt và gỡ cài đặt Tiện ích mở rộng, thay đổi cài đặt, thay đổi thông tin đăng nhập qua mã và do đó không có cách nào để có logic của chương trình bị ngắt, vv Ngoài ra, điều này nhanh hơn havin làm tất cả bằng mã.


4
Đây là giải pháp tốt nhất cho tôi khi xử lý thông tin đăng nhập Google. Tại một số thời điểm, việc sử dụng phát triển của tôi bị gắn cờ là hoạt động đáng ngờ.
Moshe Stauber

2
@ p1g1n đã được gắn cờ trước hoặc sau khi sử dụng giải pháp này
Eduard Florinescu

3
Xin lỗi, nó đã được gắn cờ trước khi sử dụng giải pháp. Bây giờ tôi vẫn đăng nhập để không có hoạt động đáng ngờ.
Moshe Stauber

2
chrome_options = Options()cho tôi name 'Options' is not defined...?
Dan

4
@ Bạn có cần:from selenium.webdriver.chrome.options import Options
Eduard Florinescu

32

Hãy nhớ rằng, bạn chỉ có thể thêm cookie cho miền hiện tại. Nếu bạn muốn thêm cookie cho tài khoản Google của mình, hãy

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)

1
Điều này phải có trong tài liệu của họ :(
Tjorriemorrie Ngày


3
@MauricioCortazar nó nói gì về yêu cầu tên miền, đó là những gì tôi đã đề cập đến
Tjorriemorrie

2
@Tjorriemorrie đó là người đàn ông cơ bản, các tập tin cookie chỉ được lưu trữ trong phạm vi, thậm chí tên miền phụ không được phép
Mauricio Cortazar

1
Nhận xét này có vẻ phù hợp khi nói đến nhiều miền sử dụng cookie từ miền gốc. Ví dụ: google.com có ​​thể là miền gốc và một miền hoặc miền phụ khác do Google sở hữu có thể sử dụng cùng một cookie. Tôi thích giải pháp của @Eduard Florinescu hơn vì lý do này (và các lý do khác) vì nó không yêu cầu sử dụng browser.get trước khi tải cookie, chúng chỉ ở đó từ dir dữ liệu. Có vẻ như cần có browser.get bổ sung ở đây trước khi tải tệp cookie (theo nhận xét này), mặc dù đã không kiểm tra nó.
Roel Van de Paar

12

Dựa trên câu trả lời của @Eduard Florinescu nhưng với mã mới hơn và nhập bị thiếu được thêm vào:

$ 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
Những thứ dưa chua không phù hợp với tôi. (Đây là lần thứ hai tôi thử sử dụng nó.) Vì vậy, tôi đã sử dụng phương pháp của bạn mà lúc đầu cũng không hiệu quả với tôi. Những thay đổi tôi phải thực hiện: Tôi phải nhập chrome_options.add_argument ('no-sandbox') do sự cố được ghi lại tại github.com/theintern/intern/issues/878 và tôi phải đặt user-data-dir thành một đường dẫn đầy đủ trong môi trường Windows 10 của tôi.
Eric Klien

Không hoạt động cho trang web lưu trữ dữ liệu xác thực trong cookie của tôi
Wildhammer

12

Chỉ là một sửa đổi nhỏ đối với mã do @Roel Van de Paar viết, vì tất cả tín dụng đều thuộc về anh ta. Tôi đang sử dụng cái này trong Windows và nó đang hoạt động hoàn hảo, cho cả việc thiết lập và thêm 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
Hoạt động hoàn hảo! Cảm ơn bạn đã đăng mã cho windows! Bạn đã cứu ngày của tôi!
Anatol

Cảm ơn! Thật đơn giản, và nó đã khiến tôi phát điên trong một thời gian. Lên bình chọn cho mọi người! :)
MT

0

đây là mã tôi đã sử dụng trong windows, Nó hoạt động.

 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

hệ điều hành của tôi là Windows 10 và phiên bản chrome là 75.0.3770.100. Tôi đã thử giải pháp 'user-data-dir', không hoạt động. thử giải pháp của @ Eric Klien cũng không thành công. cuối cùng, tôi thực hiện cài đặt chrome như hình, nó hoạt động! nhưng nó không hoạt động trên windows server 2012.

cài đặt

nhập mô tả hình ảnh ở đây


4
png dường như là một ngôn ngữ không quá quen thuộc như tiếng Anh. Vui lòng đảm bảo rằng bạn chỉ đăng bài bằng tiếng Anh.
amonk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.