使用Python实现网站Google账号自动登录以完成数据下载
Google账号自动登录并下载数据的Python实现方案
方案一:OAuth 2.0官方授权(推荐,长期稳定)
多数支持Google登录的网站都兼容OAuth2协议,这是合规且不易触发反爬的方案,适合定期自动化任务。
步骤:
- 前往Google Cloud Console创建项目,注册桌面应用类型的OAuth客户端ID,下载生成的
credentials.json文件到脚本目录。 - 安装依赖:
pip install google-auth google-auth-oauthlib google-auth-httplib2 requests
- 示例代码(首次手动授权后,后续自动复用凭据):
from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request import pickle import os import requests # 按需调整权限范围,基础范围覆盖多数网站登录需求 SCOPES = ['openid', 'email', 'profile'] def get_google_credentials(): creds = None # 保存登录凭据的文件,首次授权后自动生成 token_path = 'token.pickle' if os.path.exists(token_path): with open(token_path, 'rb') as token: creds = pickle.load(token) # 刷新或重新获取凭据 if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES) creds = flow.run_local_server(port=0) # 保存凭据供后续自动使用 with open(token_path, 'wb') as token: pickle.dump(creds, token) return creds def download_target_data(url, creds): access_token = creds.token # 按目标网站要求构造授权请求头,多数网站支持Bearer令牌格式 headers = {'Authorization': f'Bearer {access_token}'} response = requests.get(url, headers=headers) response.raise_for_status() # 保存下载的数据,文件名按需修改 with open('downloaded_data.csv', 'wb') as f: f.write(response.content) print("数据下载完成") if __name__ == '__main__': target_download_url = "替换为你的数据下载URL" creds = get_google_credentials() download_target_data(target_download_url, creds)
首次运行会弹出浏览器引导你完成Google账号授权,之后脚本会自动复用token.pickle里的凭据,无需手动干预。
方案二:浏览器自动化(快速实现,短期场景)
若目标网站不支持OAuth2,可通过模拟浏览器操作实现自动登录,适合快速验证需求,但存在反爬检测风险。
示例(用Playwright,稳定性优于Selenium):
- 安装依赖:
pip install playwright playwright install chrome
- 示例代码(首次手动处理两步验证后,后续自动复用登录状态):
from playwright.sync_api import sync_playwright import os import time def auto_login_download(): with sync_playwright() as p: # 首次运行设为headless=False查看界面,稳定后改为True后台运行 browser = p.chromium.launch(headless=False) # 加载保存的登录状态,无需重复登录 context = browser.new_context(storage_state="auth_state.json") page = context.new_page() try: page.goto("替换为目标网站首页URL") # 判断是否已登录 if not page.is_visible('text="Google登录"'): page.goto("替换为数据下载URL") time.sleep(5) # 按需调整等待时间,或用元素等待替代 print("数据下载完成") return # 未登录时触发Google登录流程 page.click('text="Google登录"') popup = page.wait_for_event("popup") # 输入Google账号,建议用环境变量替代硬编码 popup.fill('input[type="email"]', os.getenv("GOOGLE_EMAIL")) popup.click('text="下一步"') popup.wait_for_load_state() # 输入密码,同样建议用环境变量 popup.fill('input[type="password"]', os.getenv("GOOGLE_PASSWORD")) popup.click('text="下一步"') # 首次运行需手动处理两步验证,之后状态会被保存 popup.wait_for_load_state() page.wait_for_load_state() # 保存登录状态供后续使用 context.storage_state(path="auth_state.json") # 跳转下载数据 page.goto("替换为数据下载URL") time.sleep(5) print("数据下载完成") finally: browser.close() if __name__ == '__main__': # 提前在系统环境变量中设置GOOGLE_EMAIL和GOOGLE_PASSWORD auto_login_download()
关键注意事项
- 安全性:禁止硬编码账号密码,优先使用环境变量或加密存储;OAuth2方案的
credentials.json和token.pickle不要随意分享。 - 反爬风险:浏览器自动化可能被网站检测到,导致账号受限,长期任务优先选OAuth2方案。
- 定时任务:可通过Linux的
crontab或Windows任务计划,定期执行脚本实现自动下载。
内容的提问来源于stack exchange,提问作者Paulo Fernandes
相关产品推荐
相关产品推荐

