人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

python爬蟲之利用selenium+opencv識別滑動驗證并模擬登陸知乎功能

發(fā)布日期:2022-01-04 09:01 | 文章來源:gibhub

滑動驗證距離

分別獲取驗證碼背景圖和滑塊圖兩張照片,然后利用opencv庫,通過高斯模糊和Canny算法進行處理,然后通過matchTemplate方法進行兩張圖的匹配,獲得滑動距離。需要注意的是,知乎驗證碼在進行操作的時候,需要在原有基礎(chǔ)上再向右偏移10px距離

def get_distance(self, bg_img_path='./bg.png', slider_img_path='./slider.png'):
  """獲取滑塊移動距離"""
  # 背景圖片處理
  bg_img = cv.imread(bg_img_path, 0)  # 讀入灰度圖片
  bg_img = cv.GaussianBlur(bg_img, (3, 3), 0)  # 高斯模糊去噪
  bg_img = cv.Canny(bg_img, 50, 150)  # Canny算法進行邊緣檢測
  # 滑塊做同樣處理
  slider_img = cv.imread(slider_img_path, 0)
  slider_img = cv.GaussianBlur(slider_img, (3, 3), 0)
  slider_img = cv.Canny(slider_img, 50, 150)
  # 尋找最佳匹配
  res = cv.matchTemplate(bg_img, slider_img, cv.TM_CCOEFF_NORMED)
  # 最小值,最大值,并得到最小值, 最大值的索引
  min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
  # 例如:(-0.05772797390818596, 0.30968162417411804, (0, 0), (196, 1))
  top_left = max_loc[0]  # 橫坐標
  return top_left

滑塊運動軌跡

模擬人的行為,到缺口位置時,繼續(xù)向后滑動一段距離,然后再回退到準確位置

def get_tracks(self, distance):
  '''滑動軌跡 '''
  tracks = []
  v = 0
  t = 0.2  # 單位時間
  current = 0  # 滑塊當前位移
  distance += 10  # 多移動10px,然后回退
  while current < distance:
if current < distance * 5 / 8:
 a = random.randint(1, 3)
else:
 a = -random.randint(2, 4)
v0 = v  # 初速度
track = v0 * t + 0.5 * a * (t ** 2)  # 單位時間(0.2s)的滑動距離
tracks.append(round(track))  # 加入軌跡
current += round(track)
v = v0 + a * t
  #回退到大致位置
  for i in range(5):
tracks.append(-random.randint(1, 3))
  return tracks

鼠標滑動操作

通過selenium中的鼠標動作鏈,按照滑動軌跡進行滑動

def mouse_move(self,slide,tracks):
  '''鼠標滑動'''
  #鼠標點擊滑塊并按照不放
  ActionChains(self.driver).click_and_hold(slide).perform()
  #按照軌跡進行滑動,
  for track in tracks:
ActionChains(self.driver).move_by_offset(track, 0).perform() 
  ActionChains(self.driver).release(slide).perform()

規(guī)避知乎selenium檢測

使用selenium自動化測試爬取知乎的時候出現(xiàn)了:錯誤代碼10001:請求異常請升級客戶端后重新嘗試,這個錯誤的產(chǎn)生是由于知乎可以檢測selenium自動化測試的腳本

使用chrome的遠程調(diào)試模式結(jié)合selenium來遙控操作chrome進行抓取,這樣就會規(guī)避selenium被網(wǎng)站檢測到

添加環(huán)境變量

將chrome.exe的目錄添加到系統(tǒng)環(huán)境變量,比如C:\Program Files\Google\Chrome\Application,這樣就可以直接在命令行輸入chrome.exe啟動瀏覽器

打開cmd窗口,執(zhí)行命令

chrome.exe --remote-debugging-port=9222 --user-data-dir="E:\eliwang\selenium_data"

注意端口不要被占用,user-data-dir用來指明配置文件的路徑,自定義

此時會開啟瀏覽器,并打開一個新的標簽頁

selenium接管的主要代碼

options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

關(guān)閉瀏覽器窗口

1、使用瀏覽器對象的close()方法,quit()方法不行。

2、手動打開,手動關(guān)閉

完整登陸代碼

# coding:utf-8
import cv2 as cv
import time
import random
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as WAIT
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from urllib.request import urlretrieve

class Zhihu_login:
 '''知乎模擬登陸'''
 def __init__(self):
  options = webdriver.ChromeOptions()
  #操控chrome瀏覽器
  options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
  self.driver = webdriver.Chrome(options=options)
  self.wait = WAIT(self.driver, 5)
  self.url = 'https://www.zhihu.com/'
  self.bg_img_path = './bg.png'
  self.slider_img_path = './slider.png'

 def run(self):
  '''執(zhí)行入口'''
  self.driver.get(self.url)
  try:
