วิธีบันทึกและโหลดคุกกี้โดยใช้ Python + Selenium WebDriver


108

ฉันจะบันทึกคุกกี้ทั้งหมดใน Selenium WebDriver ของ Python เป็นไฟล์ txt แล้วโหลดในภายหลังได้อย่างไร เอกสารประกอบไม่ได้บอกอะไรเกี่ยวกับฟังก์ชัน getCookies มากนัก

คำตอบ:


181

คุณสามารถบันทึกคุกกี้ปัจจุบันเป็นวัตถุหลามโดยใช้ผักดอง ตัวอย่างเช่น:

import pickle
import selenium.webdriver 

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

และเพิ่มกลับในภายหลัง:

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
ฉันได้รับข้อผิดพลาด "pickle protocol must be <= 2" ใช้รหัสดองที่คุณโพสต์ สิ่งนี้หมายความว่า? มันอ้างถึงข้อโต้แย้งหรือไม่?
Aaron Hiniker

สิ่งนี้จะทำสิ่งเดียวกันหรือไม่? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker

1
สวัสดีแอรอนฉันได้แก้ไขตัวอย่างเล็กน้อย - โดยทั่วไปแล้วแฟล็ก 'b' ที่เพิ่มเข้าไปในส่วนที่เปิดไฟล์ ลองด้วยได้ไหม
Ali-Akber Saifee

ข้อผิดพลาดเดียวกันฉันไม่คุ้นเคยกับผักดองจึงไม่แน่ใจว่ามันคืออะไร "Raise ValueError (" โปรโตคอลการดองต้อง <=% d "% HIGHEST_PROTOCOL"
Aaron Hiniker

5
ฉันมีปัญหากับเรื่องนี้ มันใช้งานได้ดีอย่างไรก็ตามเมื่อฉันพยายามdrive.add_cookieอีกครั้งฉันได้รับข้อความแสดงข้อผิดพลาดว่าคีย์ "หมดอายุ" ไม่ถูกต้อง ฉันใช้ chromedriver บน Mac OS
Solal

56

เมื่อคุณต้องการคุกกี้จากเซสชันไปยังเซสชันมีวิธีอื่นในการทำเช่นนี้ใช้ตัวเลือก Chrome ตัวเลือกข้อมูลผู้ใช้เพื่อใช้โฟลเดอร์เป็นโปรไฟล์ฉันเรียกใช้:

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

คุณสามารถทำได้ที่นี่การเข้าสู่ระบบที่ตรวจสอบการโต้ตอบของมนุษย์ฉันทำสิ่งนี้แล้วคุกกี้ที่ฉันต้องการตอนนี้ทุกครั้งที่ฉันเริ่ม Webdriver ด้วยโฟลเดอร์นั้นทุกอย่างอยู่ในนั้น คุณยังสามารถติดตั้งส่วนขยายด้วยตนเองและมีในทุกเซสชัน เวลาที่ใช้งาน Secon คุกกี้ทั้งหมดอยู่ที่นั่น:

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. 

ข้อดีคือคุณสามารถใช้หลายโฟลเดอร์ที่มีการตั้งค่าและคุกกี้ที่แตกต่างกันส่วนขยายโดยไม่จำเป็นต้องโหลดยกเลิกการโหลดคุกกี้ติดตั้งและถอนการติดตั้งส่วนขยายเปลี่ยนการตั้งค่าเปลี่ยนการเข้าสู่ระบบผ่านรหัสจึงไม่มีทางที่จะทำให้ตรรกะของโปรแกรมหยุดทำงานได้ ฯลฯ นอกจากนี้ยังเร็วกว่า havin ที่จะทำทุกอย่างด้วยรหัส


4
นี่เป็นทางออกที่ดีที่สุดสำหรับฉันเมื่อจัดการกับการเข้าสู่ระบบของ Google ในบางจุดการใช้งานการพัฒนาของฉันถูกระบุว่าเป็นกิจกรรมที่น่าสงสัย
Moshe Stauber

2
@ p1g1n ถูกตั้งค่าสถานะก่อนหรือหลังการใช้โซลูชันนี้
Eduard Florinescu

3
ขออภัยมีการตั้งค่าสถานะก่อนใช้โซลูชัน ตอนนี้ฉันยังคงล็อกอินอยู่จึงไม่มีกิจกรรมที่น่าสงสัย
Moshe Stauber

2
chrome_options = Options()ให้ฉันname 'Options' is not defined... ?
แดน

4
@ คุณต้อง:from selenium.webdriver.chrome.options import Options
Eduard Florinescu

32

