前言
相信大家在写论文、作业的同时,想必大家被问卷填写的人数给难倒,尤其是低三下四求别人填写的时候,如果大家是像我这种平时不社交那一定是苦中苦了。那么有没有一种工具让我们实现自动化呢,答案是有的!在编程语言选择的同时,大家知道最易上手的,那莫过于我们大家都熟知的python语言了。那么接下来就让大家通过python实现大家心目中(ps:废话可直接跳过)
一、安装环境
1.1 、selenium和pyautogui库
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.2.1 执行本次程序需要在谷歌安装驱动文件(如未安装谷歌浏览器,请先下载谷歌浏览器下载链接),在下载驱动之前我们还需要去查找谷歌对应版本,步骤如下。
首先打开设置
然后点击关于chrome即可看到版本号
下面我们就可以下载谷歌驱动了(下载链接),找到对应的版本号进行下载,如果没找到对应的版本号,那么需要一个比较近的下载即可。假如你的版本号为103.0.5060.44,那么应该下载对应版本103.0.5060.53。(尽量把浏览器更新到近几月的版本,这样更全面。)
下载完成是一个压缩包,将压缩包解压后是一个.exe文件,将文件放进谷歌浏览器文件中,大家可以跟我放相同的文件中,如图所示。
二、代码如下
2.1、导入所需库
这里我们将所有需要的库全部导入
from selenium.webdriver.common.by import By # 没有selenium库的(请在所用的环境下pip install selenium)
from selenium import webdriver #selenium库
import random # 用于产生随机数
import time # 用于延时
import pyautogui # 用于模拟人手
2.2、验证信息
这里我们设置模拟人手滚动页面加延时,最后进行验证。
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)
2.3、跳过滑块
因次数过多,可能出现滑块需要验证。我们将模拟人手滑动滑块
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秒
2.4、程序所需函数选择
2.4.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))
2.4.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))
2.5、项目主要代码
这里将展示提交页面、以及你问卷的链接。是本次问卷最核心部位。
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()#停止
2.6、填写次数
这里写上你谷歌的地址,以及你驱动的地址,然后填上你需要完成的次数。
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)
四、代码的修改及拓展
4.1、环境
如果你的问卷是其他的题目跟我的题目完全对不上怎么办,这里教你如何修改代码。
我们首先打开我们的谷歌浏览器,然后点击键盘上的F12开发者工具。
4.2、所需地址
大家可使用CTRL+SHIFT+C来启动元素来找到我们需要的题号。
4.3、修改地址
我们在这里可以查看到element、selector、xpath等多个地址。我们将css地址复制粘贴到代码对应位置即可。
4.4、演示修改地址
如何修改代码,话不多说将题号和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可以方便地完成对问卷的填写和提交的自动化操作。