if WAIT(self.driver,3).until(EC.presence_of_element_located((By.ID,'Popover15-toggle'))):
 print('登陸成功')
 self.save_cookie()
 self.driver.close()
  except:
# 切換到密碼登陸
self.wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(@class,"SignFlow-tabs")]/div[2]'))).click()
name_input = self.driver.find_element_by_name('username')
name_input.clear()
name_input.send_keys('賬號')
pass_input = self.driver.find_element_by_name('password')
pass_input.clear()
pass_input.send_keys('密碼')
self.wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@type="submit"]'))).click()  # 點擊登陸按鈕
time.sleep(1)
#進行滑動驗證,最多嘗試5次重新驗證
if self.slide_verify():
 print('登陸成功')
 self.save_cookie()
 self.driver.close()
else:
 print('第1次登陸失敗')
 for i in range(4):
  print('正在嘗試第%d次登陸'%(i+2))
  if self.slide_verify():print('第%d次登陸成功'%(i+2))self.save_cookie()self.driver.close()return
  print('第%d次登陸失敗' % (i + 2))
 print('登陸失敗5次,停止登陸')
 self.driver.close()

 def slide_verify(self):
  '''滑動驗證'''
  slider_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//div[@class="yidun_slider"]')))
  self.bg_img_url = self.wait.until(EC.presence_of_element_located((By.XPATH, '//img[@class="yidun_bg-img"]'))).get_attribute('src')  # 獲取驗證碼背景圖url
  self.slider_img_url = self.wait.until(EC.presence_of_element_located((By.XPATH, '//img[@class="yidun_jigsaw"]'))).get_attribute('src')  # 獲取驗證碼滑塊圖url
  urlretrieve(self.bg_img_url, self.bg_img_path)
  urlretrieve(self.slider_img_url, self.slider_img_path)
  distance = self.get_distance(self.bg_img_path, self.slider_img_path)
  distance += 10  # 實際移動距離需要向右偏移10px
  tracks = self.get_tracks(distance)
  self.mouse_move(slider_button,tracks)
  try:
element = self.wait.until(EC.presence_of_element_located((By.ID,'Popover15-toggle')))
  except:
return False
  else:
return True
 def save_cookie(self):
  cookie = {}
  for item in self.driver.get_cookies():
cookie[item['name']] = item['value']
  print(cookie)
  print('成功獲取登陸知乎后的cookie信息')

 def mouse_move(self,slide,tracks):
  '''鼠標滑動'''
  #鼠標點擊滑塊并按照不放
  ActionChains(self.driver).click_and_hold(slide).perform()
  #按照軌跡進行滑動,
  for track in tracks:
ActionChains(self.driver).move_by_offset(track, 0).perform()
  ActionChains(self.driver).release(slide).perform()

 def get_distance(self, bg_img_path='./bg.png', slider_img_path='./slider.png'):
  """獲取滑塊移動距離"""
  # 背景圖片處理
  bg_img = cv.imread(bg_img_path, 0)  # 讀入灰度圖片
  bg_img = cv.GaussianBlur(bg_img, (3, 3), 0)  # 高斯模糊去噪
  bg_img = cv.Canny(bg_img, 50, 150)  # Canny算法進行邊緣檢測
  # 滑塊做同樣處理
  slider_img = cv.imread(slider_img_path, 0)
  slider_img = cv.GaussianBlur(slider_img, (3, 3), 0)
  slider_img = cv.Canny(slider_img, 50, 150)
  # 尋找最佳匹配
  res = cv.matchTemplate(bg_img, slider_img, cv.TM_CCOEFF_NORMED)
  # 最小值,最大值,并得到最小值, 最大值的索引
  min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
  # 例如:(-0.05772797390818596, 0.30968162417411804, (0, 0), (196, 1))
  top_left = max_loc[0]  # 橫坐標
  return top_left

 def get_tracks(self, distance):
  '''滑動軌跡 '''
  tracks = []
  v = 0
  t = 0.2  # 單位時間
  current = 0  # 滑塊當前位移
  distance += 10  # 多移動10px,然后回退
  while current < distance:
if current < distance * 5 / 8:
 a = random.randint(1, 3)
else:
 a = -random.randint(2, 4)
v0 = v  # 初速度
track = v0 * t + 0.5 * a * (t ** 2)  # 單位時間(0.2s)的滑動距離
tracks.append(round(track))  # 加入軌跡
current += round(track)
v = v0 + a * t
  #回退到大致位置
  for i in range(5):
tracks.append(-random.randint(1, 3))
  return tracks

if __name__ == '__main__':
 Zhihu_login().run()

到此這篇關(guān)于python爬蟲之利用selenium+opencv識別滑動驗證并模擬登陸知乎的文章就介紹到這了,更多相關(guān)selenium+opencv滑動驗證內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部