什么?登錄?還模擬登錄?
登錄一個網(wǎng)頁對于我們再熟悉不過了。無論是生活當(dāng)中登錄網(wǎng)頁獲取MM圖片,或者是工作當(dāng)中登錄公司網(wǎng)站(如WIKI,jira等)。球都嘛得。。雖然我每天都登錄,但是我可以儲存自己的賬號和密碼???為什么要模擬登錄?
舉個李子,拿額們公司需求為例,之前每次發(fā)版,都要從我們公司的wiki里面手動拷貝需求列表,然后發(fā)送質(zhì)量報告郵件。這樣繁瑣重復(fù)的工作我們當(dāng)然不能忍啦,就想著可以通過腳本實現(xiàn)自動化(畢竟我們勤奮的目的就是將來讓我們變得更懶,??)。
吶,有了這個構(gòu)思,我們就開始實戰(zhàn)吧!
這里我選用python完成這一工作,畢竟在爬蟲領(lǐng)域無出其右者。你可以選擇urllib來實現(xiàn),這里我用requests來實現(xiàn)。
requests庫實現(xiàn)模擬登錄獲取數(shù)據(jù)其實大概分三部曲:
get請求登錄url->post請求進行登錄操作->對相應(yīng)的url進行數(shù)據(jù)獲取
第一、get請求登錄url
為什么要這樣做?這里可能會有些疑惑,我們直接攜帶我們的登錄賬號和密碼,post請求不就登錄上去來么?這一步的意義是什么?
是這樣的,我們的登錄操作看似只是填寫來用戶名和密碼,但是有些網(wǎng)站它會攜帶用戶不可見的token作為參數(shù)進行傳遞。我們可以看下圖:

有些網(wǎng)站都會將這些token也作為參數(shù)進行傳遞,讓服務(wù)器端進行校驗。
那。。我們寫死,也傳這個token,value直接傳這個content的值,不可以么?
遺憾的是,大部分網(wǎng)站的登錄token通過每次的get請求都是不同的,可能這次你請求的是這個token,下次就完全變了樣了。。
這個時候,requests.session就給我們極大的便利咯。平常情況下,我們都是直接requests.get或者requests.post進行網(wǎng)絡(luò)數(shù)據(jù)請求。而你每進行一次這種操作都可以理解為你重新打開了一個新的網(wǎng)頁,而session的好處是它可以保證我們操作的是同一個頁面。這次我們先初始化一個session:
mySession = requests.session()
然后我們用session去請求login_url:
response = mySession.get(login_url, verify=False).text
現(xiàn)在我們就得到登錄的各種數(shù)據(jù)了,怎么拿到這個token呢?因為這里我們只拿token,所以可以略使小技,用一個寫死的正則表達式來獲取:
strToken = r'''<meta id="atlassian-token" name="atlassian-token" content=(.*?)>'''
userToken = re.findall(strToken, response)[0]
到這一步,我們就完成第一步咯!
第二、post請求進行登錄操作
其實這一步就很簡單了,也不一定用post進行登錄,根據(jù)不同的網(wǎng)站用不同請求。先把我們剛剛獲取的token放入?yún)?shù)dict:
loginPayload = {'atlassian-token':userToken, 'login':你的用戶名,'password':你的密碼}
這里仍然用剛剛初始化的那個session:
loginResult = mySession.post(login_url, data=loginPayload)
這樣,我們就完成了登錄操作。
第三、對相應(yīng)的url進行數(shù)據(jù)獲取
這一步就更加簡單了,直接對需要獲取數(shù)據(jù)的url進行爬取就可以了
queryResponse = mySession.get(queryUrl, verify=False)
?其中queryUrl就是你要爬取數(shù)據(jù)的鏈接,后續(xù)可以手動進行傳入。
獲取到queryResponse之后,剩下的就是對數(shù)據(jù)進行解析的操作了。你可以利用高大上的beautifulsoup,也可以用python的htmlpaser,或者xpath等等,相信后續(xù)操作大家都知道怎么辦啦!