侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现二维码扫码自动登录淘宝

Python  /  管理员 发布于 7年前   372

一个小项目自动登录淘宝联盟抓取数据,由于之前在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的存储和读取,使用pickel进行对像的序列化和反序列化。其中保存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()# 统一请求APIdef 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 递归函数详解及实例
    下一条:
    使用Python的Scrapy框架十分钟爬取美女图
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客