爬虫--某宝页面登陆滑块验证 selenium + chromedriver
背景
淘寶在7月左右就必須要登陸才能進入商品頁了,所以登陸淘寶是爬取數據的第一道門檻,然后就看到了滑塊驗證,selenium + chromedriver 模擬用戶登陸。
思路
滑塊被檢驗出來為 webdriver 驅動,或許你已經看過用fiddler工具 或者 mitmproxy 代理設置response,攔截index.js 118.js 115.js修改js,加上webdriver 的參數為false.目的就是為了改window.navigator.webdriver屬性。再后來支付寶登陸??微博登陸???
思路ok,方法沒用。
兩個問題入手
1,跳過檢測特有標識$cdc_lasutopfhvcZLmcfl
2,跳過檢驗window.navigator.webdriver 為false
破解(兩步缺一不可)
1:改chromedriver的全量標識。
參考地址:https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver
mac 和 linux 很好改,自己看,直接略過,我就來個別人都避重就輕的不說的windows的修改方法。
現根據自己的谷歌瀏覽器版本下載對應驅動:selenium 谷歌驅動下載,放到python 的Script目錄下。
一定要記住:先把exe文件.bak 備份一波
下載一個nodepadd++ 編輯器,右擊打開 chromedriver.exe ,一群亂碼,莫慌,莫隨意打空格或者其他操作,可能會導致文件損壞。打開it,如下圖(本文章計劃唯一的一張圖),ctrl + F, 輸入 $cdc ,好了,就把下面那 紅色框住的那一坨改了,就是它,淘寶就是檢測的它。
最 惡心的地方來了,你以為改過了就完事了。下面劃橫線,說重點的事情三遍。
修改后的字符長度要和原來的一致!
修改后的字符長度要和原來的一致!
修改后的字符長度要和原來的一致!
2:window.navigator.webdriver 為false
自己本地玩,弄個mitmproxy,攔截下,修改js沒問題,代碼如下:
然而并沒有什么卵用,要是linux機器多,部上去跑也麻煩。直接一行代碼搞定
option = webdriver.ChromeOptions() #開發者模式的開關,設置一下,打開瀏覽器就不會識別為自動化測試工具了 option.add_experimental_option('excludeSwitches', ['enable-automation']) driver = webdriver.Chrome(chrome_options=option)總結 (代碼)
共享學習心得分享資源是好事,希望大家共同努力一起進步。
我只寫了一個demo,有心的同學可以自己改成class類,增加元素加載情況判斷等等。本文目的只為破解滑塊驗證。
最后扔個炸彈,若是新設備電腦,首次登陸進去之后,有一個可愛的人機交互驗證,它的問題是“請選出你最近購買的商品”,小朋友你是不是有很多問號??? 哈哈哈,爬蟲之路任重而道遠,各位珍重。
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver import ActionChains import timeoption = webdriver.ChromeOptions() option.binary_location = r'E:\Chrome\Application\chrome.exe' option.add_experimental_option('excludeSwitches', ['enable-automation'])# option.add_argument("--proxy-server=127.0.0.1:8080") # 設置無頭加載 # option.add_argument('--headless') # 設置無圖片模式 # prefs = {"profile.managed_default_content_settings.images": 2} # option.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(chrome_options=option) driver.maximize_window() status = driver.get("https://login.taobao.com/member/login.jhtml") print(status) # pass # 刪除原來的cookie driver.delete_all_cookies() # cookie = "thw=cn; cna=yFJuFf/jBmkCAbRt3g+PNikw; v=0; t=ce6433b7d755f402b91d17670f77a2ef; sg=819; csg=d16db728; existShop=MTU2MTYwNzg5MQ%3D%3D; tracknick=%5Cu6843%5Cu6843520328; lgc=%5Cu6843%5Cu6843520328; dnk=%5Cu6843%5Cu6843520328; tg=0; mt=ci=9_1; uc1=cookie16=U%2BGCWk%2F74Mx5tgzv3dWpnhjPaQ%3D%3D&cookie21=VT5L2FSpdet1FS8C2gIFaQ%3D%3D&cookie15=UIHiLt3xD8xYTw%3D%3D&existShop=false&pas=0&cookie14=UoTaGduh3ZQTWQ%3D%3D&tag=8&lng=zh_CN; _nk_=%5Cu6843%5Cu6843520328; _tb_token_=3ab35ef7b6b31; isg=BNrad6CZU8E-BN6SQyYSGTTBK4A8o13CtG3R4uRTgm04V3qRzJuu9aClIyNLgtZ9; l=bBNeS67nv7dTPyOoBOCanurza77OSIRYYuPzaNbMi_5LE6T_Z8bOkYnakF96Vj5RsUYB4ATie6p9-etkZ" # c = cookie.split(';') # ck = {} # for i in c: # key = i.split('=')[0].strip() # val = i.split('=')[1].strip() # ck.setdefault(key, val) # 攜帶cookie打開 # driver.add_cookie(ck)# 設置顯示等待 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.ID, 'J_Quick2Static'))) # 打開淘寶二維碼 i = driver.find_element_by_id("J_Quick2Static") i.click() user = driver.find_element_by_id("TPL_username_1") user.send_keys('用戶名') password = driver.find_element_by_id("TPL_password_1")password.send_keys('密碼') # 設置顯示等待 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.ID, 'nc_1_n1z'))) bb = driver.find_element_by_id("nc_1_n1z") # ActionChains(driver).click_and_hold(bb).perform() # for x in range(258): # ActionChains(driver).drag_and_drop_by_offset( # xoffset=x, yoffset=0).perform() # time.sleep(0.02) bar_element = driver.find_element_by_id('nc_1_n1z') ActionChains(driver).drag_and_drop_by_offset(bar_element, 258, 0).perform() time.sleep(0.5) ActionChains(driver).release().perform() # 點擊提交按鈕 butt = driver.find_element_by_id('J_SubmitStatic') butt.click()driver.get("https://www.taobao.com") # 設置顯示等待 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'search-combobox-input-wrap'))) search = driver.find_element_by_class_name('search-combobox-input') search.send_keys("蘇寧易購")search_butt = driver.find_element_by_class_name('btn-search') search_butt.click() print(driver.page_source)總結
以上是生活随笔為你收集整理的爬虫--某宝页面登陆滑块验证 selenium + chromedriver的全部內容,希望文章能夠幫你解決所遇到的問題。