如何用wget获取Google购物列表以适配热敏打印机打印?
解决谷歌购物列表抓取与格式化问题
首先得说清楚:用wget直接带用户名密码的方式根本行不通——谷歌的购物列表页面是动态渲染的,而且登录系统用的是OAuth2认证,完全不支持传统的HTTP Basic Auth,所以wget --user --password参数只会让你被重定向到登录页面,拿不到实际的列表内容。
下面给你两个可行的自动化抓取方案,都是用Python实现,能直接输出你需要的列表格式:
方案一:用Selenium模拟浏览器抓取
Selenium是老牌的浏览器自动化工具,适合这种需要登录的动态页面抓取。
步骤1:安装依赖
先安装Selenium和对应浏览器的驱动(以Chrome为例):
pip install selenium
然后下载和你Chrome版本匹配的ChromeDriver,放到脚本同目录或者系统可识别的PATH路径里。
步骤2:Python脚本
这个脚本第一次运行需要手动登录一次,之后会保存cookie,后续就能自动抓取了:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pickle # 初始化Chrome浏览器 driver = webdriver.Chrome() try: driver.get("https://shoppinglist.google.com") # 尝试加载已保存的cookie,避免重复登录 try: cookies = pickle.load(open("google_cookies.pkl", "rb")) for cookie in cookies: driver.add_cookie(cookie) driver.refresh() except FileNotFoundError: # 第一次运行,手动完成登录后按回车 input("请在弹出的浏览器中完成谷歌登录,登录成功后按回车继续...") # 保存cookie到本地 pickle.dump(driver.get_cookies(), open("google_cookies.pkl", "wb")) # 等待购物列表加载完成(这里的CSS选择器可能需要根据页面更新调整) wait = WebDriverWait(driver, 10) item_elements = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div[role='listitem'] div[aria-label]")) ) # 提取并格式化列表项 shopping_list = [] for elem in item_elements: # 去掉备注等多余内容,只保留商品名称 item_name = elem.get_attribute("aria-label").split(" · ")[0] shopping_list.append(f"- {item_name}") # 输出你需要的格式 print("\n".join(shopping_list)) finally: # 关闭浏览器 driver.quit()
方案二:用Playwright(更简洁,自动管理驱动)
Playwright是微软推出的新一代自动化工具,不用手动下载浏览器驱动,用起来更省心。
步骤1:安装依赖
pip install playwright playwright install chrome
步骤2:Python脚本
逻辑和Selenium类似,但代码更简洁:
from playwright.sync_api import sync_playwright import pickle with sync_playwright() as p: # 第一次运行设为headless=False,方便手动登录;之后可以改成True后台运行 browser = p.chromium.launch(headless=False) page = browser.new_page() try: page.goto("https://shoppinglist.google.com") # 加载已保存的cookie try: cookies = pickle.load(open("google_cookies.pkl", "rb")) page.context.add_cookies(cookies) page.reload() except FileNotFoundError: input("登录完成后按回车继续...") pickle.dump(page.context.cookies(), open("google_cookies.pkl", "wb")) # 等待列表元素加载 page.wait_for_selector("div[role='listitem'] div[aria-label]") item_elements = page.query_selector_all("div[role='listitem'] div[aria-label]") # 生成目标格式的列表 shopping_list = [f"- {elem.get_attribute('aria-label').split(' · ')[0]}" for elem in item_elements] print("\n".join(shopping_list)) finally: browser.close()
关键注意事项
- CSS选择器调整:谷歌的页面可能会更新,如果脚本找不到元素,需要打开购物列表页面的开发者工具,重新定位列表项的CSS选择器。
- cookie有效期:谷歌的cookie可能会过期,如果之后脚本又跳转到登录页,删除
google_cookies.pkl重新登录一次即可。 - 后台运行:如果要把脚本加入定时任务,把浏览器设为无头模式(Selenium里加
options.add_argument("--headless=new"),Playwright里把headless=False改成True)。
抓取后的内容可以直接传给你的打印脚本,或者保存到临时文件再读取打印。
内容的提问来源于stack exchange,提问作者edwards.gavin
相关产品推荐
相关产品推荐

