python自动化------问卷星刷问卷3.0版本
接上,之前做的問卷星刷問卷的功能單一,每個題目只能選一個選項。現在的3.0版本功能增加了計數器(刷了幾份問卷)、多選項的選擇、通過滑塊驗證。想要了解之前的相關信息請看下面的鏈接:
隔壁寢室刷問卷刷瘋了,我們寢室則相反,打游戲的同時問卷份數也在增加,隔壁寢室的人投來羨慕的目光,向我要代碼!!
python基礎知識------生成多個隨機數
本篇文章將會將該程序拆分成代碼塊逐一講解其功能。
注意:經過本人測試,刷問卷,一次只能刷51份,第52次運行程序時,會出現滑動驗證,即使程序中寫了過滑動驗證的相關代碼并且成功通過了滑動滑塊,但是問卷星會重新彈出是否進行驗證,然后又重新彈出滑動驗證碼。手動滑動,接下來會進行以上的循環。關閉瀏覽器,問卷星份數并未增加。
? ? ? ? ? ?所以即使增加了滑動驗證碼的代碼,其結果還是只能在短期內刷51份。當然,當出現滑動驗證碼時,只要暫停程序,過一個小時(具體時間未測量)后又能重新開始刷了。如有不同想法和測試結果,請指正。
目錄
一、模塊導入
二、代碼塊的解析
1.生成多選題不重復的隨機選項
2.計數器(記錄運行次數)
3.偽裝selenium
4.滑動驗證碼---滑動距離
5.滑動驗證碼---滑動滑塊
6.定時運行程序
7.run()函數的編寫
三、源代碼及結果展示
四、總結
一、模塊導入
import random from selenium import webdriver import time from selenium.webdriver import ActionChains import schedule as schedule二、代碼塊的解析
1.生成多選題不重復的隨機選項
# 多選題的多個選項 def int_random(m, n, o):p = []while len(p) < o:new_int = random.randint(m, n)if (new_int not in p):p.append(new_int)else:passreturn p該代碼實現的功能是生成m到n之間的o個不重復的數字,可用于多選題隨機選項的選擇,詳細內容請看我之前的博文
python基礎知識------生成多個隨機數
2.計數器(記錄運行次數)
# 計數器 count = 0 def sum():global countcount += 1w = print("第{}次運行".format(count))return w這里的global的用法是在局部函數中對全局變量重新賦值,這樣就起到了每運行一次程序,計數器計數的功能。
3.偽裝selenium
url = 'https://www.wjx.cn/vm/maBODlH.aspx'# 躲避智能檢測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)該代碼在之前的博文中講過具體原因
隔壁寢室刷問卷刷瘋了,我們寢室則相反,打游戲的同時問卷份數也在增加,隔壁寢室的人投來羨慕的目光,向我要代碼!!
4.滑動驗證碼---滑動距離
def get_track(distance): # distance為傳入的總距離# 移動軌跡track = []# 當前位移current = 0# 計算間隔t = 0.2# 初速度v = 0while current < distance:# 加速度a = 50v0 = v# 當前速度v = v0 + a * t# 移動距離# move = v0 * t + 1 / 2 * a * t * tmove = v0 * t + a * t# 當前位移current += move# 加入軌跡track.append(round(move))return track # track列表 返回的是整個滑動條的多個焦點,可以模擬鼠標的緩慢滑動首先該代碼返回的是track列表(其中包含了移動的軌跡),定義當前位移current=0,時間間隔t=0.2,初始速度v=0,接下來通過判斷語句,判斷當前距離是否小于你所輸入的總距離,如果成立,則通過物理的知識,通過加速度a,速度v計算位移,然后將它加到current中。
注:這里的a、t、v都可以自定義,甚至我連move = v0 * t + 1 / 2 * a * t * t這個公式也更改了。
因為python自動化講究效率,速度很關鍵,而且對于這類簡單的滑動驗證,不用那些先加速后減速的套路,所以只需要一直加速即可。
5.滑動驗證碼---滑動滑塊
def move_to_gap(slider, tracks): # slider是要移動的滑塊,tracks是要傳入的移動軌跡ActionChains(driver).click_and_hold(slider).perform()for x in tracks:ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.1)ActionChains(driver).release().perform()?①ActionChains(driver).click_and_hold(slider).perform()中
? ? ? click_and_hold(slider)---點擊鼠標左鍵,不松開,其中slider為需要定位要移動的滑塊
? ? ? ? (例如huakuai = driver.find_element_by_css_selector('#nc_1_n1z'))
? ? ? perform()---執行該動作;
②接下來遍歷tracks
? ? ? ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()中
? ? ? move_by_offset(xoffset=x, yoffset=0)---鼠標向右移動x的px
③ActionChains(driver).release().perform()中
? ? ? release()---釋放
? ? 注:4和5一般在一起使用
6.定時運行程序
def run():passschedule.every(5).seconds.do(run)while True:schedule.run_pending()run()函數為主函數,通過schedule實現每隔5秒運行一次程序
7.run()函數的編寫
代碼如下
def run():global driverurl = 'https://www.wjx.cn/vm/maBODlH.aspx'# 躲避智能檢測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)sum()# 總共有13個題目i = 1while i <= 13:base_xpath1 = '//*[@id="div{}"]'.format(i)base_xpath2 = base_xpath1 + '/div[2]/div'a = driver.find_elements_by_xpath(base_xpath2)# print(len(a))# 在選項個數范圍內,隨機生成一個數字 如有四個選項,隨機生成數字3b = random.randint(1, len(a))# print(b)# 通過隨機數字,點擊該數字的選項# time.sleep(1)# 當第六個問題回答第四個選項(其他)時,需要填寫if i == 6 and b == 4:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# time.sleep(1)# 這里你可以每隔一段時間更改send_keys中的內容,也可以將答案寫出來,然后隨機選擇哪個選項driver.find_element_by_css_selector('#tqq6_4').send_keys('QQ群和微信群')elif i == 5 or i == 7 or i == 8 or i == 11:q = int_random(1, len(a), b)# sort函數表示將列表排序,如果未加參數表示從小到大排列q.sort()for r in q:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, r)).click()# time.sleep(0.5)else:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# 當第三個問題答案是是時,跳到5if i == 3 and b == 1:i = 5else:i += 1 # # 點擊提交按鈕time.sleep(0.5)driver.find_element_by_xpath('//*[@id="ctlNext"]').click()# 出現點擊驗證碼驗證time.sleep(1)driver.find_element_by_xpath('//*[@id="alert_box"]/div[2]/div[2]/button').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="rectMask"]').click()time.sleep(4)try:huakuai = driver.find_element_by_css_selector('#nc_1_n1z')move_to_gap(huakuai, get_track(328))except:passfinally:# 關閉頁面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(0.5)# 刷新頁面(可要可不要)# driver.refresh()# 關閉當前頁面,如果只有一個頁面,則也關閉瀏覽器driver.close()這里面的代碼需要你根據具體問卷星的內容進行改寫。
問卷星問卷的網址為浙水院經管學院2020級大學生勤工儉學和兼職問題調查【復制】,大家可以自己查看一下問卷星問卷內容,對于該問卷
①首先,題目為13個,所以判斷條件為i <= 13,
②len(a)為選項的個數,b為在選項個數內隨機生成整數
③如果第六個問題,隨機數b為4時,則還要填寫文本內容;
④如果是第5、7、8、11個問題,則調用上面1.生成多選題不重復的隨機選項的函數,再通過sort()函數將列表從小到大排列(這一過程可省略),最后遍歷該列表,選擇里面生成的隨機選項。
⑤剩下的就是單選題了,這個比較簡單
⑥對于那些隱藏的題目,即當且僅當選擇了前面某題的某選項才出現時,需要重新在if語句中寫,
并且該if語句要放在所以if語句的最后,因為這個if中含有i,如果放前面會因為i提前變化,導致找不到相關內容,最終報錯。
寫好這些以后,就開始點擊提交問卷按鈕,并開始進行驗證了。刷問卷選項時可以不設間隔時間,但是以下的操作就需要足夠時間,需要用到time.sleep(),不然會使得刷問卷失敗。所以刷問卷所需時長主要花在驗證這里。
⑦
try:huakuai = driver.find_element_by_css_selector('#nc_1_n1z')move_to_gap(huakuai, get_track(328))except:passfinally:# 關閉頁面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(0.5)# 刷新頁面(可能不需要)# driver.refresh()# 關閉當前頁面,如果只有一個頁面,則也關閉瀏覽器driver.close()該代碼段表示,先執行try代碼塊,如果發現錯誤,則執行except代碼塊,finally表示不管代碼會不會報錯,都會執行finally代碼塊。
在本代碼中,前51次不會出現滑塊驗證,因此執行try代碼塊時本應該會報錯,但是我們將except段pass,使得代碼不會報錯,最終不管代碼是否會報錯,都會執行finally代碼塊。
當然,如上所說,即使過了滑動驗證,還是會重新彈出滑動驗證,導致無法提交,份數也不會增加,所以我們可以不用在代碼中加入這段。
# 點擊提交按鈕time.sleep(0.5)driver.find_element_by_xpath('//*[@id="ctlNext"]').click()# 出現點擊驗證碼驗證time.sleep(1)driver.find_element_by_xpath('//*[@id="alert_box"]/div[2]/div[2]/button').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="rectMask"]').click()time.sleep(4)# 關閉頁面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(1)# 刷新頁面(可能不需要)# driver.refresh()# 關閉當前頁面,如果只有一個頁面,則也關閉瀏覽器driver.close()所以也不需要用到
get_track(distance)和move_to_gap(slider, tracks)這兩個函數。三、源代碼及結果展示
# -*- coding: utf-8-*- import random from selenium import webdriver import time from selenium.webdriver import ActionChains import schedule as schedule # 多選題的多個選項 def int_random(m, n, o):p = []while len(p) < o:new_int = random.randint(m, n)if (new_int not in p):p.append(new_int)else:passreturn p # 計數器 count = 0 def sum():global countcount += 1w = print("第{}次運行".format(count))return wdef get_track(distance): # distance為傳入的總距離# 移動軌跡track = []# 當前位移current = 0# 計算間隔t = 0.2# 初速度v = 0while current < distance:a = 50v0 = v# 當前速度v = v0 + a * t# 移動距離# move = v0 * t + 1 / 2 * a * t * tmove = v0 * t + a * t# 當前位移current += move# 加入軌跡track.append(round(move))return track # list 返回的是整個滑動條的多個焦點,可以模擬鼠標的緩慢滑動def move_to_gap(slider, tracks): # slider是要移動的滑塊,tracks是要傳入的移動軌跡ActionChains(driver).click_and_hold(slider).perform()for x in tracks:ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.1)ActionChains(driver).release().perform()def run():global driverurl = 'https://www.wjx.cn/vm/maBODlH.aspx'# 躲避智能檢測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)sum()# 總共有13個題目i = 1while i <= 13:base_xpath1 = '//*[@id="div{}"]'.format(i)base_xpath2 = base_xpath1 + '/div[2]/div'a = driver.find_elements_by_xpath(base_xpath2)# print(len(a))# 在選項個數范圍內,隨機生成一個數字 如有四個選項,隨機生成數字3b = random.randint(1, len(a))# print(b)# 通過隨機數字,點擊該數字的選項# time.sleep(1)# 當第六個問題回答第四個選項(其他)時,需要填寫if i == 6 and b == 4:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# time.sleep(1)# 這里你可以每隔一段時間更改send_keys中的內容,也可以將答案寫出來,然后隨機選擇哪個選項driver.find_element_by_css_selector('#tqq6_4').send_keys('QQ群和微信群')elif i == 5 or i == 7 or i == 8 or i == 11:q = int_random(1, len(a), b)# sort函數表示將列表排序,如果未加參數表示從小到大排列q.sort()for r in q:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, r)).click()# time.sleep(0.5)else:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# 當第三個問題答案是是時,跳到5if i == 3 and b == 1:i = 5else:i += 1 # # 點擊提交按鈕time.sleep(0.5)driver.find_element_by_xpath('//*[@id="ctlNext"]').click()# 出現點擊驗證碼驗證time.sleep(1)driver.find_element_by_xpath('//*[@id="alert_box"]/div[2]/div[2]/button').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="rectMask"]').click()time.sleep(4)try:huakuai = driver.find_element_by_css_selector('#nc_1_n1z')move_to_gap(huakuai, get_track(328))except:passfinally:# 關閉頁面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(0.5)# 刷新頁面(可能不需要)# driver.refresh()# 關閉當前頁面,如果只有一個頁面,則也關閉瀏覽器driver.close()schedule.every(1).seconds.do(run)while True:schedule.run_pending()該結果刷的是另外一份問卷
四、總結
在發這篇博文之前,我已經幫三個人刷過問卷了,每一種問卷內容都不一樣,run()函數需要自己寫。
??????
?其中有些問卷非常復雜(如下),你需要花時間了解問卷,然后再寫程序
?
現在,問卷星自動化刷問卷3.0版本已經完結,如果有其他想法的,歡迎和我交流,如果上述有誤的,請指正!!
總結
以上是生活随笔為你收集整理的python自动化------问卷星刷问卷3.0版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 10 Edt LTSC中
- 下一篇: UI设计原则