一個小專案自動登入淘寶聯盟抓取數據,由於之前在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請求方法即可,效果也非常不錯,運行效果截圖:
當然還有一個問題未解決:如何在session過期之後如何自動重新申請(不確定淘定是否支持),由於淘寶是用統一登錄而且是獨立的服務因此通過瀏覽器自動刷新或請求過程中不斷去更新cookie都沒有獲得伺服器方更新的票據,不知道這一塊大家有沒有可以提供的想法。
更多python實作二維碼掃碼自動登入淘寶相關文章請關注PHP中文網!