Python爬蟲利器之Selenium的用法

經(jīng)過多次嘗試,模擬登錄淘寶終于成功了,實(shí)在是不容易,淘寶的登錄加密和驗(yàn)證太復(fù)雜了,煞費(fèi)苦心,在此寫出來和大家一起分享,希望大家支持。

溫馨提示

更新時(shí)間,2016-02-01,現(xiàn)在淘寶換成了滑塊驗(yàn)證了,比較難解決這個(gè)問題,以下的代碼沒法用了,僅作學(xué)習(xí)參考研究之用吧。

本篇內(nèi)容

1. python模擬登錄淘寶網(wǎng)頁

2. 獲取登錄用戶的所有訂單詳情

3. 學(xué)會(huì)應(yīng)對(duì)出現(xiàn)驗(yàn)證碼的情況

4. 體會(huì)一下復(fù)雜的模擬登錄機(jī)制

探索部分成果

1. 淘寶的密碼用了AES加密算法,最終將密碼轉(zhuǎn)化為256位,在POST時(shí),傳輸?shù)氖?56位長度的密碼。

2. 淘寶在登錄時(shí)必須要輸入驗(yàn)證碼,在經(jīng)過幾次嘗試失敗后最終獲取了驗(yàn)證碼圖片讓用戶手動(dòng)輸入來驗(yàn)證。

3. 淘寶另外有復(fù)雜且每天在變的 ua 加密算法,在程序中我們需要提前獲取某一 ua 碼才可進(jìn)行模擬登錄。

4. 在獲取最后的登錄 st 碼時(shí),歷經(jīng)了多次請(qǐng)求和正則表達(dá)式提取,且 st 碼只可使用一次。

整體思路梳理

1. 手動(dòng)到瀏覽器獲取 ua 碼以及 加密后的密碼,只獲取一次即可,一勞永逸。

2. 向登錄界面發(fā)送登錄請(qǐng)求,POST 一系列參數(shù),包括 ua 碼以及密碼等等,獲得響應(yīng),提取驗(yàn)證碼圖像。

3. 用戶輸入手動(dòng)驗(yàn)證碼,重新加入驗(yàn)證碼數(shù)據(jù)再次用 POST 方式發(fā)出請(qǐng)求,獲得響應(yīng),提取 J_Htoken。

4. 利用 J_Htoken 向 alipay 發(fā)出請(qǐng)求,獲得響應(yīng),提取 st 碼。

5. 利用 st 碼和用戶名,重新發(fā)出登錄請(qǐng)求,獲得響應(yīng),提取重定向網(wǎng)址,存儲(chǔ) cookie。

6. 利用 cookie 向其他個(gè)人頁面如訂單頁面發(fā)出請(qǐng)求,獲得響應(yīng),提取訂單詳情。

是不是沒看懂?沒事,下面我將一點(diǎn)點(diǎn)說明自己模擬登錄的過程,希望大家可以理解。

前期準(zhǔn)備

由于淘寶的 ua 算法和 aes 密碼加密算法太復(fù)雜了,ua 算法在淘寶每天都是在變化的,不過,這個(gè)內(nèi)容你獲取之后一直用即可,經(jīng)過測試之后沒有問題,一勞永逸。

那么 ua 和 aes 密碼怎樣獲取呢?

我們就從瀏覽器里面直接獲取吧,打開瀏覽器,找到淘寶的登錄界面,按 F12 或者瀏覽器右鍵審查元素。

在這里我用的是火狐瀏覽器,首先記得在瀏覽器中設(shè)置一下顯示持續(xù)日志,要不然頁面跳轉(zhuǎn)了你就看不到之前抓取的信息了。在這里截圖如下:

好,那么接下來我們就從瀏覽器中獲取 ua 和 aes 密碼

點(diǎn)擊網(wǎng)絡(luò)選項(xiàng)卡,這時(shí)都是空的,什么數(shù)據(jù)也沒有截取。這時(shí)你就在網(wǎng)頁上登錄一下試試吧,輸入用戶名啊,密碼啊,有必要時(shí)需要輸入驗(yàn)證碼,點(diǎn)擊登錄。

等跳轉(zhuǎn)成功后,你就可以看到好多日志記錄了,點(diǎn)擊圖中的那一行 login.taobo.com,然后查看參數(shù),你就會(huì)發(fā)現(xiàn)表單數(shù)據(jù)了,其中就包括 ua 還有下面的 password2,把這倆復(fù)制下來,我們之后要用到的。這就是我們需要的 ua 還有 aes 加密后的密碼。

