這段時(shí)間因?yàn)橐牢⒉┑臄?shù)據(jù),而微博很多數(shù)據(jù)都是要在登陸狀態(tài)之下才能訪問蜡坊,所以就寫了兩個(gè)版本的微博cookie池芥颈,第一個(gè)是學(xué)習(xí)崔大神課程時(shí)候改寫的档礁,也是比較簡(jiǎn)單暴力的角钩,只要網(wǎng)頁不改就能一直有效,因?yàn)橛玫氖莝elenium呻澜,第二個(gè)呢是抓包分析登陸時(shí)候的請(qǐng)求以及賬號(hào)密碼的登陸方式递礼,用requests實(shí)現(xiàn)的,效率高速度快羹幸,但是只要微博改了加密算法脊髓,那就完了,今天我這里先分享第一個(gè)用selenium版本的cookie池栅受,該腳本主要啟動(dòng)兩個(gè)進(jìn)程将硝,一個(gè)是根據(jù)數(shù)據(jù)庫的賬戶密碼獲取cookie,另一個(gè)是定時(shí)檢驗(yàn)數(shù)據(jù)庫cookie的有效性屏镊,運(yùn)行之前我們是需要按照一定格式將賬號(hào)錄入數(shù)據(jù)庫的,githubhttps://github.com/xiaobeibei26/weibo_cookies
先看登陸界面網(wǎng)址http://my.sina.com.cn/profile/unlogin
注意到依疼,這里填了用戶名以及密碼之后是要填驗(yàn)證碼的,我們先用selenium將用戶名密碼填上而芥,然后如果出現(xiàn)了驗(yàn)證碼律罢,我們就向在線打碼平臺(tái)發(fā)送請(qǐng)求,獲取驗(yàn)證碼棍丐,最后再填入瀏覽器登陸误辑。先看一下selenium的操作
def new_cookies(self,username,password):
print('正在從賬號(hào){}獲取cookie'.format(username))
# self.browser.delete_cookie('name')
# self.browser.delete_cookie('value')
self.browser.delete_all_cookies()
time.sleep(1)
self.browser.get('http://my.sina.com.cn/profile/unlogin')
wait = WebDriverWait(self.browser,10)
# time.sleep(4)
try:#找到登陸的用戶名密碼輸入框
login = wait.until(EC.visibility_of_element_located((By.ID, 'hd_login')))
login.click()
user = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, '.loginformlist input[name="loginname"]')))
user.send_keys(username)
psd = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, '.loginformlist input[name="password"]')))
psd.send_keys(password)
submit = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.login_btn')))
submit.click()#如果沒有驗(yàn)證碼就直接登陸了,接下來就檢驗(yàn)登陸是否成功
try:
time.sleep(1)
delay=self.browser.find_element_by_class_name('login_error_tips').text
print(delay)
if '登陸' in delay:
print('遇到登陸限制歌逢,進(jìn)入睡眠一段時(shí)間')
time.sleep(1800)
submit.click()
name,cook=self.suceess_login(username)
if name and cook:
return name,cook
if '錯(cuò)誤' in delay:
print('用戶名密碼錯(cuò)誤巾钉,更換賬號(hào)')
return None
except Exception as e:#如果超時(shí),則出現(xiàn)了驗(yàn)證碼
print('出現(xiàn)驗(yàn)證碼秘案,開始識(shí)別')
#先找到驗(yàn)證碼的圖片地址睛琳,然后發(fā)去在線打碼平臺(tái)
except WebDriverException as e:#有些賬號(hào)密碼錯(cuò)誤我也沒有辦法
print('該賬號(hào)訪問失敗')
用selenium打開網(wǎng)頁輸入用戶名密碼之后盒蟆,這里主要分三種情況,如果沒有驗(yàn)證碼則直接登陸师骗,如果遇到登陸限制則休眠起來历等,如果遇到驗(yàn)證碼則把圖片發(fā)送至打碼平臺(tái)然后等待獲取到驗(yàn)證碼結(jié)果再登陸,登陸成功之后會(huì)有一個(gè)訪問個(gè)人測(cè)試的小主頁辟癌,之后就是把cookie錄入redis的數(shù)據(jù)庫寒屯。
另外一個(gè)定期檢查cookie的進(jìn)程是利用requests庫訪問個(gè)人主頁,根據(jù)返回的結(jié)果判斷cookie是否有效黍少,無效則刪除寡夹,檢驗(yàn)的代碼比較簡(jiǎn)單,如圖
接下來看看怎么處理驗(yàn)證碼厂置,當(dāng)出現(xiàn)驗(yàn)證碼的時(shí)候菩掏,要將訪問驗(yàn)證碼圖片的content發(fā)送給打碼平臺(tái),這是打碼文件里面的一個(gè)主要函數(shù)昵济,把需要提交的內(nèi)容提交上去就好了
值得一提的是cookie池每次是登陸那些數(shù)據(jù)庫里面沒有cookie的賬號(hào)智绸,有cookie的賬號(hào)是不登陸的,直至cookie失效才登陸访忿,最后我們看一下數(shù)據(jù)庫