国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現二維碼掃碼自動登錄淘寶

2019-11-25 16:26:16
字體:
來源:轉載
供稿:網友

一個小項目自動登錄淘寶聯盟抓取數據,由于之前在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都沒有獲得服務器方更新的票據,不知道這一塊大家有沒有可以提供的思路。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元朗区| 大渡口区| 和静县| 海晏县| 通河县| 平阴县| 乌兰县| 察雅县| 仙桃市| 罗城| 江西省| 阜平县| 丰城市| 辽源市| 常山县| 台中市| 苍山县| 偏关县| 宁陵县| 兰西县| 原平市| 新龙县| 呼图壁县| 衡南县| 宽城| 建平县| 远安县| 广灵县| 七台河市| 吉林市| 汾阳市| 扎兰屯市| 龙海市| 体育| 聂荣县| 株洲县| 白水县| 梨树县| 临城县| 岐山县| 天柱县|