聊聊淘寶的自動登錄及沒有解決的問題


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

歡迎多評論!!!

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM