Python爬⾍模拟登陆,破解滑块验证码
简介
最近⽤了将近⼀周的时间,做了⼀个我也不知道有啥⽤的东西----Python爬⾍(京东)。
excel技巧当然重点不是这,相信不少像我这样的菜鸟在⽤Python弄爬⾍项⽬的时候,遇到最痛苦的就是被验证码拦在了门外,我也是花了好⼏天的时间去研究,终于解决了这⼀难关。
需要源码的⼩伙伴复制下⾯即可,有闲⼼情的可以继续看下去,听我叭叭⼏句(哈哈),记得把位置坐标啥的换了哈,还需要有selenium ⽕狐的插件,⼤家可以百度⼀下。
from urllib import request
from selenium import webdriver
import cv2
import random
import time
import pyautoguiblockinput
# 获取图⽚信息,返回最佳匹配位置
def findPic(target="img1.jpg", template="img2.png"):
# 读取图⽚
target_rgb = cv2.imread(target)压力容器按用途分为哪四大类
# 图⽚灰度化
target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY)
# 读取模块图⽚
template_rgb = cv2.imread(template,0)
# 匹配模块位置
res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED)
# 获取最佳匹配位置
value = cv2.minMaxLoc(res)
# 返回最佳X坐标
return value[2][0]
# 打开FireFox浏览器
driver = webdriver.Firefox()
<("passport.jd/new/login.aspx")
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/a').click()
driver.find_element_by_xpath('//*[@id="loginname"]').send_keys('123456')
driver.find_element_by_xpath('//*[@id="nloginpwd"]').send_keys('123456')
driver.find_element_by_xpath('//*[@id="loginsubmit"]').click()
while True:
try:
# 从⽹页上获取组件
target = driver.find_element_by_xpath('/html/body/div[4]/div/div/div/div[1]/div[2]/div[1]/img')
template = driver.find_element_by_xpath('/html/body/div[4]/div/div/div/div[1]/div[2]/div[2]/img')
# 获取模块的url路径
src1 = _attribute("src")
src2 = _attribute("src")
# 下载图⽚
request.urlretrieve(src1,"img1.jpg")
request.urlretrieve(src2,"img2.png")
x = findPic()
w1 = cv2.imread('img1.jpg').shape[1]
w2 = target.size['width']
x = x / w1 * w2
# 按钮坐标
offset_x,offset_y =875,466
# pyautogui库操作⿏标指针
offset_y += random.randint(9,19)
offset_y += random.randint(-9,0)
duration=random.randint(20,31)/100)
offset_y += random.randint(0,8)
duration=random.randint(20,40)/100)
offset_y += random.randint(-3,3)
offset_y += random.randint(-2,2)
time.sleep(1)
result = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[4]/div[2]/div').text
if'不匹配'in result:
print("账户名密码不匹配!", result)
break
except:
print("异常!")
前端画图的js插件break
技术
selenium
⽹上都说selenium是⼀个⾃动化测试的类库,其他的先不说,selenium⽤在爬⾍上是真的般配,⽤selenium实现模拟的登陆,操作页⾯上的各种组件,完全代替了⼈⼯,简直神器啊,细节我就不说了,初学的⼩伙伴可以先去了解⼀下selenium库。
账号输⼊,点击之后就是验证码的界⾯,这个时候就需要另⼀个神器了。
opencv
opencv是Python第三⽅库,处理计算机视觉⽅⾯。
验证码登陆必须要进⾏图像处理,借⽤京东的滑块验证码来说明⼀下。
我们只需要封装⼀个函数,在之前selenium操作显⽰出验证码之后,通过页⾯解析获取验证码的图⽚和滑块的图⽚(2张都要,下⾯简称⼤图和⼩图),
然后图像灰度处理,出⼤图的缺⼝的位置,注意点就是图⽚和⽹页上的⽐例,还有就是图⽚是否有边界,总之就是出在页⾯上滑块应该移动的距离。
出距离之后就是移动滑块了,通过selenium移动就可以完成整个流程了。
虽然selenium执⾏滑块移动完全没有问题,但是对于京东的官⽹(毕竟是互联⽹⼤⼚),滑块移动到指定位置之后,验证也⽆法通过,⼤概原因就是selenium执⾏会被检测出来,不得不说京东的反爬⾍处理是真的严格,这个时候就需要另⼀个神器了。
pyautogui
说实话,pyautogui也是真的nb,实现⾃动化控制⿏标键盘的⾏为,好像不少的脚本外挂都与pyautogui有关。
继续上⾯说的,我们获取到滑块应该移动的距离之后,不再使⽤selenium,⽽是⽤pyautogui代替,完全模拟认为的操作,值得⼀提的是,⽤pyautogui执⾏滑块移动时,我们需要多设置⼏次,⼀下⼦就移动到指定位置也是⾏不通的,我设置的是移动4次,并且每次的距离和时间都是随机⽣成的,就这样,通过率也是很⾼,不得再说⼀次,京东NB。
就这样,搞了个这么不知道有啥⽤的东西,仅以本次⽂章记录⼀下这⼏天的成果吧!
欢迎各位前辈⼤佬指点不⾜,fignting!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论