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


Posted in Python onDecember 27, 2016

一个小项目自动登录淘宝联盟抓取数据,由于之前在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()
# 统一请求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请求方法即可,效果也非常不错,运行效果截图:

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

当然还有一个问题未解决:如何在session过期之后如何自动重新申请(不确定淘定是否支持),由于淘宝是用统一登录而且是独立的服务因此通过浏览器自动刷新或者请求过程中不断去更新cookie都没有获得服务器方更新的票据,不知道这一块大家有没有可以提供的思路。

Python 相关文章推荐
Python实现Tab自动补全和历史命令管理的方法
Mar 12 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
python实现的用于搜索文件并进行内容替换的类实例
Jun 28 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
Python系统监控模块psutil功能与经典用法分析
May 24 Python
Python 判断图像是否读取成功的方法
Jan 26 Python
Python安装与基本数据类型教程详解
May 29 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
浅谈Python数学建模之固定费用问题
Jun 23 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 #Python
Python中如何获取类属性的列表
Dec 26 #Python
Python中强大的命令行库click入门教程
Dec 26 #Python
Python快速从注释生成文档的方法
Dec 26 #Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 #Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 #Python
详解python进行mp3格式判断
Dec 23 #Python
You might like
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
PHP中的日期处理方法集锦
2007/01/02 PHP
简单采集了yahoo的一些数据
2007/02/14 PHP
实用函数4
2007/11/08 PHP
php下封装较好的数字分页方法
2010/11/23 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
vue如何从接口请求数据
2017/06/22 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
python创建和删除目录的方法
2015/04/29 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python WindowsError的错误代码详解
2017/07/23 Python
在线课程:Skillshare
2019/04/02 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
内容编辑个人求职信
2013/12/10 职场文书
招聘专员岗位职责
2014/03/07 职场文书
职工小家建设活动方案
2014/08/25 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
小学老师对学生的评语
2014/12/29 职场文书
企业宣传语大全
2015/07/13 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
最新最全的手机号验证正则表达式
2022/02/24 Javascript