使用python将google docs公共电子表格下载到csv

deb*_*uti 11 python google-sheets

我可以用wget下载google docs csv:

wget --no-check-certificate --output-document=locations.csv 'https://docs.google.com/spreadsheet/ccc?key=0ArM5yzzCw9IZdEdLWlpHT1FCcUpYQ2RjWmZYWmNwbXc&output=csv'
Run Code Online (Sandbox Code Playgroud)

但是我不能用python下载相同的csv:

import urllib2

request = urllib2.Request('https://docs.google.com/spreadsheet/ccc?key=0ArM5yzzCw9IZdEdLWlpHT1FCcUpYQ2RjWmZYWmNwbXc&output=csv')
request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1284.0 Safari/537.13')
opener = urllib2.build_opener()
data = opener.open(request).read()
print(data)
Run Code Online (Sandbox Code Playgroud)

结果是谷歌登录页面.我究竟做错了什么?

Jay*_*eis 18

只需使用请求,它比使用urllib更好.

试试这个.

import requests
response = requests.get('https://docs.google.com/spreadsheet/ccc?key=0ArM5yzzCw9IZdEdLWlpHT1FCcUpYQ2RjWmZYWmNwbXc&output=csv')
assert response.status_code == 200, 'Wrong status code'
print(response.content)
Run Code Online (Sandbox Code Playgroud)

  • nitpick:您应该使用`response.raise_for_status()`而不是断言`response.status_code == 200`,原因很简单,当使用优化标志运行python时,`assert`语句被删除. (4认同)

Don*_*ing 11

你没有存储cookie.

首先让我说我完全支持使用最优秀的requests的建议.

但是,如果您需要在vanilla Python 2中执行此操作,问题在于Google通过HTTP 302重定向将您弹出,并且它希望您记住它为每个响应设置的cookie.当它检测到您没有存储cookie时,会将您重定向到登录页面.

默认情况下,urllib2.urlopen(或从中返回的开启者build_opener)将遵循302重定向,但它不会存储HTTP cookie.你必须教你的开场白如何做到这一点.像这样:

>>> from cookielib import CookieJar
>>> from urllib2 import build_opener, HTTPCookieProcessor
>>> opener = build_opener(HTTPCookieProcessor(CookieJar()))
>>> resp = opener.open('https://docs.google.com/spreadsheet/ccc?key=0ArM5yzzCw9IZdEdLWlpHT1FCcUpYQ2RjWmZYWmNwbXc&output=csv')
>>> data = resp.read()
Run Code Online (Sandbox Code Playgroud)

同样,requests尽可能使用,但如果不可能,标准库可以完成工作.