我使用两个不同的模块来编写代码。 我使用dryscrape登录netflix,而不是使用请求来执行其他操作。然而,使用dryscrape我能够使用session.cookies()获得一堆cookie,它返回了一系列cookie。所以我试图使用请求库将这些cookie传递给请求。
但是,我目前遇到了一个问题。请求包含cookie的字典,我做了。
少说话,这里是简化这种情况的代码..
这是我使用dryscrape Session.cookies()
获得的cookie格式["NetflixCookies=true; domain=.netflix.com; path=/", "hcVisitorId=b0ada616-e472-4a89-9bd6-35c6adbdf48a; expires=Sat, 26-Nov-2016 07:30:55 GMT; domain=.help.netflix.com; path=/", "cL=1448609468009%7C144860945956982159%7C144860945964708782%7C%7C5%7C; domain=.www.netflix.com; path=/", "netflixHelpCenterLocale=en-US; domain=.help.netflix.com; path=/", "JSESSIONID=8641E508022EEE2E146073D62A320319; HttpOnly; domain=help.netflix.com; path=/", "memclid=b0ada616-e472-4a89-9bd6-35c6adbdf48a; expires=Sat, 26-Nov-2016 07:31:03 GMT; domain=.netflix.com; path=/"]
但是请求只接受字典,所以我做了
cookies_info = dict(cookies_are= ''.join(cookies))
print cookies_info
search_query = 'Sons of Anarchy'
second_requests = requests.get('http://www.netflix.com/search/'+search_query,cookies=cookies_info).text
它对我来说根本不起作用,它不会登录到netflix,并要求我登录这样做。我假设它与我合适地以适当的格式传递cookie!
答案 0 :(得分:2)
您有一个包含Set-Cookie
标题结果的列表。它们包含键值对以及一些元数据。
例如,您的第一个Cookie标头是:
NetflixCookies=true; domain=.netflix.com; path=/
它告诉浏览器您的Cookie名称为NetflixCookies
,其值为true
,并且只有在联系netflix.com
域中的服务器时才能使用Cookie,以/
(整个服务器)开头的路径。
但是,当您将 Cookie发送回服务器时,不需要所有元数据。您只发送键值对。因此,cookies
方法的requests
参数采用这些键值对的字典,而不是元数据。因此,对于上述cookie,您可以使用:
cookies = {'NetflixCookies': 'true'}
对于其他Cookie,您必须提取其Cookie名称和值,并将这些名称用作字典中的键。
要解析标题,您可以使用cookilib.parse_ns_headers()
函数;它返回一个包含元组对每个标题的列表;第一个元组是你的键值对:
>>> from cookielib import parse_ns_headers
>>> cookies = ["NetflixCookies=true; domain=.netflix.com; path=/", "hcVisitorId=b0ada616-e472-4a89-9bd6-35c6adbdf48a; expires=Sat, 26-Nov-2016 07:30:55 GMT; domain=.help.netflix.com; path=/", "cL=1448609468009%7C144860945956982159%7C144860945964708782%7C%7C5%7C; domain=.www.netflix.com; path=/", "netflixHelpCenterLocale=en-US; domain=.help.netflix.com; path=/", "JSESSIONID=8641E508022EEE2E146073D62A320319; HttpOnly; domain=help.netflix.com; path=/", "memclid=b0ada616-e472-4a89-9bd6-35c6adbdf48a; expires=Sat, 26-Nov-2016 07:31:03 GMT; domain=.netflix.com; path=/"]
>>> for result in parse_ns_headers(cookies):
... print result[0]
...
('NetflixCookies', 'true')
('hcVisitorId', 'b0ada616-e472-4a89-9bd6-35c6adbdf48a')
('cL', '1448609468009%7C144860945956982159%7C144860945964708782%7C%7C5%7C')
('netflixHelpCenterLocale', 'en-US')
('JSESSIONID', '8641E508022EEE2E146073D62A320319')
('memclid', 'b0ada616-e472-4a89-9bd6-35c6adbdf48a')
您可以将结果直接放入字典中:
cookie_dictionary = dict(res[0] for res in parse_ns_headers(session_cookies))
对于您的具体示例,这会产生:
>>> dict(res[0] for res in parse_ns_headers(cookies))
{'memclid': 'b0ada616-e472-4a89-9bd6-35c6adbdf48a', 'cL': '1448609468009%7C144860945956982159%7C144860945964708782%7C%7C5%7C', 'NetflixCookies': 'true', 'JSESSIONID': '8641E508022EEE2E146073D62A320319', 'hcVisitorId': 'b0ada616-e472-4a89-9bd6-35c6adbdf48a', 'netflixHelpCenterLocale': 'en-US'}
>>> from pprint import pprint
>>> pprint(_)
{'JSESSIONID': '8641E508022EEE2E146073D62A320319',
'NetflixCookies': 'true',
'cL': '1448609468009%7C144860945956982159%7C144860945964708782%7C%7C5%7C',
'hcVisitorId': 'b0ada616-e472-4a89-9bd6-35c6adbdf48a',
'memclid': 'b0ada616-e472-4a89-9bd6-35c6adbdf48a',
'netflixHelpCenterLocale': 'en-US'}