传递cookie python请求

时间:2015-11-27 08:29:43

标签: python cookies python-requests

我使用两个不同的模块来编写代码。 我使用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!

1 个答案:

答案 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'}