admin管理员组文章数量:1565292
Python爬虫拓展应用: 最新版本问卷星自动刷,包括:解决智能验证、滑块等问题
- Python爬虫自动刷“问卷星”网站问卷
- 爬虫运行准备
- 爬虫运行代码
- 代码解释
- 参考博客
Python爬虫自动刷“问卷星”网站问卷
基础需求:至少学过一门高级语言,有一定编程的思维,能够查阅理解python的语法。
发现女朋友又要收集几百份问卷数据,看她可怜巴巴的到处找人互助和填写问卷,我便查阅了相关资料,做了这个问卷自动刷。我女朋友是人文专业的,我深知很多文科的同学都需要进行痛苦的问卷收集,他们很需要这样的一款问卷自动刷爬虫,因此,本文将会尽量以通俗易懂的方式来讲解这款爬虫,希望大家能够脱离问卷的折磨,自己动手丰衣足食,加油吧~
爬虫运行准备
人类居住在地球上需要一个居住环境,同理,爬虫运行也需要一个运行环境。所以我们应该需要先下载一个合适的运行环境:
- Python集成开发环境 ,开发环境就是程序可以运行的大环境,可以把代码导入到该开发环境中使用。关于开发环境的使用说明网上资料特别齐全,很多命令不需要掌握,你只要知道打开、运行、停止等几个基本命令就行了。开发环境的种类有很多,有兴趣的可以自行寻找进行下载,这里我推荐用pycharm社区版(社区版是免费的)网址链接: pycharm官网.
- 运行程序所依赖的库 ,开发环境是爬虫运行的大环境,那么库就是爬虫运行的小环境。不同的软件有属于自己的小环境,相当于咱们每个人也都需要有自己的小房子。我用的是python3.8版本,在拥有了相关的python版本(安装集成开发环境一般自带一款python的版本)后,打开命令行窗口(如何打开命令行窗口见百度)
// 下载第一个依赖的库
pip install selenium;
// 下载第二个依赖的库
pip install pyautogui;
// 下载其他依赖的库
// 如果运行时,开发环境的运行窗口提示你缺少什么库,可以直接用下方命令对缺少的库进行下载
pip install 库名;
- 安装Chrome驱动 ,到网址链接: Chrome团队官网下载ChromeDriver驱动,有了这个驱动,你才能通过代码打开网页。但是,这里首先要保证你有谷歌浏览器,并且下载的驱动与谷歌浏览器的版本要对应。至于如何查看自己的版本自行百度。
爬虫运行代码
当你拥有了一个合适的运行环境,也有了相关可以依赖的库,那么现在就可以在开发环境中新建一个项目,然后再里面新建一个python文件,先把代码全部复制到文件中:
from selenium import webdriver
import time
from random import *
import pyautogui
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
if __name__ == '__main__':
# 刷问卷的份数。
for index in range(1, 50):
print(index, "份正在执行操作......")
# 给出所需的url和option参数
url_survey = ("https://www.wjx/vj/YFmcIQw.aspx") # 根据需要填写url,也就是自己的网址
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=option)
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
driver.get(url_survey)
time.sleep(2)
##开始做题
# 处理Q1
# 生成随机数,决定点哪个按钮
q1 = random()
if 0 <= q1 <= 0.5:
# 通过属性定位元素,第x题就是qx,第y个选项就是_y,例如Q1的"//a[@rel='q1_1']"中,'q1_1'表示第一题的第一个选项
# q1_1是Q1的第1个按钮
driver.find_element_by_xpath("//a[@rel='q1_1']").click()
else:
driver.find_element_by_xpath("//a[@rel='q1_2']").click()
# 处理Q2
# 生成随机数,决定点哪个按钮
q2 = random()
if 0 <= q2 <= 0.1:
driver.find_element_by_xpath("//a[@rel='q2_1']").click()
elif 0.1 < q2 <= 0.25:
driver.find_element_by_xpath("//a[@rel='q2_2']").click()
elif 0.25 < q2 <= 0.5:
driver.find_element_by_xpath("//a[@rel='q2_3']").click()
else:
driver.find_element_by_xpath("//a[@rel='q2_4']").click()
# 处理Q3
# 生成随机数,决定点哪个按钮
q3 = random()
if 0 <= q3 <= 0.25:
driver.find_element_by_xpath("//a[@rel='q3_1']").click()
elif 0.25 < q3 <= 0.50:
driver.find_element_by_xpath("//a[@rel='q3_2']").click()
elif 0.50 < q3 <= 0.75:
driver.find_element_by_xpath("//a[@rel='q3_3']").click()
else:
driver.find_element_by_xpath("//a[@rel='q3_4']").click()
# 处理Q4
# 生成随机数,决定点哪个按钮
q4 = random()
if 0 <= q4 <= 0.8:
driver.find_element_by_xpath("//a[@rel='q4_1']").click()
elif 0.8 < q4 <= 0.9:
driver.find_element_by_xpath("//a[@rel='q4_2']").click()
else:
driver.find_element_by_xpath("//a[@rel='q4_3']").click()
# 处理Q5
# 生成随机数,决定点哪个按钮
q5 = random()
if 0 <= q5 <= 0.25:
driver.find_element_by_xpath("//a[@rel='q5_1']").click()
elif 0.25 < q5 <= 0.50:
driver.find_element_by_xpath("//a[@rel='q5_2']").click()
elif 0.50 < q5 <= 0.75:
driver.find_element_by_xpath("//a[@rel='q5_3']").click()
else:
driver.find_element_by_xpath("//a[@rel='q5_4']").click()
# 处理Q6
# 生成随机数,决定点哪个按钮
q6 = random()
if 0 <= q6 <= 0.9:
# 通过属性定位元素
# q1_1是Q1的第1个按钮
driver.find_element_by_xpath("//a[@rel='q6_1']").click()
else:
driver.find_element_by_xpath("//a[@rel='q6_2']").click()
# Q6如果选择有过,则处理Q7-Q10
if 0 <= q6 <= 0.9:
# 处理Q7
# 生成随机数,决定点哪个按钮
q7 = random()
if 0 <= q7 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q7_1']").click()
driver.find_element_by_xpath("//a[@rel='q7_4']").click()
elif 0.15 < q7 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q7_2']").click()
driver.find_element_by_xpath("//a[@rel='q7_3']").click()
elif 0.30 < q7 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q7_2']").click()
driver.find_element_by_xpath("//a[@rel='q7_5']").click()
elif 0.45 < q7 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q7_4']").click()
driver.find_element_by_xpath("//a[@rel='q7_5']").click()
elif 0.45 < q7 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q7_2']").click()
else:
driver.find_element_by_xpath("//a[@rel='q7_1']").click()
driver.find_element_by_xpath("//a[@rel='q7_2']").click()
driver.find_element_by_xpath("//a[@rel='q7_5']").click()
# 处理Q8
# 生成随机数,决定点哪个按钮
q8 = random()
if 0 <= q8 <= 0.6:
driver.find_element_by_xpath("//a[@rel='q8_1']").click()
elif 0.6 < q8 <= 0.8:
driver.find_element_by_xpath("//a[@rel='q8_2']").click()
else:
driver.find_element_by_xpath("//a[@rel='q8_3']").click()
# 处理Q9
# 生成随机数,决定点哪个按钮
q9 = random()
if 0 <= q9 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q9_1']").click()
driver.find_element_by_xpath("//a[@rel='q9_4']").click()
elif 0.15 < q9 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q9_2']").click()
driver.find_element_by_xpath("//a[@rel='q9_3']").click()
elif 0.30 < q9 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q9_6']").click()
driver.find_element_by_xpath("//a[@rel='q9_5']").click()
elif 0.45 < q9 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q9_7']").click()
driver.find_element_by_xpath("//a[@rel='q9_8']").click()
driver.find_element_by_xpath("//a[@rel='q9_10']").click()
elif 0.45 < q9 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q9_1']").click()
else:
driver.find_element_by_xpath("//a[@rel='q9_1']").click()
driver.find_element_by_xpath("//a[@rel='q9_2']").click()
driver.find_element_by_xpath("//a[@rel='q9_5']").click()
driver.find_element_by_xpath("//a[@rel='q9_9']").click()
driver.find_element_by_xpath("//a[@rel='q9_7']").click()
# 处理Q10
# 生成随机数,决定点哪个按钮
q10 = random()
if 0 <= q10 <= 0.2:
# 通过属性定位元素
# q10_1是Q10的第1个按钮
driver.find_element_by_xpath("//a[@rel='q10_1']").click()
else:
driver.find_element_by_xpath("//a[@rel='q10_2']").click()
# Q10如果选择有过,则处理Q11
if 0 <= q10 <= 0.2:
# 处理Q11
# 生成随机数,决定点哪个按钮
q11 = random()
if 0 <= q11 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q11_1']").click()
driver.find_element_by_xpath("//a[@rel='q11_2']").click()
elif 0.15 < 11 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q11_2']").click()
driver.find_element_by_xpath("//a[@rel='q11_3']").click()
elif 0.30 < q11 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q11_3']").click()
driver.find_element_by_xpath("//a[@rel='q11_4']").click()
elif 0.45 < q11 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q11_4']").click()
driver.find_element_by_xpath("//a[@rel='q11_5']").click()
driver.find_element_by_xpath("//a[@rel='q11_6']").click()
elif 0.45 < q11 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q11_7']").click()
driver.find_element_by_xpath("//a[@rel='q11_8']").click()
driver.find_element_by_xpath("//a[@rel='q11_9']").click()
else:
driver.find_element_by_xpath("//a[@rel='q11_1']").click()
driver.find_element_by_xpath("//a[@rel='q11_9']").click()
driver.find_element_by_xpath("//a[@rel='q11_10']").click()
driver.find_element_by_xpath("//a[@rel='q11_11']").click()
driver.find_element_by_xpath("//a[@rel='q11_12']").click()
# 处理Q12
# 生成随机数,决定点哪个按钮
q12 = random()
if 0 <= q12 <= 0.2:
# 通过属性定位元素
driver.find_element_by_xpath("//a[@rel='q12_1']").click()
else:
driver.find_element_by_xpath("//a[@rel='q12_2']").click()
# Q12如果选择有过,则处理Q13
if 0 <= q12 <= 0.2:
# 处理Q13
# 生成随机数,决定点哪个按钮
q13 = random()
if 0 <= q13 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q13_1']").click()
driver.find_element_by_xpath("//a[@rel='q13_2']").click()
elif 0.15 < 13 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q13_2']").click()
driver.find_element_by_xpath("//a[@rel='q13_3']").click()
elif 0.30 < q13 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q13_3']").click()
driver.find_element_by_xpath("//a[@rel='q13_4']").click()
elif 0.45 < q13 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q13_4']").click()
driver.find_element_by_xpath("//a[@rel='q13_5']").click()
driver.find_element_by_xpath("//a[@rel='q13_6']").click()
elif 0.45 < q13 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q13_7']").click()
driver.find_element_by_xpath("//a[@rel='q13_8']").click()
driver.find_element_by_xpath("//a[@rel='q13_9']").click()
else:
driver.find_element_by_xpath("//a[@rel='q13_1']").click()
driver.find_element_by_xpath("//a[@rel='q13_9']").click()
driver.find_element_by_xpath("//a[@rel='q13_10']").click()
driver.find_element_by_xpath("//a[@rel='q13_11']").click()
driver.find_element_by_xpath("//a[@rel='q13_12']").click()
# 处理Q14
# 生成随机数,决定点哪个按钮
q14 = random()
if 0 <= q14 <= 0.5:
# 通过属性定位元素
# q1_1是Q1的第1个按钮
driver.find_element_by_xpath("//a[@rel='q14_1']").click()
else:
driver.find_element_by_xpath("//a[@rel='q14_2']").click()
# 处理Q15
# 生成随机数,决定点哪个按钮
q15 = random()
if 0 <= q15 <= 0.1:
# 通过属性定位元素
# q1_1是Q1的第1个按钮
driver.find_element_by_xpath("//a[@rel='q15_1']").click()
elif 0.1 < q15 <= 0.55:
driver.find_element_by_xpath("//a[@rel='q15_2']").click()
else:
driver.find_element_by_xpath("//a[@rel='q15_3']").click()
# Q14如果选择不会,则处理Q16
if 0.5 < q14 <= 1:
# 处理Q16
# 生成随机数,决定点哪个按钮
q16 = random()
if 0 <= q16 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q16_1']").click()
driver.find_element_by_xpath("//a[@rel='q16_2']").click()
elif 0.15 < 16 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q16_2']").click()
driver.find_element_by_xpath("//a[@rel='q16_3']").click()
elif 0.30 < q16 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q16_3']").click()
##driver.find_element_by_xpath("//a[@rel='q16_4']").click()
elif 0.45 < q16 <= 0.60:
##driver.find_element_by_xpath("//a[@rel='q16_4']").click()
driver.find_element_by_xpath("//a[@rel='q16_2']").click()
driver.find_element_by_xpath("//a[@rel='q16_1']").click()
elif 0.45 < q16 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q16_3']").click()
driver.find_element_by_xpath("//a[@rel='q16_1']").click()
driver.find_element_by_xpath("//a[@rel='q16_2']").click()
else:
driver.find_element_by_xpath("//a[@rel='q16_1']").click()
driver.find_element_by_xpath("//a[@rel='q16_2']").click()
driver.find_element_by_xpath("//a[@rel='q16_3']").click()
# 处理Q17
# 生成随机数,决定点哪个按钮
q17 = random()
if 0 <= q17 <= 0.25:
# 通过属性定位元素
# q1_1是Q1的第1个按钮
driver.find_element_by_xpath("//a[@rel='q17_1']").click()
elif 0.25 < q17 <= 0.55:
driver.find_element_by_xpath("//a[@rel='q17_2']").click()
elif 0.55 < q17 <= 0.75:
driver.find_element_by_xpath("//a[@rel='q17_2']").click()
else:
driver.find_element_by_xpath("//a[@rel='q17_3']").click()
# 处理Q18
# 生成随机数,决定点哪个按钮
q18 = random()
if 0 <= q18 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q18_1']").click()
driver.find_element_by_xpath("//a[@rel='q18_4']").click()
elif 0.15 < q18 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q18_2']").click()
driver.find_element_by_xpath("//a[@rel='q18_3']").click()
elif 0.30 < q18 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q18_2']").click()
driver.find_element_by_xpath("//a[@rel='q18_5']").click()
elif 0.45 < q18 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q18_4']").click()
driver.find_element_by_xpath("//a[@rel='q18_5']").click()
elif 0.45 < q18 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q18_6']").click()
else:
driver.find_element_by_xpath("//a[@rel='q18_1']").click()
driver.find_element_by_xpath("//a[@rel='q18_2']").click()
driver.find_element_by_xpath("//a[@rel='q18_5']").click()
driver.find_element_by_xpath("//a[@rel='q18_6']").click()
# 处理Q19
# 生成随机数,决定点哪个按钮
q19 = random()
if 0 <= q19 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q19_1']").click()
driver.find_element_by_xpath("//a[@rel='q19_4']").click()
driver.find_element_by_xpath("//a[@rel='q19_7']").click()
elif 0.15 < q19 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q19_2']").click()
driver.find_element_by_xpath("//a[@rel='q19_3']").click()
elif 0.30 < q19 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q19_2']").click()
driver.find_element_by_xpath("//a[@rel='q19_5']").click()
elif 0.45 < q19 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q19_4']").click()
driver.find_element_by_xpath("//a[@rel='q19_5']").click()
elif 0.45 < q19 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q19_6']").click()
else:
driver.find_element_by_xpath("//a[@rel='q19_1']").click()
driver.find_element_by_xpath("//a[@rel='q19_2']").click()
driver.find_element_by_xpath("//a[@rel='q19_5']").click()
driver.find_element_by_xpath("//a[@rel='q19_6']").click()
# 处理Q20
# 生成随机数,决定点哪个按钮
q20 = random()
if 0 <= q20 <= 0.15:
driver.find_element_by_xpath("//a[@rel='q20_1']").click()
driver.find_element_by_xpath("//a[@rel='q20_4']").click()
elif 0.15 < q20 <= 0.30:
driver.find_element_by_xpath("//a[@rel='q20_2']").click()
driver.find_element_by_xpath("//a[@rel='q20_3']").click()
elif 0.30 < q20 <= 0.45:
driver.find_element_by_xpath("//a[@rel='q20_2']").click()
elif 0.45 < q20 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q20_4']").click()
elif 0.45 < q20 <= 0.60:
driver.find_element_by_xpath("//a[@rel='q20_4']").click()
else:
driver.find_element_by_xpath("//a[@rel='q20_1']").click()
driver.find_element_by_xpath("//a[@rel='q20_2']").click()
# 模拟点击提交按钮
driver.find_element_by_xpath("//input[@value='提交']").click()
time.sleep(0.5)
# 模拟点击智能验证按钮
# 先点确认
driver.find_element_by_xpath("//button[text()='确认']").click()
# 再点智能验证提示框,进行智能验证
driver.find_element_by_xpath("//div[@id='captcha']").click()
# 解决滑块拖动
pyautogui.keyDown('Enter')
time.sleep(4)
cnt = 0
while True:
cposition = pyautogui.locateOnScreen('pics/ff5.png')
if cposition: break
time.sleep(0.5)
cnt += 1
if cnt > 6:
try:
print("无需进行滑块验证")
invert_localtor = ("xpath", "//div[@id='ctl01_ContentPlaceHolder1_lbDefault']")
time.sleep(2)
finished = WebDriverWait(driver, 20).until(
EC.presence_of_element_located(invert_localtor)
)
print('————————第%d页已完成————————' % index)
time.sleep(0.5)
driver.quit()
break
except:
print("元素未等到")
print('————————第%d页失败!————————' % index)
break
if cposition:
print("正在进行滑块验证")
cc = pyautogui.center(cposition)
pyautogui.dragRel(256, 0, duration=0.8)
pyautogui.moveTo(cc[0], cc[1])
pyautogui.dragRel(320, 0, duration=3) # duration 也不能太小
try:
print("滑块验证成功")
time.sleep(2)
finished = WebDriverWait(driver, 20).until(
EC.presence_of_element_located('//*[@id=”ctl01_ContentPlaceHolder1_lbDefault”]/div')
)
print('————————第%d页已完成————————' % index)
time.sleep(0.5)
driver.quit()
except:
print("滑块验证成功,但元素未等到")
print('————————第%d页失败!————————' % index)
# (By.CSS_SELECTOR, "#tbAward > tbody > tr:nth-child(2) > td:nth-child(2) > a")
这么一大段代码其实就分为三个部分:
- 爬虫程序自动打开所爬网页;
- 程序将所需要填写的问卷填完;
- 程序将所填完的试卷进行提交。一个具有注脚的文本。[^2]
代码解释
1.定位属性元素。通过属性定位元素,第x题就是qx,第y个选项就是_y,例如Q1的"//a[@rel=‘q1_1’]"中,'q1_1’表示第一题的第一个选项,因此,可以通过定位属性元素,来确定某个选项的选择序号。
2.概率确定。利用if、elif等语句确定每个选项的概率,例如:
# 处理Q5
# 生成随机数,决定点哪个按钮
q5 = random()
if 0 <= q5 <= 0.25:
driver.find_element_by_xpath("//a[@rel='q5_1']").click()
elif 0.25 < q5 <= 0.50:
driver.find_element_by_xpath("//a[@rel='q5_2']").click()
elif 0.50 < q5 <= 0.75:
driver.find_element_by_xpath("//a[@rel='q5_3']").click()
else:
driver.find_element_by_xpath("//a[@rel='q5_4']").click()
这就代表:
随机数q5在0~0.25的时候,选择A选项;
随机数q5在0.25~0.5的时候,选择B选项;
随机数q5在0.5~0.75的时候,选择C选项;
随机数q5在其他时候,选择D选项;
因此,可以通过改变条件语句的判定条件来确定概率。
好了,暂时更这么多…最近导师一直催工作,代码可用,解释有空再续更。
参考博客
- Python爬虫拓展应用——Selenium代刷问卷星问卷
- Python selenium自动化刷问卷+绕过智能验证
- 问卷星全自动填写脚本【详细使用教程】
- Python基础之pyautogui模块(详细总结鼠标键盘操作)
- 问卷星自动填写,智能验证和滑动块
- 问卷星自动填写,智能验证和滑动块
版权声明:本文标题:Python爬虫拓展应用:最新版本问卷星自动刷,包括解决智能验证、滑块等问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727356748a1110192.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论