恩,讀到這里,你應(yīng)該獲取到了屬于自己的 ua 和 password2 兩個(gè)內(nèi)容。

輸入驗(yàn)證碼并獲取J_HToken

經(jīng)過博主本人親自驗(yàn)證,有時(shí)候,在模擬登錄時(shí)你并不需要輸入驗(yàn)證碼,它直接返回的結(jié)果就是前面所說的下一步用到的 J_Token,而有時(shí)候你則會(huì)需要輸入驗(yàn)證碼,等你手動(dòng)輸入驗(yàn)證碼之后,重新請(qǐng)求登錄一次。

博主是邊寫程序邊更新文章的,現(xiàn)在寫完了是否有必要輸入驗(yàn)證碼的檢驗(yàn)以及在瀏覽器中呈現(xiàn)驗(yàn)證碼。

代碼如下

__author__?=?'CQC'

#?-*-?coding:utf-8?-*-

import?urllib

import?urllib2

import?cookielib

import?re

import?webbrowser

#模擬登錄淘寶類

class?Taobao:

#初始化方法

def?__init__(self):

#登錄的URL

self.loginURL?=?"https://login.taobao.com/member/login.jhtml"

#代理IP地址,防止自己的IP被封禁

self.proxyURL?=?'http://120.193.146.97:843'

#登錄POST數(shù)據(jù)時(shí)發(fā)送的頭部信息

self.loginHeaders?=??{

'Host':'login.taobao.com',

'User-Agent'?:?'Mozilla/5.0?(Windows?NT?6.1;?WOW64;?rv:35.0)?Gecko/20100101?Firefox/35.0',

'Referer'?:?'https://login.taobao.com/member/login.jhtml',

'Content-Type':?'application/x-www-form-urlencoded',

'Connection'?:?'Keep-Alive'

}

#用戶名

self.username?=?'cqcre'

#ua字符串,經(jīng)過淘寶ua算法計(jì)算得出,包含了時(shí)間戳,瀏覽器,屏幕分辨率,隨機(jī)數(shù),鼠標(biāo)移動(dòng),鼠標(biāo)點(diǎn)擊,其實(shí)還有鍵盤輸入記錄,鼠標(biāo)移動(dòng)的記錄、點(diǎn)擊的記錄等等的信息

self.ua?=?'191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThu9a==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='

#密碼,在這里不能輸入真實(shí)密碼,淘寶對(duì)此密碼進(jìn)行了加密處理,256位,此處為加密后的密碼

self.password2?=?'7511aa68sx629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e140a4a2a4b5c253bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'

self.post?=?post?=?{

'ua':self.ua,

'TPL_checkcode':'',

'CtrlVersion':?'1,0,0,7',

'TPL_password':'',

'TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443',

'TPL_username':self.username,

'loginsite':'0',

'newlogin':'0',

'from':'tb',

'fc':'default',

'style':'default',

'css_style':'',

'tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A',

'support':'000001',

'loginType':'4',

'minititle':'',

'minipara':'',

'umto':'NaN',

'pstrong':'3',

'llnick':'',

'sign':'',

'need_sign':'',

'isIgnore':'',

'full_redirect':'',

'popid':'',

'callback':'',

'guf':'',

'not_duplite_str':'',

'need_user_id':'',

'poy':'',

'gvfdcname':'10',

'gvfdcre':'',

'from_encoding?':'',

'sub':'',

'TPL_password_2':self.password2,

'loginASR':'1',

'loginASRSuc':'1',

'allp':'',

'oslanguage':'zh-CN',

'sr':'1366*768',

'osVer':'windows|6.1',

'naviVer':'firefox|35'

}

#將POST的數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換

self.postData?=?urllib.urlencode(self.post)

#設(shè)置代理

self.proxy?=?urllib2.ProxyHandler({'http':self.proxyURL})

#設(shè)置cookie

self.cookie?=?cookielib.LWPCookieJar()

#設(shè)置cookie處理器

self.cookieHandler?=?urllib2.HTTPCookieProcessor(self.cookie)

#設(shè)置登錄時(shí)用到的opener,它的open方法相當(dāng)于urllib2.urlopen

self.opener?=?urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)

#得到是否需要輸入驗(yàn)證碼,這次請(qǐng)求的相應(yīng)有時(shí)會(huì)不同,有時(shí)需要驗(yàn)證有時(shí)不需要

