当前位置: 首页 > 后端技术 > Python

为了学习,又填了几份调查问卷

时间:2023-03-26 16:45:27 Python

为了填WJ星,又拿起了Python。说实话,Python能做到的,Java也能做到,但主要是Java的依赖生态不如Python完备,所以可能需要更多的时间,但不代表Java弱于Python.出于好奇和学习态度,想看看能不能自动填表;首先我想到了JavaScript,因为毕竟是网页,所以首选JS,然后我创建了一个TEST表单进行测试,比较每次请求的路径和参数。首先,在WJ星页打开控制台后,会进入调试模式。我们需要停用断点才能继续操作。Firefox运行会导致页面卡死,悲哀,我太爱了,却让我去Chrome。。。走错路了。。。一开始因为手速比较慢,只能在投票后获取url:https://www.wjx.cn/wjx/join/complete.aspx?activityid=109478233&joinid=108761857258&sojumpindex=1&comsign=135A7EC8CFEF9AFBE716B45BC4422FF56E5CB4F0&s=&njqj=1;你会找到生成依赖的接口或者文件,这样后面生成这两个字段,循环就可以反复刷票了。后来,我发现我太简单了。这个接口根本改变不了投票的结果,也就是不算数!之后,我提高了手速,得到了发送请求的接口地址:https://www.wjx.cn/joinnew/processjq.ashx?一堆参数,如下图,核心参数是jqparam和jqsign。它是如何产生的?参考52上的一篇分析,再过一遍。参考文章:问卷星参数jqparam的分析与探索https://www.52pojie.cn/forum...这里就不赘述了。简而言之,就是用一个插件重定向WJ之星的远程访问接口,然后在本地生成jqparam。我试过了,但没有用。然后手动和自动。折腾了前面发现过不去,来模拟一下点击吧~于是想到了Selenium。现在每个人都在上人工智能课。不管你听不听,至少电脑上应该有一个。Python环境~pipinstallselenium#将selenium下载到本地后,我们已经有了基础,但是要实现模拟点击,还需要下载浏览器驱动,火狐抛弃了我,只好下载Chrome了。附上驱动下载地址:http://chromedriver.storage.g...,选择与你浏览器主要版本相匹配的下载。下载解压后会得到一个chromedriver.exe,复制到你的Python安装目录下。这样默认就可以找到,不需要传递参数。上面准备好之后我们来分析页面,有点类似BeautifulSoup再分析页面。我们发现问卷的主要内容在id="ctl00_ContentPlaceHolder1_JQ1_question"的div框下,于是确定了根节点。然后我们看第一个问题的位置是根目录下第二个div下第一个fieldset下的第一个div;然后我们定位一个问题的选项,它在li的下一层ul中。所以,我们有一个定位路径。selection1='//*[@id="ctl00_ContentPlaceHolder1_JQ1_question"]/div[2]/fieldset[1]/div[1]/div[2]/ul/li'之后,我们通过webdriver.Chrome定位li,我们发现实际上返回的是一个列表[,]我们取出最后一个,然后执行click()操作选中它。answer_1=driver.find_elements_by_xpath(selection1)[-1]answer_1.click()其他选项同理,复选框也一样。最后我们选择提交。以为就在这里?我当时也是这么想的,但是我们提交之后,会有一个人机验证的弹窗,需要我们额外处理一下。同时,我们还需要处理拖动滑块的验证。在实践中检验真相时,我发现了问题所在。做智能验证时,WJstar会识别Selenium!看来人们早就有所预料了。至于如何鉴别呢?如果使用selenium的话,在浏览器控制台会多出一个属性window.navigator.webdriver,这个属性就会变为true,而我们正常访问的时候是undefined。所以我们需要隐藏这个属性。新版Chrome(79以后)需要通过js隐藏,具体代码放在driver=Chrome('./chromedriver')driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":""下面"Object.defineProperty(navigator,'webdriver',{get:()=>undefined})"""})过了,这个表单终于可以提交了,先设置次数?forindexinrange(1,200):完整代码如下:importtimeimportrandomfromseleniumimportwebdriverfromselenium.webdriverimportChromeOptionsoption=ChromeOptions()option.add_experimental_option('excludeSwitches',['enable-automation'])defautoFinishForm():#将问卷星网址放在下方driver.get('群内投票地址)#单选题1selection1='//*[@id="ctl00_ContentPlaceHolder1_JQ1_question"]/div[2]/fieldset[1]/div[1]/div[2]/ul/li'#print("logdriver.find_elements_by_xpath(selection1):",driver.find_elements_by_xpath(selection1));answer_1=driver.find_elements_by_xpath(selection1)[-1]answer_1.click()#单选题2selection2='//*[@id="ctl00_ContentPlaceHolder1_JQ1_question"]/div[2]/fieldset[1]/div[2]/div[2]/ul/li'answer_2=driver.find_elements_by_xpath(selection2)[-1]answer_2.click()#单选题3selection3='//*[@id="ctl00_ContentPlaceHolder1_JQ1_question"]/div[2]/fieldset[1]/div[3]/div[2]/ul/li'answer_3=driver.find_elements_by_xpath(selection3)[-1]answer_3.click()#提交按钮submit=driver.find_elements_by_id('submit_button')[0]submit.click()#提交后验证弹窗alterPath='//*[@id="alert_box"]/div[2]/div[2]/div[2]/button'checkButton=driver.find_elements_by_xpath(alterPath)[0]checkButton.click()#智能验证按钮captchaout='//*[@id="captchaout"]/div[1]'captchaoutBtn=driver.find_elements_by_xpath(captchaout)[0]captchaoutBtn.click()time.sleep(3)#拖动滑块的反向操作:关闭再点击SM_POP_CLOSE_1#closeslipper='//*[@id="submit_div"]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/span'#closeslipperBtn=driver.find_elements_by_xpath(closeslipper)[0]closeslipperBtn=驱动程序.find_elements_by_xpath("//div[@id='SM_POP_CLOSE_1'and@class='sm-pop-close']")[0]closeslipperBtn.click()captchaoutBtn.click()time.sleep(3)driver.quit()if__name__=='__main__':#Loop200timesforindexinrange(1,200):driver=webdriver.Chrome(options=option)driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":"""Object.defineProperty(navigator,'webdriver',{get:()=>undefined})"""})autoFinishForm()专注做一棵大树,看更多好玩的东西