我正在寻找一种简单的方法来保存csv文件从已发布的谷歌文档表起源? 由于它的出版,它是通过直接链接(在下面的例子中修改于目的)访问。
我所有的浏览器会提示我尽快保存csv文件,我启动的链接。
无论是:
DOC_URL = 'https://docs.google.com/spreadsheet/ccc?key=0AoOWveO-dNo5dFNrWThhYmdYW9UT1lQQkE&output=csv'
f = urllib.request.urlopen(DOC_URL)
cont = f.read(SIZE)
f.close()
cont = str(cont, 'utf-8')
print(cont)
,也不:
req = urllib.request.Request(DOC_URL)
req.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')
f = urllib.request.urlopen(req)
print(f.read().decode('utf-8'))
打印任何东西,但HTML内容。
(试过第二版阅读本其他职位后: 下载谷歌文档电子表格公众与蟒蛇到csv )。
什么我做错了任何想法? 我登录了我的谷歌帐户,如果这一点,实在值得任何东西,但我没有尝试过任何浏览器的工作原理。 据我了解,谷歌文档API尚未移植关于Python 3并给予我个人使用的小项目的“玩具”的大小,它甚至没有什么太大的意义,从一开始走,如果用它我可以绕过它。
在第2次尝试,我离开了“用户代理”,因为我想,也许请求看作从脚本来(B / C没有身份信息存在的话)可能被忽略,但它并没有发挥作用。
谷歌回应了一系列的cookie设置302个重定向的初始请求。 如果不保存并重新提交请求之间的饼干,它重定向到登录页面。
所以,这个问题是不是与User-Agent头,这是在默认情况下,事实urllib.request.urlopen
不存储cookie,但会遵循HTTP 302个重定向。
下面的代码工作得很好,在上按指定的位置提供一个公共的电子表格DOC_URL
:
>>> from http.cookiejar import CookieJar
>>> from urllib.request import build_opener, HTTPCookieProcessor
>>> opener = build_opener(HTTPCookieProcessor(CookieJar()))
>>> resp = opener.open(DOC_URL)
>>> # should really parse resp.getheader('content-type') for encoding.
>>> csv_content = resp.read().decode('utf-8')
已经展示了如何做到这一点的香草蟒蛇,现在我会说的正确方法™去这是使用最优秀的请求库 。 这是非常有据可查 ,使这些各种各样的任务极其愉快的完成。
例如,为了获得同样的csv_content
如上使用requests
库是简单的:
>>> import requests
>>> csv_content = requests.get(DOC_URL).text
这一条线更清晰地表达你的意图。 它更容易写,更容易阅读。 请你-和其他人谁共享你的代码-一个忙,只是使用requests
。
虽然requests
库是从Python的HTTP请求的黄金标准,这种风格下载的是(虽然尚未过时)不可能持续,具体指的是使用环节,管理cookie和重定向等。其中的原因不喜欢的链接是它的安全性较低,一般这样的访问应该需要授权。 相反,谷歌出口作为表CSV目前公认的方法是使用 谷歌云端硬盘API 。
那么,为什么驱动器API? 这难道不应该是后话, 表API呢? 那么,床单API是用于电子表格取向的功能,即,数据格式,列调整大小,创建图表,细胞验证等,而驱动器API是文件取向的功能,即,导入/导出,复制,重命名,等等
下面是一个完整的CMD线的解决方案 。 (如果你不这样做的Python,你可以把它当作伪代码,并选择由支持的任何语言谷歌API客户端库 )。对于代码片段,假设最新的命名表inventory
(旧文件,与该名称将被忽略)和DRIVE
是API服务端点:
FILENAME = 'inventory'
SRC_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
DST_MIMETYPE = 'text/csv'
# query for latest file named FILENAME
files = DRIVE.files().list(
q='name="%s" and mimeType="%s"' % (FILENAME, SRC_MIMETYPE),
orderBy='modifiedTime desc,name').execute().get('files', [])
# if found, export Sheets file as CSV
if files:
fn = '%s.csv' % os.path.splitext(files[0]['name'].replace(' ', '_'))[0]
print('Exporting "%s" as "%s"... ' % (files[0]['name'], fn), end='')
data = DRIVE.files().export(fileId=files[0]['id'], mimeType=DST_MIMETYPE).execute()
# if non-empty file
if data:
with open(fn, 'wb') as f:
f.write(data)
print('DONE')
如果你的表是大,你可能不得不将其导出成块-看到这个页面上如何做到这一点 。 如果你一般是新的谷歌API的,我有一个(有点过时,但)人性化的介绍视频为您服务。 (有2个视频后这可能有用的。)