Python selenium自动化刷问卷+绕过智能验证
??學校思政實踐要收集1500份問卷,待在家里無聊就簡單寫了個用selenium模塊實現(xiàn)的自動填寫問卷xing問卷的小程序。
??基本思路很簡單:
??1.先打開問卷的網(wǎng)址,按F12進開發(fā)者模式分析頁面HTML,找到題目的選項按鈕對應的HTML代碼(例如:Q1的四個選項按鈕都在a標簽內(nèi),且rel屬性值分別為q1_1,q1_2,q1_3,q1_4);
??2.在py中用slenium的find_element_by_xpath+click()方法實現(xiàn)模擬點擊按鈕,例如:
??3.若想模擬人的選擇偏好,就用隨機數(shù)區(qū)間+if語句控制,無非就是多寫幾條語句;
??4.最后填寫完問卷提交也是一樣的,find_element找到提交按鈕的html對應代碼再click()。此時要注意——在py中用selenium模擬填寫的問卷最后點擊提交必定觸發(fā)智能驗證框:
??這時你無論用人手點擊或者是再模擬點擊都是沒法驗證成功的。
??這是因為問卷xing網(wǎng)頁有反爬機制會檢查你是不是通過selenium訪問網(wǎng)頁的。大多數(shù)情況下,檢測基本原理是檢測當前瀏覽器窗口下的window.navigator對象是否包含webdriver這個屬性。因為在正常使用瀏覽器的情況下,這個屬性是undefined,然而一旦我們使用了selenium,selenium會給window.navigator設置webdriver屬性。很多網(wǎng)站就通過JS判斷如果webdrive 屬性存在,那就直接屏蔽。
??網(wǎng)上搜了一下,基本看著都是用pyppeteer解決反爬的方法,安裝python第三方庫asyncio、pyppeteer和pyppeteer_stealth然后一頓操作猛如虎似乎可以繞過智能驗證?這個方法我沒試,大家可以試試看,附上相關博文:使用Python自動填寫問卷星(pyppeteer反爬蟲版)。
??我參考了某位知乎答主的方法——
??通過 CDP 實現(xiàn)在每個頁面剛加載的時候執(zhí)行JS代碼,執(zhí)行的CDP方法叫作Page.addScriptToEvaluateOnNewDocument。傳入一段JS代碼:
這樣就可以在每次頁面加載之前將webdriver屬性置空從而躲過智能檢測。
部分代碼如下:
from selenium import webdriver import time from random import *print("正在執(zhí)行操作......") # 給出所需的url和option參數(shù) url_survey = ("https://www.wjx.cn/xx/xxxxxxx.aspx") # 根據(jù)需要填寫url option = webdriver.ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=option) driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'}) driver.get(url_survey) time.sleep(2)# 處理Q1 # 生成隨機數(shù),決定點哪個按鈕 q1 = random() if 0 <= q1 <= 0.5:# 通過屬性定位元素# q1_1是Q1的第1個按鈕driver.find_element_by_xpath("//a[@rel='q1_1']").click() else:driver.find_element_by_xpath("//a[@rel='q1_2']").click()# 處理Q2 # 生成隨機數(shù),決定點哪個按鈕 q2 = random() if 0 <= q2 <= 0.25:driver.find_element_by_xpath("//a[@rel='q2_1']").click() elif 0.25 < q2 <= 0.50:driver.find_element_by_xpath("//a[@rel='q2_2']").click() elif 0.50 < q2 <= 0.75:driver.find_element_by_xpath("//a[@rel='q2_3']").click() else:driver.find_element_by_xpath("//a[@rel='q2_4']").click()# 處理Q3 # 生成隨機數(shù),決定點哪個按鈕 q3 = random() if 0 <= q3 <= 0.25:driver.find_element_by_xpath("//a[@rel='q3_1']").click() elif 0.25 < q3 <= 0.50:driver.find_element_by_xpath("//a[@rel='q3_2']").click() elif 0.50 < q3 <= 0.75:driver.find_element_by_xpath("//a[@rel='q3_3']").click() else:driver.find_element_by_xpath("//a[@rel='q3_4']").click()完整代碼如下,歡迎小伙伴們fork or star:
Python+Selenium實現(xiàn)自動化刷問卷+繞過智能驗證
上述代碼親測可用。
注意:當短時間內(nèi)刷的問卷數(shù)過多時,可能會出現(xiàn)第二重智能驗證,要拖動滑塊進行驗證,這個我暫時沒有進行實驗。
代碼驗證視頻:
總結
以上是生活随笔為你收集整理的Python selenium自动化刷问卷+绕过智能验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 100、网页端的人脸识别
- 下一篇: Win10 如何修改默认软件安装路径