python實(shí)現(xiàn)二維碼掃碼自動(dòng)登錄淘寶
一個(gè)小項(xiàng)目自動(dòng)登錄淘寶聯(lián)盟抓取數(shù)據(jù),由于之前在Github上看過(guò)類(lèi)似用Python寫(xiě)的代碼因此選擇用Python來(lái)寫(xiě),第一次用Python正式寫(xiě)程序還是被其“簡(jiǎn)單”所震撼,當(dāng)然用的時(shí)候還是對(duì)其(2.7版)編碼、遷移環(huán)境等問(wèn)題所困擾,還好后來(lái)都解決了。
言歸正傳,抓取淘寶聯(lián)盟的數(shù)據(jù)首先要解決的就是登錄的問(wèn)題,之前一般會(huì)碰到驗(yàn)證碼的困擾,現(xiàn)在支持二維碼掃碼登錄反而簡(jiǎn)單了,以下是登錄的Python代碼,主要是獲取二維碼打印,然后不斷的檢查掃碼狀態(tài),如果過(guò)期了重新請(qǐng)求二維碼(主要看邏輯,由于有些通用方法做了封裝所以不保證能直接執(zhí)行)
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("請(qǐng)掃描二維碼登錄") continue elif 10001 == code: print("已掃描二維碼,請(qǐng)?jiān)诖_認(rèn)登錄") elif 10004 == code: print("已過(guò)期請(qǐng)重新掃描") login() elif 10006 == code: successLoginURL = rObj["url"] print("登錄成功,正在跳轉(zhuǎn)") else: print("未知錯(cuò)誤,退出執(zhí)行") sys.exit(0) time.sleep(5) print "登錄成功跳轉(zhuǎn):" + successLoginURL r = utils.fetchAPI(successLoginURL, None, "raw", True, False, True) utils.fetchAPI(r.headers['Location'], None, "raw", True, True, False)
解決登錄問(wèn)題接下去就要解決保存狀態(tài)的問(wèn)題,Python的Requests庫(kù)非常強(qiáng)大,如果簡(jiǎn)單的話(huà)可以直接使用request.session來(lái)進(jìn)行會(huì)話(huà)操作,但由于項(xiàng)目中的很多操作是異步的因此需要解決cookie的存儲(chǔ)和讀取,使用pickel進(jìn)行對(duì)像的序列化和反序列化。其中保存cookie默認(rèn)用增量的方式進(jìn)行更新
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請(qǐng)求時(shí)加載cookie并保存cookie
s = requests.Session() # 統(tǒng)一請(qǐng)求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
這兩步做好之后基本后續(xù)的請(qǐng)求就直接使用統(tǒng)一的API請(qǐng)求方法即可,效果也非常不錯(cuò),運(yùn)行效果截圖:
當(dāng)然還有一個(gè)問(wèn)題未解決:如何在session過(guò)期之后如何自動(dòng)重新申請(qǐng)(不確定淘定是否支持),由于淘寶是用統(tǒng)一登錄而且是獨(dú)立的服務(wù)因此通過(guò)瀏覽器自動(dòng)刷新或者請(qǐng)求過(guò)程中不斷去更新cookie都沒(méi)有獲得服務(wù)器方更新的票據(jù),不知道這一塊大家有沒(méi)有可以提供的思路。
相關(guān)文章
Python內(nèi)置debug庫(kù)pdb用法示例詳解
這篇文章主要介紹了Python內(nèi)置debug庫(kù)pdb用法的相關(guān)資料,Python的內(nèi)置調(diào)試器pdb可以有效幫助開(kāi)發(fā)者掌握程序執(zhí)行流程和變量狀態(tài),通過(guò)插入pdb.set_trace()設(shè)置斷點(diǎn),或直接從命令行啟動(dòng)pdb,可以進(jìn)入交互式調(diào)試模式,需要的朋友可以參考下2024-11-11使用Python實(shí)現(xiàn)圖像有效壓縮的方法
在數(shù)字時(shí)代,圖像作為信息傳遞的重要媒介,在網(wǎng)頁(yè)設(shè)計(jì)、移動(dòng)應(yīng)用和多媒體制作中扮演著不可或缺的角色,本文將詳細(xì)介紹如何使用Python,一個(gè)功能強(qiáng)大且易于學(xué)習(xí)的編程語(yǔ)言,來(lái)實(shí)現(xiàn)圖像的有效壓縮,感興趣的朋友可以參考下2024-03-03Python處理application/json錯(cuò)誤的方法詳解
這篇文章主要為大家詳細(xì)介紹了python使用httpx_sse調(diào)用sse流式接口對(duì)響應(yīng)格式為application/json的錯(cuò)誤信息處理的相關(guān)知識(shí),需要的可以了解下2025-02-02《Python學(xué)習(xí)手冊(cè)》學(xué)習(xí)總結(jié)
本篇文章是讀者朋友在學(xué)習(xí)了《Python學(xué)習(xí)手冊(cè)》這本書(shū)以后,總結(jié)出的學(xué)習(xí)心得,值得大家參考學(xué)習(xí)。2018-01-01python語(yǔ)言time庫(kù)和datetime庫(kù)基本使用詳解
這篇文章主要介紹了python語(yǔ)言time庫(kù)和datetime庫(kù)基本使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python 裝飾器實(shí)現(xiàn)DRY(不重復(fù)代碼)原則
python的裝飾器就是一種代碼簡(jiǎn)潔的手段,在函數(shù)和方法有改動(dòng)時(shí),使得改動(dòng)量最小。這篇文章給大家介紹了Python 裝飾器實(shí)現(xiàn)DRY(不重復(fù)代碼)原則,感興趣的朋友一起看看吧2018-03-03PyTorch線(xiàn)性回歸和邏輯回歸實(shí)戰(zhàn)示例
這篇文章主要介紹了PyTorch線(xiàn)性回歸和邏輯回歸實(shí)戰(zhàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05