我们在爬虫过程中难免会遇到一些拦路虎,比如各种各样的验证码,时不时蹦出来,这时候我们需要去识别它来继续我们的工作,接下来我将爬取网一些滑动验证码,然后通过百度的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平台,进行数据标注,训练。