def?needIdenCode(self):

#第一次登錄獲取驗(yàn)證碼嘗試,構(gòu)建request

request?=?urllib2.Request(self.loginURL,self.postData,self.loginHeaders)

#得到第一次登錄嘗試的相應(yīng)

response?=?self.opener.open(request)

#獲取其中的內(nèi)容

content?=?response.read().decode('gbk')

#獲取狀態(tài)嗎

status?=?response.getcode()

#狀態(tài)碼為200,獲取成功

if?status?==?200:

print?u"獲取請(qǐng)求成功"

#\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801這六個(gè)字是請(qǐng)輸入驗(yàn)證碼的utf-8編碼

pattern?=?re.compile(u'\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801',re.S)

result?=?re.search(pattern,content)

#如果找到該字符,代表需要輸入驗(yàn)證碼

if?result:

print?u"此次安全驗(yàn)證異常,您需要輸入驗(yàn)證碼"

return?content

#否則不需要

else:

print?u"此次安全驗(yàn)證通過,您這次不需要輸入驗(yàn)證碼"

return?False

else:

print?u"獲取請(qǐng)求失敗"

#得到驗(yàn)證碼圖片

def?getIdenCode(self,page):

#得到驗(yàn)證碼的圖片

pattern?=?re.compile('

#匹配的結(jié)果

matchResult?=?re.search(pattern,page)

#已經(jīng)匹配得到內(nèi)容,并且驗(yàn)證碼圖片鏈接不為空

if?matchResult?and?matchResult.group(1):

print?matchResult.group(1)

return?matchResult.group(1)

else:

print?u"沒有找到驗(yàn)證碼內(nèi)容"

return?False

#程序運(yùn)行主干

def?main(self):

#是否需要驗(yàn)證碼,是則得到頁面內(nèi)容,不是則返回False

needResult?=?self.needIdenCode()

if?not?needResult?==?False:

print?u"您需要手動(dòng)輸入驗(yàn)證碼"

idenCode?=?self.getIdenCode(needResult)

#得到了驗(yàn)證碼的鏈接

if?not?idenCode?==?False:

print?u"驗(yàn)證碼獲取成功"

print?u"請(qǐng)?jiān)跒g覽器中輸入您看到的驗(yàn)證碼"

webbrowser.open_new_tab(idenCode)

#驗(yàn)證碼鏈接為空,無效驗(yàn)證碼

else:

print?u"驗(yàn)證碼獲取失敗,請(qǐng)重試"

else:

print?u"不需要輸入驗(yàn)證碼"

taobao?=?Taobao()

taobao.main()

恩,請(qǐng)把里面的 ua 和 password2 還有用戶名換成自己的進(jìn)行嘗試,用我的可能會(huì)產(chǎn)生錯(cuò)誤的。

運(yùn)行結(jié)果

然后會(huì)蹦出瀏覽器,顯示了驗(yàn)證碼的內(nèi)容,這個(gè)需要你來手動(dòng)輸入。

在這里有小伙伴向我反映有這么個(gè)錯(cuò)誤

經(jīng)過查證,竟然是版本問題,博主本人用的是 2.7.7,而小伙伴用的是 2.7.9。后來換成 2.7.7 就好了…,我也是醉了,希望有相同錯(cuò)誤的小伙伴,可以嘗試換一下版本…

好啦,運(yùn)行時(shí)會(huì)彈出瀏覽器,如圖

那么,我們現(xiàn)在需要手動(dòng)輸入驗(yàn)證碼,重新向登錄界面發(fā)出登錄請(qǐng)求,之前的post數(shù)據(jù)內(nèi)容加入驗(yàn)證碼這一項(xiàng),重新請(qǐng)求一次,如果請(qǐng)求成功,則會(huì)返回下一步我們需要的 J_HToken,如果驗(yàn)證碼輸入錯(cuò)誤,則會(huì)返回驗(yàn)證碼輸入錯(cuò)誤的選項(xiàng)。好,下面,我已經(jīng)寫到了獲取J_HToken的進(jìn)度,代碼如下,現(xiàn)在運(yùn)行程序,會(huì)蹦出瀏覽器,然后提示你輸入驗(yàn)證碼,用戶手動(dòng)輸入之后,則會(huì)返回一個(gè)頁面,我們提取出 J_Htoken即可。

注意,到現(xiàn)在為止,你還沒有登錄成功,只是獲取到了J_HToken的值。

目前寫到的代碼如下

__author__?=?'CQC'

#?-*-?coding:utf-8?-*-

import?urllib

import?urllib2

import?cookielib

import?re

import?webbrowser

#模擬登錄淘寶類

class?Taobao:

#初始化方法

def?__init__(self):

#登錄的URL

self.loginURL?=?"https://login.taobao.com/member/login.jhtml"

#代理IP地址,防止自己的IP被封禁

self.proxyURL?=?'http://120.193.146.97:843'

#登錄POST數(shù)據(jù)時(shí)發(fā)送的頭部信息

self.loginHeaders?=??{

'Host':'login.taobao.com',

'User-Agent'?:?'Mozilla/5.0?(Windows?NT?6.1;?WOW64;?rv:35.0)?Gecko/20100101?Firefox/35.0',

'Referer'?:?'https://login.taobao.com/member/login.jhtml',

'Content-Type':?'application/x-www-form-urlencoded',

'Connection'?:?'Keep-Alive'

}

#用戶名

self.username?=?'cqcre'

#ua字符串,經(jīng)過淘寶ua算法計(jì)算得出,包含了時(shí)間戳,瀏覽器,屏幕分辨率,隨機(jī)數(shù),鼠標(biāo)移動(dòng),鼠標(biāo)點(diǎn)擊,其實(shí)還有鍵盤輸入記錄,鼠標(biāo)移動(dòng)的記錄、點(diǎn)擊的記錄等等的信息

self.ua?=?'191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThuOA==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='

#密碼,在這里不能輸入真實(shí)密碼,淘寶對(duì)此密碼進(jìn)行了加密處理,256位,此處為加密后的密碼

self.password2?=?'7511aa6854629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e0a4a2a4b5c253bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'

self.post?=?post?=?{

'ua':self.ua,

'TPL_checkcode':'',

'CtrlVersion':?'1,0,0,7',

'TPL_password':'',

'TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443',

'TPL_username':self.username,

'loginsite':'0',

'newlogin':'0',

'from':'tb',

'fc':'default',

'style':'default',

'css_style':'',

'tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A',

'support':'000001',

'loginType':'4',

'minititle':'',

'minipara':'',

'umto':'NaN',

'pstrong':'3',

'llnick':'',

'sign':'',

'need_sign':'',

'isIgnore':'',

'full_redirect':'',

'popid':'',

'callback':'',

'guf':'',

'not_duplite_str':'',

'need_user_id':'',

'poy':'',

'gvfdcname':'10',

'gvfdcre':'',

'from_encoding?':'',

'sub':'',

'TPL_password_2':self.password2,

'loginASR':'1',

'loginASRSuc':'1',

'allp':'',

'oslanguage':'zh-CN',

'sr':'1366*768',

'osVer':'windows|6.1',

'naviVer':'firefox|35'

}

#將POST的數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換

self.postData?=?urllib.urlencode(self.post)

#設(shè)置代理

self.proxy?=?urllib2.ProxyHandler({'http':self.proxyURL})

#設(shè)置cookie

self.cookie?=?cookielib.LWPCookieJar()

#設(shè)置cookie處理器

self.cookieHandler?=?urllib2.HTTPCookieProcessor(self.cookie)

#設(shè)置登錄時(shí)用到的opener,它的open方法相當(dāng)于urllib2.urlopen

self.opener?=?urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)

