這段時間因為要爬微博的數據,而微博很多數據都是要在登陸狀態之下才能訪問,所以就寫了兩個版本的微博cookie池,第一個是學習崔大神課程時候改寫的,也是比較簡單暴力的,只要網頁不改就能一直有效,因為用的是selenium,第二個呢是抓包分析登陸時候的請求以及賬號密碼的登陸方式,用requests實現的,效率高速度快,但是只要微博改了加密算法,那就完了,今天我這里先分享第一個用selenium版本的cookie池,該腳本主要啟動兩個進程,一個是根據數據庫的賬戶密碼獲取cookie,另一個是定時檢驗數據庫cookie的有效性,運行之前我們是需要按照一定格式將賬號錄入數據庫的,githubhttps://github.com/xiaobeibei26/weibo_cookies
先看登陸界面網址http://my.sina.com.cn/profile/unlogin
注意到,這里填了用戶名以及密碼之后是要填驗證碼的,我們先用selenium將用戶名密碼填上,然后如果出現了驗證碼,我們就向在線打碼平臺發送請求,獲取驗證碼,最后再填入瀏覽器登陸。先看一下selenium的操作
def new_cookies(self,username,password):
print('正在從賬號{}獲取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()#如果沒有驗證碼就直接登陸了,接下來就檢驗登陸是否成功
try:
time.sleep(1)
delay=self.browser.find_element_by_class_name('login_error_tips').text
print(delay)
if '登陸' in delay:
print('遇到登陸限制,進入睡眠一段時間')
time.sleep(1800)
submit.click()
name,cook=self.suceess_login(username)
if name and cook:
return name,cook
if '錯誤' in delay:
print('用戶名密碼錯誤,更換賬號')
return None
except Exception as e:#如果超時,則出現了驗證碼
print('出現驗證碼,開始識別')
#先找到驗證碼的圖片地址,然后發去在線打碼平臺
except WebDriverException as e:#有些賬號密碼錯誤我也沒有辦法
print('該賬號訪問失敗')
用selenium打開網頁輸入用戶名密碼之后,這里主要分三種情況,如果沒有驗證碼則直接登陸,如果遇到登陸限制則休眠起來,如果遇到驗證碼則把圖片發送至打碼平臺然后等待獲取到驗證碼結果再登陸,登陸成功之后會有一個訪問個人測試的小主頁,之后就是把cookie錄入redis的數據庫。
另外一個定期檢查cookie的進程是利用requests庫訪問個人主頁,根據返回的結果判斷cookie是否有效,無效則刪除,檢驗的代碼比較簡單,如圖
接下來看看怎么處理驗證碼,當出現驗證碼的時候,要將訪問驗證碼圖片的content發送給打碼平臺,這是打碼文件里面的一個主要函數,把需要提交的內容提交上去就好了
值得一提的是cookie池每次是登陸那些數據庫里面沒有cookie的賬號,有cookie的賬號是不登陸的,直至cookie失效才登陸,最后我們看一下數據庫