Error when loading cookies into a Python request session

前端 未结 6 1970
鱼传尺愫
鱼传尺愫 2020-11-27 08:00

I am trying to load cookies into my request session in Python from selenium exported cookies, however when I do it returns the following error: \"\'list\' object has no attr

6条回答
  •  旧巷少年郎
    2020-11-27 08:43

    Cookie

    The Cookie HTTP request header contains stored HTTP cookie previously sent by the server with the Set-Cookie header. A HTTP cookie is a small piece of data that a server sends to the user's web browser. The browser may store the cookies and send it back with the next request to the same server. Typically, cookies to tell if two requests came from the same browser, keeping the user logged in.


    Demonstration using Selenium

    To demonstrate the usage of cookies using Selenium we have stored the cookies using pickle once the user had logged into the website http://demo.guru99.com/test/cookie/selenium_aut.php. In the next step, we opened the same website, adding the cookies and was able to land as a logged in user.

    • Code Block to store the cookies:

      from selenium import webdriver
      import pickle
      
      options = webdriver.ChromeOptions() 
      options.add_argument("start-maximized")
      options.add_experimental_option("excludeSwitches", ["enable-automation"])
      options.add_experimental_option('useAutomationExtension', False)
      driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get('http://demo.guru99.com/test/cookie/selenium_aut.php')
      driver.find_element_by_name("username").send_keys("abc123")
      driver.find_element_by_name("password").send_keys("123xyz")
      driver.find_element_by_name("submit").click()
      pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))
      
    • Code Block to use the stored cookies for automatic authentication:

      from selenium import webdriver
      import pickle
      
      options = webdriver.ChromeOptions() 
      options.add_argument("start-maximized")
      options.add_experimental_option("excludeSwitches", ["enable-automation"])
      options.add_experimental_option('useAutomationExtension', False)
      driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get('http://demo.guru99.com/test/cookie/selenium_aut.php')
      cookies = pickle.load(open("cookies.pkl", "rb"))
      for cookie in cookies:
          driver.add_cookie(cookie)
      driver.get('http://demo.guru99.com/test/cookie/selenium_cookie.php')
      

    Demonstration using Requests

    To demonstrate usage of cookies using session and requests we have accessed the site https://www.google.com, added a new dictionary of cookies:

    {'name':'my_own_cookie','value': 'debanjan' ,'domain':'.stackoverflow.com'}
    

    Next, we have used the same requests session to send another request which was successful as follows:

    • Code Block:

      import requests
      
      s1 = requests.session()
      s1.get('https://www.google.com')
      print("Original Cookies")
      print(s1.cookies)
      print("==========")
      cookie = {'name':'my_own_cookie','value': 'debanjan' ,'domain':'.stackoverflow.com'}
      s1.cookies.update(cookie)
      print("After new Cookie added")
      print(s1.cookies)
      
    • Console Output:

      Original Cookies
      , ]>
      ==========
      After new Cookie added
      , , , , ]>
      

    Conclusion

    Clearly, the newly added dictionary of cookies {'name':'my_own_cookie','value': 'debanjan' ,'domain':'.stackoverflow.com'} is pretty much in use within the second request.


    Passing Selenium Cookies to Python Requests

    Now, if your usecase is to passing Selenium Cookies to Python Requests, you can use the following solution:

    from selenium import webdriver
    import pickle
    import requests
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get('http://demo.guru99.com/test/cookie/selenium_aut.php')
    driver.find_element_by_name("username").send_keys("abc123")
    driver.find_element_by_name("password").send_keys("123xyz")
    driver.find_element_by_name("submit").click()
    
    # Storing cookies through Selenium
    pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))
    driver.quit()
    
    # Passing cookies to Session
    session = requests.session()  # or an existing session
    with open('cookies.pkl', 'rb') as f:
        session.cookies.update(pickle.load(f))
    search_requests = session.get('https://www.google.com/')
    print(session.cookies)
    

提交回复
热议问题