#得到是否需要輸入驗(yàn)證碼,這次請(qǐng)求的相應(yīng)有時(shí)會(huì)不同,有時(shí)需要驗(yàn)證有時(shí)不需要

def?needCheckCode(self):

#第一次登錄獲取驗(yàn)證碼嘗試,構(gòu)建request

request?=?urllib2.Request(self.loginURL,self.postData,self.loginHeaders)

#得到第一次登錄嘗試的相應(yīng)

response?=?self.opener.open(request)

#獲取其中的內(nèi)容

content?=?response.read().decode('gbk')

#獲取狀態(tài)嗎

status?=?response.getcode()

#狀態(tài)碼為200,獲取成功

if?status?==?200:

print?u"獲取請(qǐng)求成功"

#\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801這六個(gè)字是請(qǐng)輸入驗(yàn)證碼的utf-8編碼

pattern?=?re.compile(u'\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801',re.S)

result?=?re.search(pattern,content)

print?content

#如果找到該字符,代表需要輸入驗(yàn)證碼

if?result:

print?u"此次安全驗(yàn)證異常,您需要輸入驗(yàn)證碼"

return?content

#否則不需要

else:

#返回結(jié)果直接帶有J_HToken字樣,表明直接驗(yàn)證通過

tokenPattern?=?re.compile('id="J_HToken"')

