Python实现淘宝联盟二维码扫码自动登录与数据抓取

纸上星河
纸上星河
发布时间:2026-10-13| 4人浏览过
原创

本文介绍使用Python实现淘宝联盟数据抓取的自动登录方案。通过调用淘宝二维码接口实现扫码登录,解决验证码问题。利用Requests库的Session机制结合pickle序列化,实现Cookie的异步存储与读取,确保会话状态持久化。文章提供了核心代码逻辑,并探讨了Session过期后自动刷新票据的难点与思路。

这是一个关于自动登录淘宝联盟以抓取数据的小项目。此前在GitHub上见过类似的Python实现,因此决定采用Python开发。初次正式使用Python编写程序时,其简洁性令人印象深刻。尽管在2.7版本中曾遇到编码和环境迁移等困扰,但最终均得以解决。

核心在于解决登录问题。以往常受验证码困扰,如今支持二维码扫码登录则相对简便。以下是实现登录的Python代码,主要逻辑包括获取二维码并打印,随后持续轮询扫码状态。若二维码过期,则重新请求新的二维码(注:此处仅展示核心逻辑,因部分通用方法已封装,代码可能无法直接运行)。

def getQRCode(enableCmdQR):
  payload = {'_ksTS': str(time.time()), 'from': 'alimama'}
  qrCodeObj = utils.fetchAPI('https://qrlogin.taobao.com/qrcodelogin/generateQRCode4Login.do', payload,
                "json", None, True, True)
 
  print(qrCodeObj)
  utils.printQRCode('http:' + qrCodeObj['url'], enableCmdQR)
  lgToken = qrCodeObj['lgToken']
  return lgToken
 
 
def login(enableCmdQR=False):
  lgToken = getQRCode(enableCmdQR)
  code = 0
  successLoginURL = ""
  while code != 10006:
    payload = {'lgToken': lgToken,
          'defaulturl': 'http%3A%2F%2Flogin.taobao.com%2Fmember%2Ftaobaoke%2Flogin.htm%3Fis_login%3D1&_ksTS=' + str(
            time.time())}
 
    rObj = utils.fetchAPI('https://qrlogin.taobao.com/qrcodelogin/qrcodeLoginCheck.do', payload, "json", True,
               False)
    code = int(rObj['code'])
    if 10000 == code:
      # print("请扫描二维码登录")
      continue
    elif 10001 == code:
      print("已扫描二维码,请在确认登录")
    elif 10004 == code:
      print("已过期请重新扫描")
      login()
    elif 10006 == code:
      successLoginURL = rObj["url"]
      print("登录成功,正在跳转")
    else:
      print("未知错误,退出执行")
      sys.exit(0)
 
    time.sleep(5)
 
  print "登录成功跳转:" + successLoginURL
  r = utils.fetchAPI(successLoginURL, None, "raw", True, False, True)
  utils.fetchAPI(r.headers['Location'], None, "raw", True, True, False)

登录问题解决后,需处理状态保存。Python的Requests库功能强大,简单场景下可直接使用request.session进行会话管理。然而,由于项目涉及大量异步操作,需解决Cookie的存储与读取问题,此处采用pickle进行对象的序列化和反序列化。默认情况下,Cookie保存采用增量更新方式。

def save_cookies(cookies, overWrite=False):
  try:
    currentCookie = requests.utils.dict_from_cookiejar(cookies)
    if len(currentCookie) < 1:
      return
    oldCookie = requests.utils.dict_from_cookiejar(load_cookies())
    with open(config.COOKIE_FILE, 'w') as f:
      if not overWrite:
        cookieDict = dict(oldCookie, **currentCookie)
      else:
        cookieDict = requests.utils.dict_from_cookiejar(cookies)
      pickle.dump(cookieDict, f)
      print 'Saved cookie'
      print cookieDict
      f.close()
  except:
    print 'Save cookies failed', sys.exc_info()[0]
    sys.exit(99)


def load_cookies():
  try:
    with open(config.COOKIE_FILE, 'r') as f:
      cookies = requests.utils.cookiejar_from_dict(pickle.load(f))
      f.close()
  except:
    cookies = []
  return cookies

完成封装后,在发起requests.Session请求时,需加载已保存的Cookie,并在请求结束后保存新的Cookie。

s = requests.Session()
# 统一请求API
def fetchAPI(url, params=None, resultFormat="text", isNeedCookie=True, allowRedirects=True, saveCookie=False,
       method='GET'):
  try:
    cookies = load_cookies()
    if 'POST' == method:
      response = s.post(url, data=params, headers=config.Headers, cookies=cookies)
    else:
      response = s.get(url, params=params, headers=config.Headers, cookies=cookies,
               allow_redirects=allowRedirects)

    if "json" == resultFormat:
      result = response.json()
    elif "raw" == resultFormat:
      result = response
    else:
      result = response.text

    # if saveCookie:
    # print 'save cookie:' + str(response.cookies)
    save_cookies(response.cookies)

    return result

  except Exception, e:
    print e
    return False

完成上述两步后,后续请求可直接使用统一的API请求方法,运行效果良好。具体运行效果见截图:

目前尚有一个未解决的问题:如何在Session过期后自动重新申请票据(不确定淘宝是否支持此机制)。由于淘宝采用统一登录且为独立服务,通过浏览器自动刷新或在请求过程中不断尝试更新Cookie,均未成功获取服务器端更新的票据。目前尚不清楚是否有其他解决思路,欢迎提供建议。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。