博客 / 詳情

返回

selenium滑塊解鎖實現的研究

滑塊解鎖

該問題主要源於各個平台的登錄驗證或者針對爬蟲或selenium的一種防範手段。由於各個網站的防爬技術的提高,常規selenium似乎無法通過滑塊驗證,以下提供普遍的滑塊驗證思路,以供參考:

  • 獲取滑塊本身的元素以及滑塊所在長條的元素
  • 根據滑塊元素的size和所在矩形元素的size便能得到滑塊的偏移量
  • 使用selenium庫中的actionChains中的click_and_holemove_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進行滾動

因為一般滾動條都不作為單獨的元件出現,而是附庸在某個divtable上,當這些元件展示內容過多時便會自動出現滾動條,所以難以通過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)
user avatar yutou_5c10e66caa840 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.