Taobao Alliance에 자동으로 로그인하여 데이터를 캡처하는 작은 프로젝트입니다. 이전에 Github에서 Python으로 작성된 비슷한 코드를 본 적이 있어서 처음으로 Python을 사용하여 정식으로 작성하기로 했습니다. 프로그램을 사용해도 여전히 '단순함'에 감동했습니다. "충격을 받았습니다. 물론 사용하면서 여전히 해당 프로그램(버전 2.7)의 인코딩 및 마이그레이션 환경 등의 문제로 고민했습니다. 다행히 나중에 모두 해결되었습니다. .
본론으로 돌아가서, 타오바오 얼라이언스의 데이터를 캡처할 때 가장 먼저 해결해야 할 것은 로그인 문제입니다. 예전에는 인증번호 문제가 자주 발생했습니다. 로그인을 위한 QR 코드 스캔을 지원하므로 로그인이 간편합니다. 다음은 주로 QR 코드를 인쇄하고 스캔 상태를 지속적으로 확인하기 위한 로그인용 Python 코드입니다. QR 코드(일부 일반적인 메소드가 캡슐화되어 있기 때문에 주로 로직에 따라 다르므로 직접 실행할 수 있다는 보장은 없습니다.)
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을 직접 사용할 수 있지만 프로젝트의 많은 작업은 비동기식입니다. 쿠키의 저장 및 읽기 문제를 해결하고 피켈을 사용하여 객체를 직렬화 및 역직렬화해야 합니다. 저장된 쿠키는 기본적으로 증분 업데이트됩니다
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
캡슐화 후 쿠키를 로드하고 요청 시 쿠키를 저장합니다. 세션이 요청됩니다
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 요청 방식을 사용하여 직접 후속 요청을 할 수 있으며, 실행 효과도 매우 좋습니다.
물론 아직 해결되지 않은 문제가 있습니다. 세션이 만료된 후 자동으로 다시 신청하는 방법(Taoding이 지원하는지 확실하지 않음)입니다. Taobao는 통합 로그인을 사용하고 있기 때문입니다. 독립적인 서비스이므로 요청 프로세스 중 브라우저를 통해 자동 새로 고침 또는 지속적인 쿠키 업데이트가 서버 측 업데이트 티켓을 얻지 못한 경우 이 문제에 대한 아이디어를 제공할 수 있는지 궁금합니다.
QR 코드를 스캔하여 Taobao에 자동으로 로그인하는 방법에 대한 더 많은 Python 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!