質問

I'm trying to write a script to programmatically login to Google Finance, view my portfolio and then display results on my desktop. I'm using the requests module, currently stuck on the 'login' part.

I keep getting this error requests.cookies.CookieConflictError: There are multiple cookies with name, 'APISID'

Here is the entire script, the error throws on line 48. I'm guessing it has something to do with requests keep-alive and the connection isn't recycling properly?

#!/usr/bin/env python

import getpass
import re
import requests

email = raw_input("Enter your Google username: ")
password = getpass.getpass("Enter your password: ")

session = requests.Session()

# Define URLs
login_page_url = 'https://accounts.google.com/ServiceLogin?passive=true&service=finance'
authenticate_url = 'https://accounts.google.com/ServiceLoginAuth?service=finance'
gf_home_page_url = 'http://www.google.com/finance/portfolio'

login_page_contents = session.get(login_page_url).text

# Find GALX value
galx_match_obj = re.search(r'name="GALX"\s*value="([^"]+)"', login_page_contents, re.IGNORECASE)
galx_value = galx_match_obj.group(1) if galx_match_obj.group(1) is not None else ''

# Find DSH value
dsh_match_obj = re.search(r'id="dsh"\s*value="([^"]+)"', login_page_contents, re.IGNORECASE)
dsh_value = dsh_match_obj.group(1) if dsh_match_obj.group(1) is not None else ''

# Set up login credentials
login_params = {
   'Email': email,
   'Passwd': password,
   'continue': 'http://www.google.com/finance/portfolio',
   'followup': 'http://www.google.com/finance/portfolio',
   'service': 'finance',
   'GALX': galx_value,
   'pstMsg': 0,
   'dnConn': '',
   'checkConnection': '',
   'timeStmp': '',
   'secTok': '',
   'bgresponse': 'js_disabled',
   'PersistentCookie': 'yes'
}

print galx_value
print dsh_value

# Login
r = session.post(authenticate_url, params=login_params) # <- Error thrown here
print r.text
exit

Traceback:

Traceback (most recent call last):
  File "crawl.py", line 48, in <module>
    r = session.post(authenticate_url, params=login_params)
  File "/Users/nathan/Development/Scripts/google-finance-crawler/requests/sessions.py", line 358, in post
    return self.request('POST', url, data=data, **kwargs)
  File "/Users/nathan/Development/Scripts/google-finance-crawler/requests/sessions.py", line 312, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/nathan/Development/Scripts/google-finance-crawler/requests/sessions.py", line 426, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "/Users/nathan/Development/Scripts/google-finance-crawler/requests/sessions.py", line 163, in resolve_redirects
    resp.cookies.update(cookiejar)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_abcoll.py", line 494, in update
    self[key] = other[key]
  File "/Users/nathan/Development/Scripts/google-finance-crawler/requests/cookies.py", line 246, in __getitem__
    return self._find_no_duplicates(name)
  File "/Users/nathan/Development/Scripts/google-finance-crawler/requests/cookies.py", line 285, in _find_no_duplicates
    raise CookieConflictError('There are multiple cookies with name, %r' % (name))
requests.cookies.CookieConflictError: There are multiple cookies with name, 'APISID'
役に立ちましたか?

解決

It's a bug in requests, see issue 1189.

The current proposed fix is to simply delete line 163 of requests/sessions.py:

resp.cookies.update(cookiejar)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top