selenium自动爬取网易易盾的验证码

2020-07-20

我们在爬虫过程中难免会遇到一些拦路虎,比如各种各样的验证码,时不时蹦出来,这时候我们需要去识别它来继续我们的工作,接下来我将爬取网一些滑动验证码,然后通过百度的EasyDL平台进行数据标注,创建模型,训练模型,测试模型,看看是否能返回目标框的相应坐标,然后我们再使用selenium进行滑动到相应位置,这样就破解了验证码。后面我将用几个系列来阐述一下我们的内容。

首先,我们先看下爬取的效果,详情点击公众号地址,有视频。

思路:一开始我去查看能不能直接调用接口获取图片,发现看看不是那么容易,找到了相应的接口,但是模拟接口却很困难,里面有token,jsonp之类的。后来直接截取图片好了,简单粗暴。

步骤如下:

前提是有python环境,先把python安装好。

1.pip install selenium

2.下载chrome_driver.exe,利用它来启动谷歌浏览器,以下是网址,我们需要下载电脑谷歌对应的版本,我下载的是chromedriver_win32.zip,版本号是84.0.4147.89,解压内有一个exe文件,放到谷歌的安装目录。

https://sites.google.com/a/chromium.org/chromedriver/downloads

3.添加环境变量,将谷歌的安装目录加入环境变量。

4.测试

1 from selenium import webdriver
2 browser = webdriver.Chrome()
3 browser.get('https://dun.163.com/trial/jigsaw')

 

5.测试成功之后,我们就可以开始爬取滑动验证码图片,上代码

 1 driver = webdriver.Chrome()
 2 driver.implicitly_wait(3)
 3 driver.maximize_window()
 4 driver.get('https://dun.163.com/trial/jigsaw')
 5 # 鼠标移动到此元素
 6 yidun_tips = driver.find_element_by_class_name('yidun_tips')
 7 action = ActionChains(driver)
 8 for i in range(1000):
 9     action.move_to_element(yidun_tips).perform()
10     driver.implicitly_wait(5)
11     driver.save_screenshot('webpages/'+str(int(time.time()))+".png")
12     driver.find_element_by_class_name("yidun_refresh").click()
13     driver.implicitly_wait(5)
14 
15 sleep(2)
16 driver.quit()
 

这段代码会打开网页,找到相应元素,触发hover事件,自动点击refresh按钮,刷新图片,然后我们进行截取保存。

6.截取验证码区域

 1 import cv2 as cv
 2 import  os
 3 
 4 # 获取文件名
 5 file_names = os.listdir("webpages/")
 6 print(file_names)
 7 # 文件名拼接路径
 8 file_list = [os.path.join("./webpages/",file) for file in file_names]
 9 
10 #裁剪坐标为[y0:y1, x0:x1]
11 for i in range(len(file_list)):
12     src=cv.imread(file_list[i])
13     dst=src[651:851,945:1345]
14     cv.imwrite('dist/'+(str(i+1))+'.png',dst)
15 cv.waitKey()

后面我们就打包数据集上传到EasyDL平台,进行数据标注,训练。