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

时间:2012-10-11 14:48:20

标签: 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'

但是我不能用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

结果是google登录页面。我做错了什么?

6 个答案:

答案 0 :(得分:16)

只需使用请求,它比使用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

答案 1 :(得分:11)

您没有存储Cookie。

首先让我说我完全支持使用most-excellent requests library的建议。

但是,如果您需要在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()

再次,尽可能使用requests,但如果不可能,标准库可以完成工作。

答案 2 :(得分:1)

requests库很棒,是来自Python的HTTP请求的黄金标准,但是这种下载方式虽然尚未弃用,但不太可能持续,特别是指下载链接样式。实际上,Google Drive API v2中的downloadUrl字段为already deprecated。目前可接受的将Google表格导出为CSV格式的方法是使用(当前)Google Drive API

为什么选择Drive API?这不应该是Sheets API的东西吗?好吧,Sheets API用于电子表格定向功能,即数据格式化,列调整大小,创建图表,单元格验证等,而Drive API用于文件面向导向的功能,即导入/导出。

下面是complete cmd-line solution。 (如果您不做Python,可以将其用作伪代码并选择Google APIs Client Libraries支持的任何语言。)对于代码段,假设最新的Sheet名为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')

如果您的工作表很大,则可能需要将其导出为块 - 请参阅this page了解如何 。如果您通常对Google API不熟悉,我会为您提供一个(有点过时但用户友好的)intro video。 (之后有2个视频也许有用。)

答案 3 :(得分:0)

我会使用请求

import requests
r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0ArM5yzzCw9IZdEdLWlpHT1FCcUpYQ2RjWmZYWmNwbXc&output=csv')
data = r.content

答案 4 :(得分:0)

必须需要请求库 --> pip 安装请求

from urllib.parse import urlparse
import requests

link = "https://docs.google.com/spreadsheets/d/11D0KAvm_ERXZ3XMgft5DM19IREaNvGargPlvW8e2DXg/edit#gid=0"
domain = urlparse(link).netloc
segments = link.rpartition('/')
link = segments[0] + "/export?format=csv"
file = requests.get(link)
if file.status_code == 200:
    fileContent = file.content.decode('utf-8')
    print(fileContent)

答案 5 :(得分:0)

没有比使用 const index = a.map(({ prop2 }) => prop2).indexOf("yutu"); 更简单的了:

Pandas