[TOC]
原bug
MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=9659): Max retries exceeded with url: /session/14150baedf86c6930897efe3675806f3/element (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000204D3E95B70>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
已解决:解决办法把打开浏览器执行自动填写后关闭改为打开标签页执行自动填写并关闭(先打开一个主标签页,然后打开副标签页进行问卷自动填写)
代码暂时只有单选和填空功能,期中填空为默认文本:没有### 配置环境:
slenium库,调用的对应浏览器驱动,此处为Chrome
解压后放在python目录下
浏览器驱动下载链接
http://chromedriver.storage.googleapis.com/index.html
[使用python实现问卷星自动答题功能——基础篇]
(对标签解析)
random库实现随机选择
定位题目对应标签
from selenium import webdriver
import random
打开问卷星
driver = webdriver.Chrome()
driver.get('https://www.wjx.cn/jq/22452252.aspx')
利用CSS选择器对页面进行解析
我们发现,我们所有的题目的回答的选项的标签都在li标签里面,所以我们找到li标签。ans=answer.find_elements_by_css_selector(‘li’)
####先滑到标签再去点击
driver.execute_script("arguments[0].scrollIntoView();",answer)
### 找到标签
ans=answer.find_elements_by_css_selector('li')
lsans=random.choice(ans)
lsans.click()
填空题:标签为textarea
`if not ans:
text=answer.find_element_by_css_selector('textarea')
text.send_keys('没有')
continue`
提交问卷选项
am=driver.find_element_by_css_selector('#submit_button')
am.click()
但是我们要想实现快速的填写,我们还得进行浏览器的关闭(因为浏览器开一次只能填一次,所以可以让它自动关闭),然后我们在使用一个循环,进行不断的开关浏览器,即可实现不停的填写问卷
driver.quit()
进一步:利用try catch跳过无法作答的题避免死循环
首先我们获得了answer之后,我们得避免一些问题导致我们的代码出现红字,于是我们使用try来避免报错(这个原因是,有些题目我们不能作答,但是使用死的代码会发生卡死的现象。)举个简单的例子,当我们遇到一个分叉的时候,比如有的题目,你选了否就会答第五题,选了是就会答第六题,这样子虽然我们会获取到五和六的题目的div,但是却不能两者都答,如果不使用try的话,会导致代码报错不能运行,我们使用try这样子就可以保持即使这题答不了,也只会把异常抛出,然后我们依然会往后做(这样子就从另一个角度来解决了分叉的问题)。
进一步:模拟滑动浏览器
因为问卷星肯定不是只有几题的,肯定是有很多道题的,所以我们要滑动浏览器(因为我们使用的点击只是模仿人的操作,人肯定是不能到自己看不到的地方答题的)使用driver.execute_script(“arguments[0].scrollIntoView();”,answer)来进行浏览器的滑动
思路一完整代码
from selenium import webdriver
import random
driver = webdriver.Chrome()
driver.get('https://www.wjx.cn/jq/22452252.aspx')
answers = driver.find_elements_by_css_selector('.div_question')
for i in range(5):
for answer in answers:
try:
####先滑到标签再去点击
driver.execute_script("arguments[0].scrollIntoView();",answer)
### 找到标签
ans=answer.find_elements_by_css_selector('li')
if not ans:
text=answer.find_element_by_css_selector('textarea')
text.send_keys('没有')
continue
lsans=random.choice(ans)
lsans.click()
except Exception as e:
print(e)
am=driver.find_element_by_css_selector('#submit_button')
am.click()
driver.quit()
运行结果报错
第一次成功打开Chrome浏览器填写并退出,后台有提交记录
填写了单选和,后四次未执行成功
报错
MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=9659): Max retries exceeded with url: /session/14150baedf86c6930897efe3675806f3/element (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000204D3E95B70>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
# -*- coding: utf-8 -*-
## kof21411大佬解决bug后的代码
"""
Created on Sun Jul 19 15:39:40 2020
@author: Lenovo
"""
from selenium import webdriver
import random
driver = webdriver.Chrome()
# driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.baidu.com')
for i in range(5):
js = "window.open('https://www.wjx.cn/jq/85695920.aspx')"
driver.execute_script(js)
# driver.get('https://www.wjx.cn/jq/22452252.aspx')
handlers =driver.window_handles
driver.switch_to_window(handlers[1])
answers = driver.find_elements_by_css_selector('.div_question')
for answer in answers:
try:
####先滑到标签再去点击
driver.execute_script("arguments[0].scrollIntoView();",answer)
### 找到标签
ans=answer.find_elements_by_css_selector('li')
if not ans:
text=answer.find_element_by_css_selector('textarea')
text.send_keys('没有')
continue
lsans=random.choice(ans)
lsans.click()
except Exception as e:
print(e)
# am=driver.find_element_by_css_selector('#submit_button')
# am.click()
driver.close()
driver.switch_to_window(handlers[0])
driver.quit()