为啥要做这个呢。因为某天老婆让我帮她填问卷,而且是填几十份一模一样的,点的我鼠标都要冒烟了。所以研究下自动化工具,咱肯定不能一个个手工去点呀。
用edge打开浏览器
driver = webdriver.Edge(options=self.option)
# 随机User-agent
num = random.randint(0, 2)
driver.execute_cdp_cmd("Network.setUserAgentOverride", {"userAgent": self.ua[num]})
# 将webdriver属性置为undefined
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
driver.get(self.wj_url)
获取页面上的所有题目,进行遍历
questions = driver.find_elements(By.CLASS_NAME, "field.ui-field-contain")
for i in range(1, len(questions) + 1):
xpath = '//*[@id="div{}"]'.format(i)
question = driver.find_element(By.XPATH, xpath)
# 获取题目类型
ques_type = question.get_attribute("type")
根据题目类型对题目进行处理,读取设定好的选项,进行填写。以单选题为例
def single_choice(driver, id, prob, idx):
xpath = '//*[@id="div{}"]/div[2]/div'.format(id)
answers = driver.find_elements(By.XPATH, xpath)
# 如果没有传入比例,默认为等比例
p = preprocess_prob(prob.get(idx), len(answers))
choice = numpy.random.choice(a=numpy.arange(1, len(answers) + 1), p=p)
xpath = '//*[@id="div{}"]/div[2]/div[{}]'.format(id, choice)
# driver.find_element(By.XPATH, xpath).click()
ActionChains(driver).move_to_element(driver.find_element(By.XPATH, xpath)).click().perform()
idx += 1
return idx
其中选项的比例是由如下代码计算的
def preprocess_prob(prob, length):
"""计算该选项的比例"""
if len(prob) == 0:
prob = numpy.ones(length)
return [i/sum(prob) for i in prob]
完整代码链接:https://github.com/h-kayotin/kayotin_sel
请安装所需的库:requests、numpy、Selenium
在config.py中设定问卷答案:
# 设置每个问题的填写情况,按照每个选项的概率填写。例如ABCD对应1111的话,就是各25%
# !!! 注意:选项长度一定要和实际一样,否则会报错
answers = {
1: [1, 0],
2: [1, 0, 0, 1],
3: [1, 1, 0, 0, 0],
}
# 简答题,需要设置好文本;如没有请无视即可
answer_list = {
6: ["文本1", "文本2"]
}
以上的问题代表了这个问卷的填写情况:问卷链接
在config.py中填写代理IP(选填:如果不使用代理IP,这个api里保持如下就行,但不能为空
# 实际上不使用代理也可以,无非就是做的多了会有验证
api = "https://service.ipzan.com/core-extract"
运行主程序auto_wjx.py,选择做多少份
my_url = "https://www.wjx.cn/vm/rJoCZrn.aspx"
my_wjx = MyWjx(my_url, 10)
my_wjx.fill_in() # 做1份
my_wjx.do_works() # 做10份
该工具很大程度上参考了如下链接:
https://github.com/zzmvp-1/wjx-auto-fill