使用Python urllib2/requests对Google Drive进行身份验证并下载电子表格

使用Python urllib2/requests对Google Drive进行身份验证并下载电子表格,python,excel,http,download,python-requests,Python,Excel,Http,Download,Python Requests,我想下载一个文档,我在我的谷歌驱动器认证谷歌(我只希望某些用户能够访问它,不想在网上发布) 我尝试过使用请求,但显然我做错了什么。 从浏览器中,我可以下载我的文档到 https://docs.google.com/spreadsheets/d//export?format=xls 因此,在我的python脚本中,我执行以下操作: import os import requests import shutil from requests.auth import HTTPBasicAuth rem

我想下载一个文档,我在我的谷歌驱动器认证谷歌(我只希望某些用户能够访问它,不想在网上发布)

我尝试过使用
请求
,但显然我做错了什么。 从浏览器中,我可以下载我的文档到
https://docs.google.com/spreadsheets/d//export?format=xls

因此,在我的python脚本中,我执行以下操作:

import os
import requests
import shutil
from requests.auth import HTTPBasicAuth

remote = "https://docs.google.com/spreadsheets/d/<document key>/export?format=xls"
username = os.environ['GOOGLEUSERNAME']
password = os.environ['GOOGLEPASSWORD']
r = requests.get(remote, auth=HTTPBasicAuth(username,password))
if r.status_code == 200:
  with open("document.xls","wb") as f:
    shutil.copyfileobj(r.raw, f)
导入操作系统
导入请求
进口舒蒂尔
从requests.auth导入HTTPBasicAuth
远程=”https://docs.google.com/spreadsheets/d//export?format=xls"
username=os.environ['GOOGLEUSERNAME']
password=os.environ['GOOGLEPASSWORD']
r=requests.get(远程,auth=HTTPBasicAuth(用户名,密码))
如果r.status_code==200:
以open(“document.xls”、“wb”)作为f:
shutil.copyfileobj(r.raw,f)
但是,生成的
document.xls
为空


我做错了什么?

事实上,你想做的事情可能是有可能的,但以下是一些原因,说明了为什么这件事很重要(绝对不是一个完整的清单):

  • 谷歌通常会阻止非浏览器(比如你的Python脚本)的
    用户代理(出于安全原因)浏览预期内容;你必须
  • 多因素身份验证-您必须将其关闭(很简单,但您打开了自己被黑客攻击的大门…)
  • );(不太容易找到)
  • 你应该怎么做 使用。此外,还有一个很好的教程,介绍了如何从GoogleDrive下载文件

    如果您想编写更少的代码,那么像这样的库将使您的生活更加轻松


    希望这有帮助

    我可能会为您提供一个简单的解决方案,具体取决于身份验证要求。你是说

    我只希望某些用户能够访问它,但不希望 在网上发布

    仅凭此声明,您就可以为文档创建一个“秘密”链接,并在用户之间共享此链接。然后,您可以轻松地自动检索此文档,例如使用wget,并指定格式,例如
    csv

    wget -O data.csv "https://docs.google.com/spreadsheets/d/***SHARED-SECRET***/export?format=csv"
    
    或者,在Python(2)中:


    实际上,我在生产中使用了它,它工作可靠,不会伪造用户代理。

    您是否有第(1)点的参考资料?我从来没有注意到这一点。这是我多年前尝试解析谷歌网站时的亲身经历。在这方面,我没有遇到过问题,使用wget和Python而不试图伪造用户代理(见下文)。关于用户代理,阻止这一点将起作用-因为这些链接是为任何人下载而创建的。但是试着在不创建链接的情况下抓取google.com,或者在本例中是一个随机的google文档,您的脚本会因为您的用户代理而被阻止。它的网络安全性当然你总的来说是有道理的。我回答的全部要点是,如果他能稍微改变一下关于身份验证的方法,那么有一种非常简单的方法可以可靠地工作,原因您再次指出:这是一个仅受共享机密保护的文档。
    import urllib2
    from cookielib import CookieJar
    
    spreadsheet_url = "https://docs.google.com/spreadsheets/d/***SHARED-SECRET***/export?format=csv"
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar()))
    response = opener.open(spreadsheet_url) 
    with open("data.csv", "wb") as f:
        f.write(response.read())