PythonからSeleniumがエクスポートしたCookieからCookieをリクエストセッションにロードしようとしていますが、ロードすると次のエラーが返されます: "'list'オブジェクトには属性 'extract_cookies'がありません"
def load_cookies(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
initial_state= requests.Session()
initial_state.cookies=load_cookies(time_cookie_file)
search_requests = initial_state.get(search_url)
これはどこでも機能するはずですが、私のCookieは辞書のリストであり、すべてのCookieが何であるかを理解しているので、これがSeleniumで機能すると思います。しかし、何らかの理由でそれはリクエストでは機能しません、この点でのすべての助けは本当に素晴らしいでしょう、それは私が明白な何かを逃しているように感じます!
クッキーは、以下を使用してSeleniumからダンプされました。
with open("Filepath.pkl", 'wb') as f:
pickle.dump(driver.get_cookies(), f)
Cookieの例は(少し難読化されています):
[{'domain': '.website.com',
'expiry': 1640787949,
'httpOnly': False,
'name': '_ga',
'path': '/',
'secure': False,
'value': 'GA1.2.1111111111.1111111111'},
{'domain': 'website.com',
'expiry': 1585488346,
'httpOnly': False,
'name': '__pnahc',
'path': '/',
'secure': False,
'value': '0'}]
以下の回答に従ってCookieを読み込むことができましたが、Cookieが何も記憶されていないため、正しく読み込まれていないようです。ただし、Seleniumを参照しているときにCookieを読み込むと、正常に機能します。
Cookie
HTTPリクエストヘッダーには、以前にサーバーからHTTP cookie
ヘッダーとともに送信された保存済みのSet-Cookie
が含まれています。 HTTP cookie は、サーバーがユーザーのWebブラウザーに送信する小さなデータです。ブラウザはcookiesを保存し、次のリクエストで同じサーバーに送り返す場合があります。通常、 cookies は、2つのリクエストが同じブラウザから送信されたかどうかを示し、ユーザーのログインを維持します。
Selenium を使用したCookieの使用法を示すために、ユーザーがWebサイトにログインした後 pickle を使用してCookieを保存しました http://demo.guru99.com /test/cookie/Selenium_aut.php 。次のステップでは、同じWebサイトを開き、Cookieを追加して、ログインしたユーザーとしてアクセスできるようにしました。
Cookieを保存するためのコードブロック:
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"))
保存されたCookieを自動認証に使用するためのコードブロック:
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')
session および requests を使用してCookieの使用法を示すために、サイトにアクセスしました https://www.google.com 、の新しい辞書を追加しましたクッキー:
{'name':'my_own_cookie','value': 'debanjan' ,'domain':'.stackoverflow.com'}
次に、同じrequestsセッションを使用して、次のように成功した別のリクエストを送信しました。
コードブロック:
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)
コンソール出力:
Original Cookies
<RequestsCookieJar[<Cookie 1P_JAR=2020-01-21-14 for .google.com/>, <Cookie NID=196=NvZMMRzKeV6VI1xEqjgbzJ4r_3WCeWWjitKhllxwXUwQcXZHIMRNz_BPo6ujQduYCJMOJgChTQmXSs6yKX7lxcfusbrBMVBN_qLxLIEah5iSBlkdBxotbwfaFHMd-z5E540x02-YZtCm-rAIx-MRCJeFGK2E_EKdZaxTw-StRYg for .google.com/>]>
==========
After new Cookie added
<RequestsCookieJar[<Cookie domain=.stackoverflow.com for />, <Cookie name=my_own_cookie for />, <Cookie value=debanjan for />, <Cookie 1P_JAR=2020-01-21-14 for .google.com/>, <Cookie NID=196=NvZMMRzKeV6VI1xEqjgbzJ4r_3WCeWWjitKhllxwXUwQcXZHIMRNz_BPo6ujQduYCJMOJgChTQmXSs6yKX7lxcfusbrBMVBN_qLxLIEah5iSBlkdBxotbwfaFHMd-z5E540x02-YZtCm-rAIx-MRCJeFGK2E_EKdZaxTw-StRYg for .google.com/>]>
明らかに、新しく追加されたCookieの辞書{'name':'my_own_cookie','value': 'debanjan' ,'domain':'.stackoverflow.com'}
は、2番目のリクエストでほとんど使用されています。
これで、ユースケースがSeleniumCookieをPythonリクエストに渡すことである場合、次のソリューションを使用できます。
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)
Cookieを取得し、名前/値のみを使用できます。ヘッダーも必要です。それらは、開発ツールから、またはプロキシを使用して取得できます。
基本的な例:
driver.get('https://website.com/')
# ... login or do anything
cookies = {}
for cookie in driver.get_cookies():
cookies[cookie['name']] = cookie['value']
# Write to a file if need or do something
# import json
# with open("cookies.txt", 'w') as f:
# f.write(json.dumps(cookies))
そして使用法:
# Read cookies from file as Dict
# with open('cookies.txt') as reader:
# cookies = json.loads(reader.read())
# use cookies
response = requests.get('https://website.com/', headers=headers, cookies=cookies)
Stackoverflowヘッダーの例では、一部のヘッダーは必要な場合と不要な場合があります。あなたは情報を見つけることができます ここ と ここ 。開発ツールの[ネットワーク]タブを使用してリクエストヘッダーを取得できます。
headers = {
'authority': 'stackoverflow.com',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'dnt': '1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36',
'sec-fetch-user': '?1',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'sec-fetch-site': 'same-Origin',
'sec-fetch-mode': 'navigate',
'referer': 'https://stackoverflow.com/questions/tagged?sort=Newest&tagMode=Watched&uqlId=8338',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'ru,en-US;q=0.9,en;q=0.8,tr;q=0.7',
}
セッションを作成できます。セッションクラスは、リクエスト間のCookieを処理します。
s = requests.Session()
login_resp = s.post('https://example.com/login', login_data)
self.cookies = self.login_resp.cookies
cookiedictreceived = {}
cookiedictreceived=requests.utils.dict_from_cookiejar(self.login_resp.cookies)
リクエストはhttp.cookiejar.CookieJar
オブジェクトも受け入れます。
https://docs.python.org/3.8/library/http.cookiejar.html#cookiejar-and-filecookiejar-objects
したがって、リクエストでは、Cookie内のすべての「値」を文字列にする必要があります。おそらく「キー」と同じです。また、関数load_cookies
が返すため、Cookieはリストを必要としません。 cookies = requests.utils.cookiejar_from_dict(...
を使用してrequest.utilsに対してCookieを作成できます。
Seleniumで " https://stackoverflow.com/ "にアクセスし、完了したとおりにCookieを保存するとします。
from Selenium import webdriver
import pickle
import requests
#Go to the website
driver = webdriver.Chrome(executable_path=r'C:\Path\\To\\Your\\chromedriver.exe')
driver.get('https://stackoverflow.com/')
#Save the cookies in a file
with open("C:\Path\To\Your\Filepath.pkl", 'wb') as f:
pickle.dump(driver.get_cookies(), f)
driver.quit()
#you function to get the cookies from the file.
def load_cookies(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
saved_cookies_list = load_cookies("C:\Path\To\Your\Filepath.pkl")
#Set request session
initial_state = requests.Session()
#Function to fix cookie values and add cookies to request_session
def fix_cookies_and_load_to_requests(cookie_list, request_session):
for index in range(len(cookie_list)):
for item in cookie_list[index]:
if type(cookie_list[index][item]) != str:
print("Fix cookie value: ", cookie_list[index][item])
cookie_list[index][item] = str(cookie_list[index][item])
cookies = requests.utils.cookiejar_from_dict(cookie_list[index])
request_session.cookies.update(cookies)
return request_session
initial_state_with_cookies = fix_cookies_and_load_to_requests(cookie_list=saved_cookies_list, request_session=initial_state)
search_requests = initial_state_with_cookies.get("https://stackoverflow.com/")
print("search_requests:", search_requests)