python 模拟登陆智联_Python+scrapy爬虫之模拟登陆
生活随笔
收集整理的這篇文章主要介紹了
python 模拟登陆智联_Python+scrapy爬虫之模拟登陆
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、126,163郵箱模擬登陸
# -*- coding:utf-8 -*-import timefrom selenium import webdriverdef login126_or_163emall(url): login_name = input("請輸入賬號:") login_password = input("請輸入密碼:") # 打開自動測試軟件Chrome driver = webdriver.Chrome(executable_path="D:chromedriver.exe") # 模擬窗口最大化 driver.maximize_window() # 打開目標網站 driver.get(url=url) time.sleep(10) # 切換為密碼登錄 password_login_button = driver.find_element_by_id("lbNormal") password_login_button.click() # 由于126郵箱是iframe嵌套,所以要切換到iframe窗口 elem = driver.find_element_by_css_selector("iframe[id^='x-URS-iframe']") # 用frame的index來定位,定位iframe窗口 driver.switch_to.frame(elem) # 定位到賬號輸入框,不需要輸入@126.com user_name = driver.find_element_by_name("email") user_name.send_keys(login_name) # 定位到密碼輸入框 user_password = driver.find_element_by_name("password") user_password.send_keys(login_password) time.sleep(3) # 定位到登錄按鈕 login_button = driver.find_element_by_id("dologin") login_button.click() time.sleep(5) # 獲取用戶登錄的cookies,返回一個字典 cookies = driver.get_cookies()[0] print(cookies) time.sleep(10) # 關閉模擬瀏覽器窗口 driver.close()if __name__ == '__main__': # url = "https://mail.126.com/" # 126郵箱url url = "https://mail.163.com/" # 163郵箱url login126_or_163emall(url=url)輸出的cookies如下:
"""{'domain': '.163.com', 'expiry': 4717308714, 'httpOnly': False, 'name': '_ntes_nnid', 'path': '/', 'secure': False, 'value': 'cf36cf83b0562fccb3ab872f3b1dfa4c,1563708714807'} """二、B站模擬登陸
import timeimport randomfrom PIL import Imagefrom io import BytesIOfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECborder = 6 # 滑塊左邊框到驗證圖片左邊框的距離class CrackGeetest(): def __init__(self): self.url = 'https://passport.bilibili.com/login' self.browser = webdriver.Chrome(r"D:chromedriver.exe") # 設置瀏覽器為最大窗口 self.browser.maximize_window() self.wait = WebDriverWait(self.browser,timeout=5) def close(self): self.browser.close() # 關閉瀏覽器 self.browser.quit() # 退出并停止執行chromedriver.exe # 獲取帶缺口的圖片 def get_geetest_image(self, name='captcha.png'): # 獲取完整的驗證圖片 img = self.wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[2]/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]'))) time.sleep(2) location = img.location # 獲取元素位置 size = img.size # 獲取元素尺寸 print(location,size) top = location['y'] bottom = location['y'] + size['height'] left = location['x'] right = location['x'] + size['width'] print('驗證碼位置', top, bottom, left, right) # 獲取當前窗口的屏幕截圖(二進制數據) screenshot = self.browser.get_screenshot_as_png() # 使用BytesIO對象在內存中讀寫bytes(就是讀取截圖) screenshot = Image.open(BytesIO(screenshot)) screenshot.save(r"D:photoimagescreenshot.png" ) # 按照圖片驗證碼的大小尺寸進行剪切 captcha = screenshot.crop((left, top, right, bottom)) # 將圖片驗證碼保存到指定路徑 captcha.save(r"D:photoimage%s"%name) return captcha # 獲取缺口位置 def get_gap(self, img1, img2): left = 60 # 滑塊的寬度+滑塊左邊框到驗證圖片左邊框的距離 for i in range(left, img1.size[0]): # 遍歷不帶缺口的圖片img1的RGB像素點 for j in range(img1.size[1]): if not self.is_pixel_equal(img1, img2, i, j): # 判斷兩張圖片同一位置的像素點是否相等 left = i return left return left # 判斷兩張驗證圖片同一位置的像素點是否相同 def is_pixel_equal(self, img1, img2, x, y): # 取兩個圖片的像素點 pix1 = img1.load()[x,y] pix2 = img2.load()[x,y] threshold = 60 # 閾值 pix_r = abs(pix1[0] - pix2[0]) # R pix_g = abs(pix1[1] - pix2[1]) # G pix_b = abs(pix1[2] - pix2[2]) # B if (pix_r < threshold) and (pix_g < threshold) and (pix_b < threshold): return True else: return False # 獲取移動軌跡 def get_track(self, distance): track = [] # 移動軌跡 current = 0 # 當前位移 mid = distance * 3 / 4 # 減速閾值 t = random.randint(2,3)/10 # 計算間隔 v = 0 # 初速度 distance += 5 while current < distance: # 判斷當前位移是否小于缺口距離 if current < mid: # 如果當前位移小于減速的閾值 a = 2 # 則加速度為正 else: a = -3 # 否則加速度為負 v0 = v # 初速度v0 v = v0 + a * t # 當前速度v (v = v0 + at) x = v0*t + 1/2*a*t*t # 移動距離x (x = v0t + 0.5at^2) current += x # 當前位移 track.append(round(x)) # 加入軌跡(round為四舍五入) return track # 移動缺口滑塊 def move_to_gap(self, slider, tracks): """ :param slider: 滑塊 :param tracks: 移動軌跡 """ random.shuffle(tracks) # 創建一個鼠標移動的動作鏈,在滑塊上按住的鼠標左鍵,并執行。 ActionChains(self.browser).click_and_hold(slider).perform() # 正向移動軌跡 for x in tracks: # 創建一個鼠標移動的動作鏈,將鼠標移動到當前鼠標位置的偏移位置(x,0)上,并執行。 ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform() # 模擬人工滑動超過缺口位置返回至缺口的情況,同時還加入了隨機數,都是為了更貼近人工滑動軌跡 action = ActionChains(self.browser).move_by_offset(xoffset=-1, yoffset=0) time.sleep(0.015) action.perform() time.sleep(random.randint(6, 10) / 10) action.perform() time.sleep(0.04) action.perform() time.sleep(random.randint(6, 10) / 10) action.perform() time.sleep(0.019) action.perform() time.sleep(random.randint(6, 10) / 10) ActionChains(self.browser).move_by_offset(xoffset=1, yoffset=0).perform() # 模擬抖動(由于釋放鼠標是會產生抖動) ActionChains(self.browser).move_by_offset(xoffset=-3, yoffset=0).perform() ActionChains(self.browser).move_by_offset(xoffset=2, yoffset=0).perform() time.sleep(0.5) # 創建一個鼠標行為的動作鏈,釋放滑塊上的鼠標按鈕,并執行。 ActionChains(self.browser).release().perform() def crack(self): try: # 打開網頁 self.browser.get(self.url) # 獲取用戶名輸入框 emall = self.wait.until(EC.presence_of_all_elements_located((By.XPATH,'//*[@id="login-username"]')))[0] # 獲取密碼輸入框 password = self.wait.until(EC.presence_of_all_elements_located((By.XPATH,'//*[@id="login-passwd"]')))[0] # 發送用戶名 emall.send_keys("15612345678") # 發送密碼 password.send_keys("1234567890") # 點擊登錄按鈕使之顯示驗證圖片 loginbutton = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="geetest-wrap"]/ul/li[5]/a[1]'))) loginbutton.click() # 確認驗證圖片加載完成(獲取完整的驗證碼div) self.wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[2]/div[2]/div[6]/div'))) # 獲取移動滑塊(slider:滑塊) slider = self.wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div[2]/div[6]/div/div[1]/div[2]/div[2]'))) # 獲取帶缺口的驗證碼圖片(完整的驗證圖片) image1 = self.get_geetest_image('captcha1.png') #========= 在當前窗口執行JavaScript語句(由于驗證碼原圖被切分成搞多塊)=========# # 組合驗證碼方法一: element = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'canvas.geetest_canvas_fullbg.geetest_fade.geetest_absolute'))) self.browser.execute_script("arguments[0].style=arguments[1]",element,"display: block;") # 組合驗證碼方法二:(本人建議使用此方法) # self.browser.execute_script('document.querySelectorAll("canvas")[2].style=""') # 獲取缺塊兒驗證碼 # self.browser.execute_script('document.querySelectorAll("canvas")[3].style=""') # 獲取完整的驗證碼 # 獲取帶缺口的驗證碼圖片(不完整的驗證圖片) image2 = self.get_geetest_image('captcha2.png') # 調用獲取缺口位置函數(滑塊的位置) gap = self.get_gap(image1, image2) # 減點滑塊左邊框到驗證圖片左邊框的距離 gap -= border print('滑塊的位置', gap) # 調用獲取移動軌跡函數(track:移動軌跡) track = self.get_track(gap) # 調用移動缺口滑塊函數進行滑動 self.move_to_gap(slider, track) time.sleep(1) # 獲取驗證完成后返回的數據“驗證成功” success = self.wait.until(EC.text_to_be_present_in_element((By.XPATH, '/html/body/div[2]/div[2]/div[3]/div[2]'), '驗證成功')) print(success) time.sleep(5) # 關閉瀏覽器 self.close() except: print('Failed-Retry') # 失敗重試 self.crack()if __name__ == '__main__': crack = CrackGeetest() crack.crack()由于嗶哩嗶哩驗證碼是極驗的滑動驗證碼,驗證碼圖片是由很多個小塊圖片碎片組合而成,所以解決辦法如下:
#========= 在當前窗口執行JavaScript語句(由于驗證碼原圖被切分成搞多塊)=========# # 組合驗證碼方法一: element = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'canvas.geetest_canvas_fullbg.geetest_fade.geetest_absolute'))) self.browser.execute_script("arguments[0].style=arguments[1]",element,"display: block;") # 組合驗證碼方法二:(本人建議使用此方法) # self.browser.execute_script('document.querySelectorAll("canvas")[2].style=""') # 獲取缺塊兒驗證碼 # self.browser.execute_script('document.querySelectorAll("canvas")[3].style=""') # 獲取完整的驗證碼最后就是運行了,運行結果就不展示了,測試了一下成功了還是特別高的。
總結
以上是生活随笔為你收集整理的python 模拟登陆智联_Python+scrapy爬虫之模拟登陆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java用继承编写宠物乐园_MoreTh
- 下一篇: python安装第三方库太慢_Pytho