反爬蟲機制與反爬蟲技術二
- 1、動態頁面處理與驗證碼識別概述
- 2、反爬蟲案例:頁面登錄與滑塊驗證碼處理
- 2.1、用例簡介
- 2.2、庫(模塊)簡介
- 2.3、網頁分析
- 2.4、Selenium準備操作
- 2.5、頁面登錄
- 2.6、模糊移動滑塊測試
- 3、滑塊驗證碼處理:精確移動滑塊
- 3.1、精確移動滑塊的原理
- 3.2、滑塊驗證碼圖像缺口位置識別
- 3.3、精確移動滑塊實現(完整代碼)
1、動態頁面處理與驗證碼識別概述
本文接上篇:反爬蟲機制與反爬蟲技術(一)
上篇中,我們詳細介紹和使用了User-Agent偽裝、代理IP、請求頻率控制等反爬蟲技術,本篇將重點針對動態頁面處理和驗證碼識別進行介紹和案件詳解
近年來,網站安全性越來越高,許多網站為了避免機器人惡意攻擊,采用了滑動驗證碼。與傳統的驗證碼相比,滑動驗證碼安全性更高,更難被攻擊者破解。但是,這也給爬蟲程序帶來了困難。Python Selenium是一款非常出色的自動化測試工具,可以用來模擬瀏覽器行為,可以用于爬蟲
例如,一些網站為了防止爬蟲,使用了JavaScript來動態生成頁面內容,這對于爬蟲來說是一個挑戰。Python中的Selenium庫可以模擬瀏覽器的行為,執行JavaScript代碼,從而獲取動態生成的內容
例如在進行數據采集時,很多網站需要進行登錄才能獲取到目標數據,這時可以使用Selenium庫進行模擬登錄進行處理
另外,一些網站為了防止爬蟲,會在登錄或提交表單時添加驗證碼。隨著反爬的不斷發展,逐漸出現了更多復雜的驗證碼,例如:內容驗證碼、滑動驗證碼、圖片拼接驗證碼等
Python提供了一些強大的圖像處理庫,例如Pillow、OpenCV等,可以用來自動識別驗證碼,從而實現自動化爬取
2、反爬蟲案例:頁面登錄與滑塊驗證碼處理
2.1、用例簡介
本案例將以豆瓣的登錄頁面為例
豆瓣登錄:https://accounts.douban.com/passport/login
操作步驟:
1) 打開豆瓣登錄頁面
2) 點擊頁面上的密碼登錄
3) 輸入賬號密碼之后,點擊登錄豆瓣按鈕
4) 點擊登錄后會彈出滑塊驗證碼,拼接驗證
2.2、庫(模塊)簡介
Selenium是一種自動化測試工具,可以用于控制瀏覽器執行自動化操作,比如滑動驗證碼識別。滑動驗證碼通常是用于網站的登陸、注冊等操作,通過鼠標模擬人手在滑動拼圖或滑動滑塊,達到人機交互的效果。在自動化測試中,如果能夠識別滑動驗證碼,就可以實現完全自動化,提高效率
Selenium詳解見文章:傳送門
利用OpenCV、PIL等Python的圖像處理識別庫,可以在頁面加載完成后,對驗證碼圖片進行特征提取,然后通過算法自動計算出正確的滑塊滑動位置,并模擬用戶滑動
OpenCV詳解見文章:傳送門
本案例需要使用到的庫(模塊)如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains # 動作類
from selenium.webdriver.support.wait import WebDriverWait # 等待類
from selenium.webdriver.support import expected_conditions as EC # 等待條件類
import time
import re
import numpy as np
import urllib.request as req
import cv2
2.3、網頁分析
通過檢查網頁源代碼,按照上述操作步驟進行操作,在HTML中找到用例需要使用到的一些元素
其中,點擊登錄按鈕后,就會出現滑塊驗證區域,這是一個新增的iframe區域
2.4、Selenium準備操作
通過以下操作驗證Selenium環境WebDriver是否正常:
# 打開自定義配置
options = webdriver.ChromeOptions()
# 設置瀏覽器不關閉(解決閃退/自動關閉)
options.add_experimental_option('detach', True)
# 禁用瀏覽器擴展
options.add_argument('--disable-extensions')
# 禁用瀏覽器彈窗
options.add_argument('--disable-popup-blocking')
# 設置瀏覽器UA
options.add_argument('--user-agent=Mozilla/5.0')# 聲明瀏覽器對象
driver = webdriver.Chrome(options=options)# 最大化瀏覽器窗口
driver.maximize_window()# 打開豆瓣登錄頁
driver