滑塊解鎖
該問題主要源於各個平台的登錄驗證或者針對爬蟲或selenium的一種防範手段。由於各個網站的防爬技術的提高,常規selenium似乎無法通過滑塊驗證,以下提供普遍的滑塊驗證思路,以供參考:
- 獲取滑塊本身的元素以及滑塊所在長條的元素
- 根據滑塊元素的
size和所在矩形元素的size便能得到滑塊的偏移量 - 使用
selenium庫中的actionChains中的click_and_hole和move_by_offset來控制滑塊行動
根據滑塊本身的大小以及承載滑塊的div的大小來獲取偏移量offx
slide1_back = self.find_ele_is_presence(_slide1_back_locate)
slide1_span = self.find_ele_is_presence(_slide1_span_locate)
獲取滑塊的起始座標location
start_location = slide1_span.location
# 獲取滑塊所在長條的長寬大小
background_size = slide1_back.size
4.滑塊的滑動範圍[開始位置的橫座標減去滑片的寬度],由於是平移所以縱座標沒有變化
x_location = background_size["width"] - start_location["x"]
y_location = start_location["y"]
- 然後通過對滑動軌跡:即一定時間內滑動的偏移量的變化,來模擬真人操作,試圖通過檢測
def ease_out_quad(x):
return 1 - (1 - x) * (1 - x)
def ease_out_quart(x):
return 1 - pow(1 - x, 4)
def ease_out_expo(x):
if x == 1:
return 1
else:
return 1 - pow(2, -10 * x)
def get_tracks(distance, seconds):
"""
:param distance: offset
:param seconds: 拉動時間
:return:
"""
tracks = [0]
offsets = [0]
# print("np_value:", np.arange(0.0, seconds, 0.1))
for t in np.arange(0.0, seconds, 0.1):
offset = round(ease_out_quart(t / seconds) * distance)
tracks.append(offset - offsets[-1])
offsets.append(offset)
return offsets, tracks
結論
遺憾的是,有些網站的滑塊檢測條件極為苛刻又難以捉摸,即使使用了隨機暫停,加速度變化等操作來模擬真人滑動,還是無法通過檢測。疑似要通過人工智能的方式來解決。
瀏覽器頁面滾動
使用JS進行滾動
因為一般滾動條都不作為單獨的元件出現,而是附庸在某個div或table上,當這些元件展示內容過多時便會自動出現滾動條,所以難以通過selenium定位然後actionChains調用方法進行拖拽的方式控制頁面滾動,需要通過JS來完成對滾動條的操作。
常見JS
- 針對整個頁面進行滾動
def test_scroll_to():
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('--start-maximized')
driver = webdriver.Chrome(chromeOptions)
driver.get('https://www.jd.com/')
n=1
while True:
# driver.execute_script(f"document.body.scrollTop = {100*n};")
driver.execute_script(f"window.scrollTo({(n-1)*50}, {n*50})")
n+=1
- 針對單個元素的內嵌滾動條進行滾動
document.querySelector('.page-content').scrollTo(0,300)
document.querySelector('.ant-table-content').scrollTo(-100,0)