问卷调查是一种发掘事实现况的研究方式,最大的目的是搜集,累积某一目标族群的各项科学教育属性的基本资料,可分为描述性研究及分析性研究两大类。在决定是否采用问卷法作为研究工具,应考量是否能顺利达成研究目标以及注意研究样本在问卷上的配合度。
对于当代大学生来说,马原思修行策这些课的实践活动离不开问卷调查,可是各种转发过后却只有寥寥数人填写的痛谁又懂呢?
?用selenium工具模拟点击填写问卷很简单,可是现在大部分公司都有反爬技术,当你模拟点击提交按钮后会弹出来一个智能验证,这个时候后台判断你是Python控制浏览器进行操作的,无论你手动点击还是自动点击都会提示验证失败。
?
?
检测基本原理是检测当前浏览器窗口下的window.navigator对象是否包含webdriver这个属性?,正常情况下这个值是undefined,当我们使用了selenium,这个属性就会被赋值,网站通过js判断这个属性不正常,直接pass了我们的操作。
用第三方库pyppeteer可以解决一部分反爬技术?,本文不用这种方法,大家可以自行百度
我们可以通过在页面进入之前执行js代码,将webdriver属性置空,从而躲过网站的检测
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("https://www.wjx.cn/m/47846766.aspx")
接下来就是随机填写选择题和填空题,selenium的八种定位方法?很简单,可以根据自己的喜好选择,通过random随机选择答案,填空题可以从我们事先设定好的列表中获取
for i in range(1,11):
n=random.randint(1,3)
n1=random.randint(1,2)
time.sleep(0.3)
try:
element=driver.find_element_by_css_selector("#div{} > div.ui-controlgroup > div:nth-child({})".format(i,n))
element.click()
except:
try:
element = driver.find_element_by_css_selector("#div{} > div.ui-controlgroup > div:nth-child({})".format(i, n1))
element.click()
except:
pass
input = driver.find_element_by_id("q11")
input.send_keys(word)
?提交过于频繁的话还是会触发验证,不过这时候系统已经把我们当成了一个真人,只需要一次点击智能验证的按钮即可通过验证,完成问卷
time.sleep(1)
try:
element = driver.find_element_by_css_selector("#alert_box > div:nth-child(2) > div:nth-child(2) > button")
element.click()
time.sleep(0.5)
yanz = driver.find_element_by_id("rectMask")
yanz.click()
time.sleep(4)
except:
pass
driver.close()
可以看到问卷的随机效果还是很不错的?
?
?
?
附上完整代码
import time
from selenium import webdriver
import random
j=1
word='填空题'
while(j<51):
# chrome_options = webdriver.ChromeOptions()
# chrome_options.add_argument('--headless')
# driver = webdriver.Chrome(options=chrome_options)
# driver = webdriver.Chrome()
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("https://www.wjx.cn/m/47846766.aspx")
time.sleep(2)
for i in range(1,11):
n=random.randint(1,3)
n1=random.randint(1,2)
time.sleep(0.3)
try:
element=driver.find_element_by_css_selector("#div{} > div.ui-controlgroup > div:nth-child({})".format(i,n))
element.click()
except:
try:
element = driver.find_element_by_css_selector("#div{} > div.ui-controlgroup > div:nth-child({})".format(i, n1))
element.click()
except:
pass
input = driver.find_element_by_id("q11")
input.send_keys(word)
time.sleep(0.5)
tijiao=driver.find_element_by_id("ctlNext")
tijiao.click()
time.sleep(1)
try:
element = driver.find_element_by_css_selector("#alert_box > div:nth-child(2) > div:nth-child(2) > button")
element.click()
time.sleep(0.5)
yanz = driver.find_element_by_id("rectMask")
yanz.click()
time.sleep(4)
except:
pass
driver.close()
print("已经提交{}次".format(j))
j=j+1
?
?
?
?
?
?
|