赞
踩
相信大家在写论文、作业的同时,想必大家被问卷填写的人数给难倒,尤其是低三下四求别人填写的时候,如果大家是像我这种平时不社交那一定是苦中苦了。那么有没有一种工具让我们实现自动化呢,答案是有的!在编程语言选择的同时,大家知道最易上手的,那莫过于我们大家都熟知的python语言了。那么接下来就让大家通过python实现大家心目中(ps:废话可直接跳过)
1.1.1 这里需要安装selenium库,此库作用是帮我们爬取网站信息和需要处理的页面。
1.1.2 还需要安装pyautogui库,此库作用为模拟我们真人填写。
我们将直接使用清华镜像网站安装
- pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple
- pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
1.2.1 执行本次程序需要在谷歌安装驱动文件(如未安装谷歌浏览器,请先下载谷歌浏览器下载链接),在下载驱动之前我们还需要去查找谷歌对应版本,步骤如下。
首先打开设置
然后点击关于chrome即可看到版本号
下面我们就可以下载谷歌驱动了(下载链接),找到对应的版本号进行下载,如果没找到对应的版本号,那么需要一个比较近的下载即可。假如你的版本号为103.0.5060.44,那么应该下载对应版本103.0.5060.53。(尽量把浏览器更新到近几月的版本,这样更全面。)
下载完成是一个压缩包,将压缩包解压后是一个.exe文件,将文件放进谷歌浏览器文件中,大家可以跟我放相同的文件中,如图所示。
这里我们将所有需要的库全部导入
- from selenium.webdriver.common.by import By # 没有selenium库的(请在所用的环境下pip install selenium)
- from selenium import webdriver #selenium库
- import random # 用于产生随机数
- 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 renzheng(driver):
- # 智能验证,找到智能认证的标签
- 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():
- # 当次数多了的时候就会出现滑块,这里是模拟人手解决滑块拖动
- pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
- time.sleep(1)
- pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
- time.sleep(1)
- pyautogui.click(random.randint(652, 667), random.randint(793, 795))#让鼠标点击x,y处
- time.sleep(1)
- pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
- time.sleep(1)
- pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
当问卷中有十个单选,可直接判断进行自动答题,也可设置其中一题为特定答案。
- def One(driver):
- # 第一页,通过f12发现可用的标签有十个,且第一个是废标签,所以不用管
- for i in range(1, 11):
-
- #对应的绝对子标签
- gundong(driver, i * 400)
- ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
- # 找到对应题,然后进行答题
- if i == 2:
- driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()
-
- elif i == 3:
- driver.find_element(By.XPATH,f'//*[@id="div{3}"]/div[2]/div[2]').click()
- else:
- for s in ans:
- iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
- random.choice(iSsA).click()
- time.sleep(random.randint(1, 2))
if为多少就是多少题,循环需设置你题目共有多少选择题。
- def Two(driver):
- # 第二页,通过f12发现可用的标签有11-25个,且第一个是废标签,所以不用管
- for i in range(11, 25):
- gundong(driver, i * 400)
- #对应的绝对子标签
- ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
- # gundong(driver, distance=800)
- if i == 17:
- driver.find_element(By.XPATH, '//*[@id="div17"]/div[2]/div[3]').click()
- elif i == 19:
- for j in range(1, 8):
- s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a/i[1]')
- s.click()
- time.sleep(1.5)
- elif i == 20:
- for j in range(1, 8):
- s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a')
- s.click()
- time.sleep(1.5)
- elif i == 22:
- for answer in ans:
- s = answer.find_elements(By.CSS_SELECTOR,".ui-checkbox") # 对应的绝对子标签
- # 随机填几次
- for k in range(1, 4): # 这里的7可以改成5,10,12
- random.choice(s).click() # 找到标签并点击
- time.sleep(random.randint(0, 1))
- else:
- for s in ans:
- iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
- random.choice(iSsA).click()
- time.sleep(random.randint(1, 2))
这里将展示提交页面、以及你问卷的链接。是本次问卷最核心部位。
- def zonghe(times, GoogleExe, GoogleDriver):
- for i in range(0, times):
- # 初始配置,地址
- url_survey = '你问卷的链接'
- option = webdriver.ChromeOptions()
- option.add_argument('--disable-automation')
- option.add_experimental_option('excludeSwitches', ['enable-automation'])
- option.add_experimental_option('useAutomationExtension', False)
- # 本地下载的谷歌浏览器地址
- option.binary_location = GoogleExe
- # 下载好的Chrome驱动的地址
- driver = webdriver.Chrome(executable_path=GoogleDriver, options=option)
- driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
- {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
-
- driver.get(url_survey)
- One(driver) # 第一页函数
- # gundong(driver, distance=600)
- time.sleep(1)
- driver.find_element(By.CSS_SELECTOR, "#divNext > a").click() # 找到下一页
- Two(driver) # 第二页函数
- # gundong(driver, distance=600)
- time.sleep(1)
- driver.find_element(By.CSS_SELECTOR, "#ctlNext").click()
- # gundong(driver, 800)#调用滚动屏幕函数,如果不需要则注释掉
-
- # 最后交卷点击提交//*[@id="drv19_4"]/td[2]/a/i[1] //*[@id="drv19_4"]/td[3]/a/i[1]
- # time.sleep(random.randint(0, 1))
-
- # time.sleep(4)
- #
- # renzheng(driver)#智能认证函数调用
- # huakuai()#滑块函数调用
- print('已经提交了{}次问卷'.format(int(i) + int(1)))
- time.sleep(4)
- driver.quit()#停止
这里写上你谷歌的地址,以及你驱动的地址,然后填上你需要完成的次数。
- if __name__ == "__main__":
- # 填写谷歌浏览器的位置
- googleExe = r"D:\python目录\Win_1129160_chrome-win\chrome-win\chrome.exe"
- # 填写对应谷歌驱动的位置
- googleDriver = r"D:\python目录\Win_1129160_chromedriver_win32\chromedriver.exe"
- # 里面填写的数是表示要提交多少次问卷
- zonghe(3, googleExe, googleDriver)
下面将完整代码展示给大家。
- from selenium.webdriver.common.by import By # 没有selenium库的(请在所用的环境下pip install selenium)
- from selenium import webdriver #selenium库
- import random # 用于产生随机数
- 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 renzheng(driver):
- # 智能验证,找到智能认证的标签
- 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():
- # 当次数多了的时候就会出现滑块,这里是模拟人手解决滑块拖动
- pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
- time.sleep(1)
- pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
- time.sleep(1)
- pyautogui.click(random.randint(652, 667), random.randint(793, 795))#让鼠标点击x,y处
- time.sleep(1)
- pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
- time.sleep(1)
- pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
-
-
- def One(driver):
- # 第一页,通过f12发现可用的标签有十个,且第一个是废标签,所以不用管
- for i in range(1, 11):
-
- #对应的绝对子标签
- gundong(driver, i * 400)
- ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
- # 找到对应题,然后进行答题
- if i == 2:
- driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()
-
- elif i == 3:
- driver.find_element(By.XPATH,f'//*[@id="div{3}"]/div[2]/div[2]').click()
- else:
- for s in ans:
- iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
- random.choice(iSsA).click()
- time.sleep(random.randint(1, 2))
-
- def Two(driver):
- # 第二页,通过f12发现可用的标签有11-25个,且第一个是废标签,所以不用管
- for i in range(11, 25):
- gundong(driver, i * 400)
- #对应的绝对子标签
- ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
- # gundong(driver, distance=800)
- if i == 17:
- driver.find_element(By.XPATH, '//*[@id="div17"]/div[2]/div[3]').click()
- elif i == 19:
- for j in range(1, 8):
- s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a/i[1]')
- s.click()
- time.sleep(1.5)
- elif i == 20:
- for j in range(1, 8):
- s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a')
- s.click()
- time.sleep(1.5)
- elif i == 22:
- for answer in ans:
- s = answer.find_elements(By.CSS_SELECTOR,".ui-checkbox") # 对应的绝对子标签
- # 随机填几次
- for k in range(1, 4): # 这里的7可以改成5,10,12
- random.choice(s).click() # 找到标签并点击
- time.sleep(random.randint(0, 1))
- else:
- for s in ans:
- iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
- random.choice(iSsA).click()
- time.sleep(random.randint(1, 2))
-
-
- def zonghe(times, GoogleExe, GoogleDriver):
- for i in range(0, times):
- # 初始配置,地址
- url_survey = '你问卷的链接'
- option = webdriver.ChromeOptions()
- option.add_argument('--disable-automation')
- option.add_experimental_option('excludeSwitches', ['enable-automation'])
- option.add_experimental_option('useAutomationExtension', False)
- # 本地下载的谷歌浏览器地址
- option.binary_location = GoogleExe
- # 下载好的Chrome驱动的地址
- driver = webdriver.Chrome(executable_path=GoogleDriver, options=option)
- driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
- {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
-
- driver.get(url_survey)
- One(driver) # 第一页函数
- # gundong(driver, distance=600)
- time.sleep(1)
- driver.find_element(By.CSS_SELECTOR, "#divNext > a").click() # 找到下一页
- Two(driver) # 第二页函数
- # gundong(driver, distance=600)
- time.sleep(1)
- driver.find_element(By.CSS_SELECTOR, "#ctlNext").click()
- # gundong(driver, 800)#调用滚动屏幕函数,如果不需要则注释掉
-
- # 最后交卷点击提交//*[@id="drv19_4"]/td[2]/a/i[1] //*[@id="drv19_4"]/td[3]/a/i[1]
- # time.sleep(random.randint(0, 1))
-
- # time.sleep(4)
- #
- # renzheng(driver)#智能认证函数调用
- # huakuai()#滑块函数调用
- print('已经提交了{}次问卷'.format(int(i) + int(1)))
- time.sleep(4)
- driver.quit()#停止
-
-
- if __name__ == "__main__":
- # 填写谷歌浏览器的位置
- googleExe = r"D:\python目录\Win_1129160_chrome-win\chrome-win\chrome.exe"
- # 填写对应谷歌驱动的位置
- googleDriver = r"D:\python目录\Win_1129160_chromedriver_win32\chromedriver.exe"
- # 里面填写的数是表示要提交多少次问卷
- zonghe(3, googleExe, googleDriver)
如果你的问卷是其他的题目跟我的题目完全对不上怎么办,这里教你如何修改代码。
我们首先打开我们的谷歌浏览器,然后点击键盘上的F12开发者工具。
大家可使用CTRL+SHIFT+C来启动元素来找到我们需要的题号。
我们在这里可以查看到element、selector、xpath等多个地址。我们将css地址复制粘贴到代码对应位置即可。
如何修改代码,话不多说将题号和div直接修改即可。如修改第二题,将第二题f‘后面直接修改即可。多选题和单选题相同,都是一样的步骤。
- if i == 2:
- driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()
Selenium是一个用于自动化Web应用程序测试的工具,它可以使用不同的编程语言进行使用,其中Python就是本次讲的全部内容。Selenium可以模拟用户和浏览器的交互,实现自动化测试和网站数据抓取等功能。问卷星是一种常见的在线调查工具,在Python中使用Selenium可以方便地完成对问卷的填写和提交的自动化操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。