我們在爬蟲過程中難免會遇到一些攔路虎,比如各種各樣的驗證碼,時不時蹦出來,這時候我們需要去識別它來繼續我們的工作,接下來我將爬取網一些滑動驗證碼,然後通過百度的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平臺,進行資料標註,訓練。