โปรดจำไว้ว่าคุณสามารถเพิ่มคุกกี้สำหรับโดเมนปัจจุบันเท่านั้น หากคุณต้องการเพิ่มคุกกี้สำหรับบัญชี Google ของคุณให้ทำ

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

1
สิ่งนี้ควรอยู่ในเอกสารของพวกเขา :(
Tjorriemorrie


3
@MauricioCortazar มันไม่ได้พูดอะไรเกี่ยวกับข้อกำหนดโดเมนซึ่งเป็นสิ่งที่ฉันอ้างถึง
Tjorriemorrie

2
@Tjorriemorrie เป็นคนพื้นฐานคุกกี้จะถูกเก็บไว้ในโดเมนเท่านั้นแม้แต่โดเมนย่อยก็ไม่อนุญาต
Mauricio Cortazar

1
ความคิดเห็นนี้ดูเหมือนจะเกี่ยวข้องกับหลายโดเมนโดยใช้คุกกี้จากโดเมนราก ตัวอย่างเช่น google.com อาจเป็นโดเมนรากและโดเมนหรือโดเมนย่อยอื่นที่ Google เป็นเจ้าของสามารถใช้คุกกี้เดียวกันได้ ฉันชอบวิธีแก้ปัญหาโดย @Eduard Florinescu ดีกว่าเพราะเหตุนี้ (และเหตุผลอื่น ๆ ) เนื่องจากไม่จำเป็นต้องใช้เบราว์เซอร์รับก่อนโหลดคุกกี้พวกเขาอยู่ที่นั่นแล้วจาก dir ข้อมูล ดูเหมือนว่าจำเป็นต้องใช้ browser.get เพิ่มเติมที่นี่ก่อนที่จะโหลดไฟล์คุกกี้ (ตามความคิดเห็นนี้) แม้ว่าจะไม่ได้ทดสอบก็ตาม
Roel Van de Paar

12

อ้างอิงจากคำตอบของ @Eduard Florinescu แต่มีรหัสใหม่กว่าและเพิ่มการนำเข้าที่ขาดหายไป:

$ 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
ของดองไม่ได้ผลสำหรับฉัน (นี่เป็นครั้งที่สองที่ฉันได้ลองใช้มัน) ฉันจึงใช้วิธีของคุณซึ่งก็ไม่ได้ผลสำหรับฉันในตอนแรก การเปลี่ยนแปลงที่ฉันต้องทำ: ฉันต้องพิมพ์ chrome_options.add_argument ('no-sandbox') เนื่องจากปัญหาที่บันทึกไว้ที่github.com/theintern/intern/issues/878และฉันต้องทำให้ user-data-dir เป็นเส้นทางแบบเต็ม ในสภาพแวดล้อม Windows 10 ของฉัน
Eric Klien

ไม่ทำงานกับเว็บไซต์ของฉันที่เก็บข้อมูลการตรวจสอบสิทธิ์ในคุกกี้
Wildhammer

12

เพียงแค่ปรับเปลี่ยนโค้ดเล็กน้อยที่เขียนโดย @Roel Van de Paar เนื่องจากเครดิตทั้งหมดตกเป็นของเขา ฉันใช้สิ่งนี้ใน Windows และทำงานได้อย่างสมบูรณ์ทั้งสำหรับการตั้งค่าและเพิ่มคุกกี้:

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
ทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณสำหรับการโพสต์รหัสสำหรับ windows! คุณช่วยวันของฉัน!
Anatol

ขอบคุณ! ง่ายมากและมันทำให้ฉันบ้าไปพักหนึ่งแล้ว อัพโหวตทุกคน! :)
MT

0

นี่คือรหัสที่ฉันใช้ใน windows มันใช้งานได้

 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

ระบบปฏิบัติการของฉันคือ Windows 10 และ Chrome เวอร์ชัน 75.0.3770.100 ฉันได้ลองใช้โซลูชัน 'user-data-dir' แล้วไม่ได้ผล ลองวิธีแก้ปัญหาของ @ Eric Klien ก็ล้มเหลวเช่นกัน ในที่สุดฉันก็ตั้งค่าโครเมี่ยมเหมือนในภาพมันใช้งานได้! แต่มันไม่ทำงานบน windows server 2012

การตั้งค่า

ใส่คำอธิบายภาพที่นี่


4
png ดูเหมือนจะเป็นภาษาที่ไม่ค่อยคุ้นเคยเท่าภาษาอังกฤษ โปรดตรวจสอบให้แน่ใจว่าคุณโพสต์เป็นภาษาอังกฤษเท่านั้น
amonk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.