利用Python實現(xiàn)問卷星自動填寫的超詳細教程
前言
(Ps:廢話部分可跳過 )相信大家一定都有被問卷給折磨的時候,尤其去求別人填問卷的時候,如果是內(nèi)向的小伙伴就一定很苦惱了,那么有沒有一種工具可以幫助我們?nèi)プ詣犹顚憜柧硪赃_到問卷不求人的東西呢!答案是肯定的,我們都知道python是門很強大的語言,在自動化、人工智能、數(shù)據(jù)分析等領(lǐng)域有著舉足輕重的作用,所以在這里我們選擇用python來實現(xiàn)。
一、配置環(huán)境
1.1安裝依賴
①這里我們需要用到python的庫函數(shù)——selenium庫,這是幫助我們?nèi)ヅ廊【W(wǎng)頁信息和處理網(wǎng)頁的重要工具。也是我們本次實現(xiàn)程序所用到的庫,直接在選擇好的環(huán)境下執(zhí)行
pip install selenium。
②我們還需要用到pyautogui庫函數(shù)去模擬人手點擊或拖拽來進行智能驗證,也是在對應(yīng)的環(huán)境執(zhí)行
pip install pyautogui。
pip install selenium pip install pyautogui
1.2安裝驅(qū)動
執(zhí)行本次程序是在谷歌瀏覽器下完成的,所以在此之前請下載谷歌瀏覽器(谷歌瀏覽器下載地址)。
下好瀏覽器就可以去下載驅(qū)動了,在這之前我們還需做一步,打開已經(jīng)安裝好的谷歌瀏覽器,查看自己的瀏覽器版本。
到這里我們就可以下載谷歌驅(qū)動了(Chrome驅(qū)動鏈接),點擊進去找到對應(yīng)的版本號,如果沒有對應(yīng)的版本號下載接近的一個即可,如下版本里面沒有我的111.0.5563.65的版本,我們下載111.0.0.5563.64的即可(Ps:如果發(fā)現(xiàn)在后面打不開驅(qū)動出現(xiàn)錯誤,換一個驅(qū)動再試一下,因為這里有些人是要小一點的版本可以,有些人是大一點的版本可以)。
下載好是一個壓縮吧,解壓完成后是一個.exe文件,可以放在任意的一個文件夾,只要能找到即可,我這里選擇的是放在安裝好的谷歌瀏覽器文件夾下。
二、實戰(zhàn)處理
2.1、引入庫函數(shù)
這里我們引入所要用到的庫函數(shù)及對應(yīng)的包
from selenium.webdriver.common.by import By # 沒有selenium庫的(請在所用的環(huán)境下pip install selenium) from selenium import webdriver #selenium庫 import random # 用于產(chǎn)生隨機數(shù) import time # 用于延時 import pyautogui # 用于模擬人手
2.2、程序所需函數(shù)詳解
(1)自定義單選函數(shù)
當(dāng)問卷中有單選就可以直接查詢到問卷中的所有單選進行自動答題。
def danxuan(driver): # 找到所有標(biāo)簽(定位問題)這里是單選 dan = driver.find_elements_by_css_selector('#div1 > div.ui-controlgroup.column1') for answer in dan: ans = answer.find_elements_by_css_selector('.ui-radio')#對應(yīng)的絕對子標(biāo)簽 random.choice(ans).click() # 找到標(biāo)簽并點擊 time.sleep(random.randint(0, 1))
(2)自定義多選函數(shù)
尋找問卷中第幾題是多選,就可自動去答多選中的題。
def duoxuan(driver): #這里是多選題,找到所有多選的標(biāo)簽 duo = driver.find_elements_by_css_selector('#div2 > div.ui-controlgroup.column1') for answer in duo: ans = answer.find_elements_by_css_selector('.ui-checkbox')#對應(yīng)的絕對子標(biāo)簽 #隨機填幾次 for i in range(1, 7):#這里的7可以改成5,10,12 random.choice(ans).click()#找到標(biāo)簽并點擊 time.sleep(random.randint(0, 1))
(3)自定義填空函數(shù)
需要自己去定義第幾題是填空并填上自己想要填寫的內(nèi)容。
如果要修改可這樣改,例子:index里的數(shù)量一定要對應(yīng)answer里的數(shù)量,index的名字可以跟answer不一樣
index = [“1”, “2”, “B”, “D”]
answer = {“1”: “python真的好用!”, “2”: “這個測試很成功!”, “B”: “填空題隨機填寫文本”,“D”: “隨便填寫!”}
def tiankong(driver, num): #填空函數(shù) #這里是所需要問題的標(biāo)簽匯總,例如有四個要答的問題,下面的answer的ABC數(shù)量需要跟index里面的數(shù)量相等 index = ["A", "B", "C"] # 自定義要回答的答案 answer = {"A": "python真的好用!", "B": "這個測試很成功!", "C": "填空題隨機填寫文本"} driver.find_element(by=By.CSS_SELECTOR, value=f'#q{num}')\ .send_keys(answer.get(index[random.randint(0, len(index)-1)]))
(4)自定義智能驗證函數(shù)
當(dāng)出現(xiàn)智能驗證的時候,用自定義的這個函數(shù)可以幫我們解決。
def renzheng(driver): # 智能驗證,找到智能認證的標(biāo)簽 bth = driver.find_element_by_css_selector( '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0') bth.click()#點擊 time.sleep(1) rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按鈕 rectBottom.click() #點擊 time.sleep(5)
(5)自定義滑塊驗證函數(shù)
當(dāng)填寫問卷次數(shù)過多,這時智能驗證之后還會出現(xiàn)滑塊驗證,這時候就需要滑塊驗證函數(shù)幫我們解決。
def huakuai(): # 當(dāng)次數(shù)多了的時候就會出現(xiàn)滑塊,這里是模擬人手解決滑塊拖動 pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠標(biāo)移動到x,y處,耗時0.2秒 time.sleep(1) pyautogui.dragTo(random.randint(888, 890), 791, 1)#讓鼠標(biāo)點擊并拖拽到x,y處,耗時1秒 time.sleep(1) pyautogui.click(random.randint(652, 667), random.randint(793, 795))#讓鼠標(biāo)點擊x,y處 time.sleep(1) pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠標(biāo)移動到x,y處,耗時0.2秒 time.sleep(1) pyautogui.dragTo(random.randint(888, 890), 791, 1)#讓鼠標(biāo)點擊并拖拽到x,y處,耗時1秒
(6)自定義屏幕滾動函數(shù)
當(dāng)問卷中的題數(shù)量多的時候,由于答題過快,屏幕沒有滑動,這時會被檢測出是機器人,就會提交失敗,所以我們還需要一個自定義屏幕滑動函數(shù)來幫我們解決屏幕滾動問題。
def gundong(driver, distance): #用于屏幕滾動 #測算出最大的距離根據(jù)電腦屏幕分辨率而異,一般填寫400到800,800是最大滑動距離 js = "var q=document.documentElement.scrollTop=" + str(distance) driver.execute_script(js) time.sleep(0.5)
(7)主函數(shù)
def zonghe(times): for i in range(0, times): # 初始配置,地址 url_survey = 'https://www.wjx.cn/vm/hiQpVeR.aspx' option = webdriver.ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_experimental_option('useAutomationExtension', False) # 本地下載的谷歌瀏覽器地址 option.binary_location = r'D:\Goole_Local\Google\Chrome\Application\chrome.exe' # 下載好的Chrome驅(qū)動的地址 driver = webdriver.Chrome(r"D:\Goole_Local\Google\Chrome\Application\chromedriver.exe", options=option) driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'}) # 啟動要填寫的地址 driver.get(url_survey) danxuan(driver) #調(diào)用單選函數(shù) duoxuan(driver) #調(diào)用多選函數(shù) gundong(driver, 600)#調(diào)用滾動屏幕函數(shù),如果不需要則注釋掉 #調(diào)用填空題函數(shù),這個3代表的意思是第三題是填空題,如果有其他填空題需要去完成再調(diào)用tiankong(driver, num)即可 #舉例:第八題也是填空題,這時我們加上tiankong(driver, 8) tiankong(driver, 3) # 最后交卷點擊提交 #time.slee()函數(shù)是表示延時的意思,里面可以放固定值也可以放隨機數(shù),這里我放的是隨機數(shù)。 time.sleep(random.randint(0, 1)) driver.find_element_by_css_selector('#ctlNext').click()#找到提交的css并點擊 time.sleep(4) renzheng(driver)#智能認證函數(shù)調(diào)用 huakuai()#滑塊函數(shù)調(diào)用 print('已經(jīng)提交了{}次問卷'.format(int(i) + int(1))) time.sleep(4) driver.quit()#停止
三、項目整體代碼
from selenium.webdriver.common.by import By # 沒有selenium庫的(請在所用的環(huán)境下pip install selenium) from selenium import webdriver #selenium庫 import random # 用于產(chǎn)生隨機數(shù) import time # 用于延時 import pyautogui # 用于模擬人手 def gundong(driver, distance): #延時+屏幕滾動 js = "var q=document.documentElement.scrollTop=" + str(distance) #下拉像素(800是基于最頂端測算的距離) driver.execute_script(js) time.sleep(0.5) def danxuan(driver): # 找到所有標(biāo)簽(定位問題)這里是單選 dan = driver.find_elements_by_css_selector('#div1 > div.ui-controlgroup.column1') for answer in dan: ans = answer.find_elements_by_css_selector('.ui-radio')#對應(yīng)的絕對子標(biāo)簽 random.choice(ans).click() # 找到標(biāo)簽并點擊 time.sleep(random.randint(0, 1)) def duoxuan(driver): #這里是多選題,找到所有多選的標(biāo)簽 duo = driver.find_elements_by_css_selector('#div2 > div.ui-controlgroup.column1') for answer in duo: ans = answer.find_elements_by_css_selector('.ui-checkbox')#對應(yīng)的絕對子標(biāo)簽 #隨機填幾次 for i in range(1, 7):#這里的7可以改成5,10,12 random.choice(ans).click()#找到標(biāo)簽并點擊 time.sleep(random.randint(0, 1)) def tiankong(driver, num): #填空函數(shù) #這里是所需要問題的標(biāo)簽匯總,例如有四個要答的問題,下面的answer的ABC數(shù)量需要跟index里面的數(shù)量相等 index = ["A", "B", "C"] # 自定義要回答的答案 answer = {"A": "python真的好用!", "B": "這個測試很成功!", "C": "填空題隨機填寫文本"} driver.find_element(by=By.CSS_SELECTOR, value=f'#q{num}')\ .send_keys(answer.get(index[random.randint(0, len(index)-1)])) def renzheng(driver): # 智能驗證,找到智能認證的標(biāo)簽 bth = driver.find_element_by_css_selector( '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0') bth.click()#點擊 time.sleep(1) rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按鈕 rectBottom.click() #點擊 time.sleep(5) def huakuai(): # 當(dāng)次數(shù)多了的時候就會出現(xiàn)滑塊,這里是模擬人手解決滑塊拖動 pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠標(biāo)移動到x,y處,耗時0.2秒 time.sleep(1) pyautogui.dragTo(random.randint(888, 890), 791, 1)#讓鼠標(biāo)點擊并拖拽到x,y處,耗時1秒 time.sleep(1) pyautogui.click(random.randint(652, 667), random.randint(793, 795))#讓鼠標(biāo)點擊x,y處 time.sleep(1) pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠標(biāo)移動到x,y處,耗時0.2秒 time.sleep(1) pyautogui.dragTo(random.randint(888, 890), 791, 1)#讓鼠標(biāo)點擊并拖拽到x,y處,耗時1秒 def zonghe(times): for i in range(0, times): # 初始配置,地址 url_survey = 'https://www.wjx.cn/vm/hiQpVeR.aspx' option = webdriver.ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_experimental_option('useAutomationExtension', False) # 本地下載的谷歌瀏覽器地址 option.binary_location = r'D:\Goole_Local\Google\Chrome\Application\chrome.exe' # 下載好的Chrome驅(qū)動的地址 driver = webdriver.Chrome(r"D:\Goole_Local\Google\Chrome\Application\chromedriver.exe", options=option) driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'}) # 啟動要填寫的地址 driver.get(url_survey) danxuan(driver) #調(diào)用單選函數(shù) duoxuan(driver) #調(diào)用多選函數(shù) gundong(driver, 600)#調(diào)用滾動屏幕函數(shù),如果不需要則注釋掉 tiankong(driver, 3)#調(diào)用填空題函數(shù) # 最后交卷點擊提交 time.sleep(random.randint(0, 1)) driver.find_element_by_css_selector('#ctlNext').click()#找到提交的css并點擊 time.sleep(4) renzheng(driver)#智能認證函數(shù)調(diào)用 huakuai()#滑塊函數(shù)調(diào)用 print('已經(jīng)提交了{}次問卷'.format(int(i) + int(1))) time.sleep(4) driver.quit()#停止 if __name__ == "__main__": zonghe(2)#里面填寫的數(shù)是表示要提交多少次問卷
四、項目修改及擴展
如果上面的代碼發(fā)現(xiàn)跟自己問卷星對不上且無法打開怎么辦,別慌!這里教你怎么修改代碼
①這里我們用谷歌瀏覽器打開所需要填寫的問卷星地址,然后用電腦上的F12打開開發(fā)者模式
②這里我們可以選用快捷鍵CTRL+SHIFT+C啟動元素檢查或者點擊我下圖標(biāo)注的地方來進行選擇到題號
③然后我們再查看選擇題項的位置在哪里,然后我們就可以知道地方,再選擇復(fù)制CSS地址就可以得到要修改的地方了
④復(fù)制完之后我們可以看到得到的是什么,這里得到的就是單選題的大標(biāo)簽
#div1 > div.ui-controlgroup.column1
再接著我們就可以看到各個小標(biāo)簽
⑤然后我們就可以修改我們的代碼了
def danxuan(driver): ''' 找到所有標(biāo)簽(定位問題)這里是單選,注意我們使用的是find.elements_by_CSS_selector() 這樣得到的是一個列表,里面包含了所有的選擇題,將我們得到的大標(biāo)簽填入如下 再修改我們所需要選擇的小標(biāo)簽,注意小標(biāo)簽填寫的時候前面要加 .(點,如:.ui-radio) 這是代表選擇題的絕對路徑,這樣選擇單選的時候就不會錯誤。 ''' dan = driver.find_elements_by_css_selector('#div1 > div.ui-controlgroup.column1') for answer in dan: ans = answer.find_elements_by_css_selector('.ui-radio')#對應(yīng)的絕對子標(biāo)簽 random.choice(ans).click() # 找到標(biāo)簽并點擊 time.sleep(random.randint(0, 1))
多選題和填空題也是一樣,看代碼相信大家一定能看懂,這里就不過多展示了
這里用的是CSS的方式,其實在項目中可以選擇ID查找,XPATH路徑去查找都可以,博客里面也有很多資料,都萬變不離其宗,找到對應(yīng)的標(biāo)簽即可。
driver.find_element_by_xpath('//*[@id="div1"]/div[2]/div[1]') 這是用XPATH得到的 簡單解釋一下里面的值含義吧 //*[@id="div1"]/div[2]/div[1] 第一個div1表示的是第一題,第二個div[2]表示的是第二大部分是選擇題,第三個div[1]表示的是選擇第一個。 那么你一定能看懂這個XPATH是什么意思 //*[@id="div2"]/div[2]/div[2] 這里表示的是第二題選擇題第二個。
五、總結(jié)
python的selenium庫是個很重要的網(wǎng)頁處理函數(shù)庫,在處理動態(tài)網(wǎng)頁上扮演者很重要的角色,一般我們所看到的網(wǎng)頁都可以用里面對應(yīng)方法來完成,只要理解到標(biāo)簽的含義,其實做這類的題是很簡單的,這里就是想起前面那段時間填寫問卷的時候,所以有感寫下這篇文章和方法,但是實際上如果是去比賽的做市場調(diào)研之類的,還是不要用這種方式,畢竟真人的感覺選擇和機器的隨機選擇出入還是很大的,在信度分析和效度分析很可能就會垮掉
到此這篇關(guān)于利用Python實現(xiàn)問卷星自動填寫的文章就介紹到這了,更多相關(guān)Python實現(xiàn)問卷星自動填寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
selenium+python實現(xiàn)1688網(wǎng)站驗證碼圖片的截取功能
這篇文章主要介紹了selenium+python實現(xiàn)1688網(wǎng)站驗證碼圖片的截取,需要的朋友可以參考下2018-08-08Python實現(xiàn)excel轉(zhuǎn)sqlite的方法
這篇文章主要介紹了Python實現(xiàn)excel轉(zhuǎn)sqlite的方法,結(jié)合實例形式分析了Python基于第三方庫xlrd讀取Excel文件及寫入sqlite的相關(guān)操作技巧,需要的朋友可以參考下2017-07-07pyv8學(xué)習(xí)python和javascript變量進行交互
這篇文章主要介紹了pyv8學(xué)習(xí)python和javascript變量進行交互,python取得javascript里面的值、javascript取得python里面的值、python和javascript里面的函數(shù)交互2013-12-12