tokenMatch?=?re.search(tokenPattern,content)

if?tokenMatch:

print?u"此次安全驗(yàn)證通過,您這次不需要輸入驗(yàn)證碼"

return?False

else:

print?u"獲取請(qǐng)求失敗"

return?None

#得到驗(yàn)證碼圖片

def?getCheckCode(self,page):

#得到驗(yàn)證碼的圖片

pattern?=?re.compile('

#匹配的結(jié)果

matchResult?=?re.search(pattern,page)

#已經(jīng)匹配得到內(nèi)容,并且驗(yàn)證碼圖片鏈接不為空

if?matchResult?and?matchResult.group(1):

print?matchResult.group(1)

return?matchResult.group(1)

else:

print?u"沒有找到驗(yàn)證碼內(nèi)容"

return?False

#輸入驗(yàn)證碼,重新請(qǐng)求,如果驗(yàn)證成功,則返回J_HToken

def?loginWithCheckCode(self):

#提示用戶輸入驗(yàn)證碼

checkcode?=?raw_input('請(qǐng)輸入驗(yàn)證碼:')

#將驗(yàn)證碼重新添加到post的數(shù)據(jù)中

self.post['TPL_checkcode']?=?checkcode

#對(duì)post數(shù)據(jù)重新進(jìn)行編碼

self.postData?=?urllib.urlencode(self.post)

try:

#再次構(gòu)建請(qǐng)求,加入驗(yàn)證碼之后的第二次登錄嘗試

request?=?urllib2.Request(self.loginURL,self.postData,self.loginHeaders)

#得到第一次登錄嘗試的相應(yīng)

response?=?self.opener.open(request)

#獲取其中的內(nèi)容

content?=?response.read().decode('gbk')

#檢測驗(yàn)證碼錯(cuò)誤的正則表達(dá)式,\u9a8c\u8bc1\u7801\u9519\u8bef?是驗(yàn)證碼錯(cuò)誤五個(gè)字的編碼

pattern?=?re.compile(u'\u9a8c\u8bc1\u7801\u9519\u8bef',re.S)

result?=?re.search(pattern,content)

#如果返回頁面包括了,驗(yàn)證碼錯(cuò)誤五個(gè)字

if?result:

print?u"驗(yàn)證碼輸入錯(cuò)誤"

return?False

else:

#返回結(jié)果直接帶有J_HToken字樣,說明驗(yàn)證碼輸入成功,成功跳轉(zhuǎn)到了獲取HToken的界面

tokenPattern?=?re.compile('id="J_HToken"?value="(.*?)"')

tokenMatch?=?re.search(tokenPattern,content)

#如果匹配成功,找到了J_HToken

if?tokenMatch:

print?u"驗(yàn)證碼輸入正確"

print?tokenMatch.group(1)

return?tokenMatch.group(1)

else:

#匹配失敗,J_Token獲取失敗

print?u"J_Token獲取失敗"

return?False

except?urllib2.HTTPError,?e:

print?u"連接服務(wù)器出錯(cuò),錯(cuò)誤原因",e.reason

return?False

#程序運(yùn)行主干

def?main(self):

#是否需要驗(yàn)證碼,是則得到頁面內(nèi)容,不是則返回False

needResult?=?self.needCheckCode()

#請(qǐng)求獲取失敗,得到的結(jié)果是None

if?not?needResult?==None:

if?not?needResult?==?False:

print?u"您需要手動(dòng)輸入驗(yàn)證碼"

idenCode?=?self.getCheckCode(needResult)

#得到了驗(yàn)證碼的鏈接

if?not?idenCode?==?False:

print?u"驗(yàn)證碼獲取成功"

print?u"請(qǐng)?jiān)跒g覽器中輸入您看到的驗(yàn)證碼"

webbrowser.open_new_tab(idenCode)

J_HToken?=?self.loginWithCheckCode()

print?"J_HToken",J_HToken

#驗(yàn)證碼鏈接為空,無效驗(yàn)證碼

else:

print?u"驗(yàn)證碼獲取失敗,請(qǐng)重試"

else:

print?u"不需要輸入驗(yàn)證碼"

else:

print?u"請(qǐng)求登錄頁面失敗,無法確認(rèn)是否需要驗(yàn)證碼"

taobao?=?Taobao()

taobao.main()

現(xiàn)在的運(yùn)行結(jié)果是這樣的,我們已經(jīng)可以得到 J_HToken 了,離成功又邁進(jìn)了一步。

好,到現(xiàn)在為止,我們應(yīng)該可以獲取到J_HToken的值啦。

利用J_HToken獲取st

st也是一個(gè)經(jīng)計(jì)算得到的code,可以這么理解,st是淘寶后臺(tái)利用J_HToken以及其他數(shù)據(jù)經(jīng)過計(jì)算之后得到的,可以利用st和用戶名直接用get方式登錄,所以st可以理解為一個(gè)秘鑰。這個(gè)st值只會(huì)使用一次,如果第二次用get方式登錄則會(huì)失效。所以它是一次性使用的。

下面J_HToken計(jì)算st的方法如下

#通過token獲得st

def?getSTbyToken(self,token):

tokenURL?=?'https://passport.alipay.com/mini_apply_st.js?site=0&token=%s&callback=stCallback6'?%?token

request?=?urllib2.Request(tokenURL)

response?=?urllib2.urlopen(request)

#處理st,獲得用戶淘寶主頁的登錄地址

pattern?=?re.compile('{"st":"(.*?)"}',re.S)

result?=?re.search(pattern,response.read())

#如果成功匹配

if?result:

print?u"成功獲取st碼"

#獲取st的值

st?=?result.group(1)

return?st

else:

print?u"未匹配到st"

return?False

直接利用st登錄

得到st之后,基本上就大功告成啦,一段辛苦終于沒有白費(fèi),你可以直接構(gòu)建get方式請(qǐng)求的URL,直接訪問這個(gè)URL便可以實(shí)現(xiàn)登錄。

stURL?=?'https://login.taobao.com/member/vst.htm?st=%s&TPL_username=%s'?%?(st,username)

比如

https://login.taobao.com/member/vst.htm?st=1uynJELa4hKfsfWU3OjPJCw&TPL_username=cqcre

直接訪問該鏈接即可實(shí)現(xiàn)登錄,不過我這個(gè)應(yīng)該已經(jīng)失效了吧~

代碼在這先不貼了,剩下的一起貼了~

獲取已買到的寶貝頁面

已買到的寶貝的頁面地址是

http://buyer.trade.taobao.com/trade/itemlist/list_bought_items.htm

另外還有頁碼的參數(shù)。

重新構(gòu)建一個(gè)帶有cookie的opener,將上面的帶有st的URL打開,保存它的cookie,然后再利用這個(gè)opener打開已買到的寶貝的頁面,你就會(huì)得到已買到的寶貝頁面詳情了。

#獲得已買到的寶貝頁面

def?getGoodsPage(self,pageIndex):

goodsURL?=?'http://buyer.trade.taobao.com/trade/itemlist/listBoughtItems.htm?action=itemlist/QueryAction&event_submit_do_query=1&pageNum='?+?str(pageIndex)

response?=?self.newOpener.open(goodsURL)

page?=??response.read().decode('gbk')

return?page

正則表達(dá)式提取信息

這是我的已買到的寶貝界面,審查元素可以看到,每一個(gè)寶貝都是tbody標(biāo)簽包圍著。

我們現(xiàn)在想獲取訂單時(shí)間,訂單號(hào),賣家店鋪名稱,寶貝名稱,原價(jià),購買數(shù)量,最后付款多少,交易狀態(tài)這幾個(gè)量,具體就不再分析啦

更多web知識(shí)和爬蟲知識(shí)可以關(guān)注博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 大家好,上次我們實(shí)驗(yàn)了爬取了糗事百科的段子,那么這次我們來嘗試一下爬取百度貼吧的帖子。與上一篇不同的是,這次我們需...
    追不到的那縷風(fēng)閱讀 585評(píng)論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,422評(píng)論 25 708
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,536評(píng)論 0 17
  • 漂亮本身就是一種稀缺資源,不要羨慕嫉妒美女所擁有的一切,從古至今,美貌就是一張?zhí)厥獾耐ㄐ凶C。從王朝到市井,從領(lǐng)袖到...
    青綠十一閱讀 273評(píng)論 4 3
  • 一、是什么直接的原因促使你加入呆萌? 絕對(duì)不不不是因?yàn)楹闷娑尤氲模翘鞜o意間看到課程介紹,老師頭像笑容可親...
    夜初闌閱讀 245評(píng)論 3 1