我可以使用wget:
下载google docs csvwget --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登录页面。我做错了什么?
答案 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