最近有一个社会实践需要做问卷调查,突发奇想搞一个自动化脚本,省事省米
selenium是一款网页爬虫重要的工具。
这里需要准备chrome浏览器以及对应的驱动。需要注意的是驱动的版本需要和chrome保持一致。
chrome浏览器版自行查看本机安装版本。

chrome驱动下载链接 chrome驱动链接找到对应版本的驱动。

下载后将安装包解压(解压后为.exe文件)在这个文件夹下
from selenium import webdriver
import time
import random
from selenium.webdriver.common.by import By
import pyautogui
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=option)
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
browser.maximize_window() # 窗口最大化
# 这行代码的作用是将webdriver这个属性置为undefined
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
browser.get(url)
time.sleep(2)
# -*- coding: utf-8 -*-
# @Time : 2023/1/26 11:34
# @Author : wkk
# @File : Python自动化填问卷星.py
from selenium import webdriver
import time
import random
from selenium.webdriver.common.by import By
import pyautogui
def run(num, url):
for i in range(num):
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=option)
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
browser.maximize_window() # 窗口最大化
# 这行代码的作用是将webdriver这个属性置为undefined
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
browser.get(url)
time.sleep(2)
num1 = random.randint(1, 2)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q1_{num1}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q1_{num1}']").click()
time.sleep(0.5)
num2 = random.randint(1, 3)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q2_{num2}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q2_{num2}']").click()
time.sleep(0.5)
num3 = random.randint(1, 3)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q3_{num3}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q3_{num3}']").click()
time.sleep(0.5)
num4 = random.randint(1, 3)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q4_{num4}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q4_{num4}']").click()
time.sleep(0.5)
num5 = random.randint(1, 2)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q5_{num5}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q5_{num5}']").click()
time.sleep(0.5)
num6 = random.randint(1, 3)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q6_{num6}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q6_{num6}']").click()
time.sleep(0.5)
num7 = random.randint(1, 4)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q7_{num7}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q7_{num7}']").click()
time.sleep(0.5)
# num8 = random.randint(1, 3)
# if browser.find_element(by=By.XPATH, value=f"//div[@for='q8_{num8}']"):
# browser.find_element(by=By.XPATH, value=f"//div[@for='q8_{num8}']").click()
# time.sleep(0.5)
# 问题5
randomId = random.randint(1, 3) # 随机数选择(选多少个)
for i in range(1, randomId + 1): # 循环 实现多选效果
randomId1 = random.randint(1, 3) # 随机选择第1到第6个选项之一
# 两种js实现方式
js = "document.getElementById(\"q8_" + str(randomId1) + "\").checked = true"
browser.execute_script(js)
# 延时
time.sleep(1)
num9 = random.randint(1, 7)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q9_{num9}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q9_{num9}']").click()
time.sleep(0.5)
num10 = random.randint(1, 3)
if browser.find_element(by=By.XPATH, value=f"//div[@for='q10_{num10}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q10_{num10}']").click()
time.sleep(0.5)
if browser.find_element(by=By.XPATH, value="//div[@class='submitbtn mainBgColor']"):
browser.find_element(by=By.XPATH, value="//div[@class='submitbtn mainBgColor']").click()
time.sleep(1)
try:
element = browser.find_element(By.CSS_SELECTOR, "#alert_box > div:nth-child(2) > div:nth-child(2) > button")
element.click()
time.sleep(1)
yanz = browser.find_element(By.ID, "rectMask")
yanz.click()
time.sleep(4)
except:
pass
# 先点确认
try:
browser.find_element(By.XPATH, '//*[@id="layui-layer1"]/div[3]/a[1]').click()
time.sleep(1)
except:
pass
# 再点智能验证提示框,进行智能验证
try:
browser.find_element(By.XPATH, '//*[@id="SM_BTN_WRAPPER_1"]').click()
time.sleep(3)
except:
pass
# 滑块验证
pyautogui.moveTo(789, 805, duration=1) # 传入屏幕的位置
time.sleep(0.5)
pyautogui.dragRel(370, 0, duration=0.8) # 拖动
# pyautogui.moveTo(789, 805, duration=1) # 回到原处
# pyautogui.moveRel(370, 0, duration=1)
# pyautogui.dragRel(256, 0, duration=0.8)
# pyautogui.moveTo(789, 805)
# time.sleep(0.5)
# pyautogui.dragRel(370, 0, duration=0.8)
time.sleep(5)
browser.close()
print(f"第{i + 1}份已经完成")
if __name__ == '__main__':
num = 10 # 填的份数
url = 'https://www.wjx.cn/vm/tXQkrbD.aspx' # 链接
run(num, url)
以上代码是我根据我自己的问卷形式来的,具体参数还得跟着问卷走,代码亲测有效,当短时间内刷的问卷数过多时,可能会出现第二重智能验证,这就要手动验证了哦,所以为了防止出现二重智能验证,在每提交完一份问卷后,要用time.sleep函数用于延时 , 避免提交过快。
本文仅为技术交流,最好不要用来恶意填写别人的问卷,以造成问卷质量低下的情况,请大家还是根据自己的实际情况填写问卷哦。
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的