python+selenium自动填写提交电子表单_dd data-value-程序员宅基地

技术标签: python  自动填写  selenium  python代码  电子表单  问卷星  

前两天看到空间里面有人发 问卷星 调查,就想到能不能用 python网页交互自动 填写 电子表单 ,结果还真有,就尝试了一下,有些还没搞清楚,先大概介绍一下,慢慢来吧。
1. 首先,安装 selenium ,这个很简单,进入控制台(win+R,输入cmd,回车),输入
pip install selenium

很快就安装完成了。

2. 然后下载相应的 驱动 ,比如我这里使用 chrome浏览器 ,那么我下载chromedriver,下载地址:chromedriver

选择自己的浏览器版本下载就行了(版本号差不多就可以了),查看自己浏览器的方法为: 设置–>帮助–>关于Google Chrome ,如下就是我的版本号:
在这里插入图片描述
(注意,如果想下载比如Microsoft Edge的相关驱动,可以在命令交互界面输入:

import selenium
browser=selenium.webdriver.Edge()

报错的最后一行,会提醒下载网址,copy就可以了,如下所示:
在这里插入图片描述

3. 将驱动解压后,放置在python文件夹内。此处的python文件夹指的是你的python.exe所在的文件夹,如下就是我的放置位置:

在这里插入图片描述

4. 准备工作完成,下面就可以使用了,首先我自己使用问卷网创建了一个问卷,问题都是瞎扯的,如下所示:

在这里插入图片描述
在这里插入图片描述

5. 用Google或者IE查看网页源代码(右击–>查看(网页)源(代码)),IE好像更方便一些,可以直接检查元素(在元素上 右击–>检查元素 ),效果如下:

在这里插入图片描述

6. 操作之前,进行准备工作,输入以下代码:
## 导入模块
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep

## 打开chrome浏览器
driver=webdriver.Chrome()
## 打开网页    
driver.get("https://www.wenjuan.com/s/uQzQBv7/")
sleep(1)
7. 开始操作,回答第一个和第二个问题,是单选框 “radio” ,首先右击需要选中的选项,点击检查元素,找到源代码,如下:在这里插入图片描述

看到class的内容为 “radio_box” ,输入以下内容:

## 通过class_name查找 radio_box 类的元素    
elem_radio=driver.find_elements_by_class_name("radio_box");
##点击第一个选项“没有”,第四个选项“还好”    
elem_radio[0].click()
elem_radio[3].click()
8. 回答第三个问题,是复选框 “check_box” ,同理查看class_name,输入如下代码:
## 通过class_name查找 check_box 类的元素    
elem_check=driver.find_elements_by_class_name("check_box");
##选中第1、2、4选项
elem_check[0].click()
elem_check[1].click()
elem_check[3].click()
9. 这个不可行,直接跳到9*去看可行方案吧

第四个问题本来是要用Select来做的,这里但是似乎这个问卷网的不太行,他的 “value” 采用了 “data-value” 代替了,而且 indexvisible_text 都不可用,因此就没有继续做,以后看一下Select的源码再试试吧。
理论可用代码如下:

## 通过class_name查找元素
elem_wrapper=driver.find_elements_by_class_name("matrix_sel")
## 首先用Select把下拉框转化为Select对象,再通过index选择选项,此处选择的是第一个选项
select=Select(elem_wrapper[0]).select_by_index(1)

注意 :一般的网页都可以用Select这种方式,只不过是问卷网这个比较奇怪,所以这个方法是完全可行的。

9*(可行方案)根据评论区一位老兄的指点,解决了下拉框的选择问题(上面的9可以忽略了)。
## 查找下拉框按钮点击
    elem_wrapper=driver.find_elements_by_class_name("w-selection-wrapper")
    elem_wrapper[0].click()
## 找到所有的选择选项,点击第二个元素“应该不会留”
    option_cell=driver.find_elements_by_class_name("w-selection-option")
    option_cell[2].click()

w-selection-wrapper和w-selection-option大家在源码里都可以找到。
解释一下为啥成功了:使用select的时候,下拉框没有点击,所以下拉框的内容是隐藏的,无法被select读取到,而这里首先打开了下拉框,所以就没问题了。

10. 第五个问题是内容输入,同理右击看元素,使用它的 id ,输入以下代码:
## 通过id查找元素,比class更准确,id也在源码中
textarea=driver.find_element_by_id("5def9d9d92beb5764c5b2ef4")
## send_keys可以发送内容和操作
textarea.send_keys("少下雨,多下雪,晴天出点儿云彩")
11. 第六个问题是打分,同理右击查看元素,使用它的 class_name ,输入以下代码:
## 通过calss_name查找元素
score=driver.find_elements_by_class_name("div_float");
## 打两颗星    
score[1].click()
12. 第七个是填空,和第五个有点儿相似,右击查看元素,使用 id ,输入以下代码:
## 通过id查找元素,输入名字、年龄、号码    
name=driver.find_element_by_id("option_5def9dd23631f2371655e788")
name.send_keys("小明")
age=driver.find_element_by_id("option_5def9dd23631f2371655e789")
age.send_keys("25岁")
link=driver.find_element_by_id("option_5def9dd23631f2371655e78a")
link.send_keys("1008611")
13. 最后提交表单,同理右击元素,检查元素,输入以下代码:
## 通过id查找元素    
submit=driver.find_element_by_id("next_button")
## 点击此元素,提交表单
submit.click();
14. 效果如下所示:

在这里插入图片描述

这里展示的是提交之前的页面。

14. 代码总结如下:
from selenium import webdriver
from time import sleep
##打开chrome浏览器
driver=webdriver.Chrome()
for i in range(1,10):
    print("开始第"+str(i)+"次填写")
## 打开网页    
    driver.get("https://www.wenjuan.com/s/uQzQBv7/")
    sleep(1)
## 通过class_name查找元素    
    elem_radio=driver.find_elements_by_class_name("radio_box");
## 点击第一个选项,第四个选项    
    elem_radio[0].click()
    elem_radio[3].click()
    
## 通过class_name查找元素    
    elem_check=driver.find_elements_by_class_name("check_box");
## 选中第1、2、4选项
    elem_check[0].click()
    elem_check[1].click()
    elem_check[3].click()

## 查找下拉框按钮点击,点击第二个元素“应该不会留”
    elem_wrapper=driver.find_elements_by_class_name("w-selection-wrapper")
    elem_wrapper[0].click()
## 找到所有的选择选项,点击第二个元素“应该不会留”
    option_cell=driver.find_elements_by_class_name("w-selection-option")
    option_cell[2].click()

##通过id查找元素,比class更准确,id也在源码中
    textarea=driver.find_element_by_id("5def9d9d92beb5764c5b2ef4")
##send_keys可以发送内容和操作
    textarea.send_keys("少下雨,多下雪,晴天出点儿云彩")
    
##通过calss_name查找元素
    score=driver.find_elements_by_class_name("div_float");
##打两颗星    
    score[1].click()
##通过id查找元素,输入名字、年龄、号码    
    name=driver.find_element_by_id("option_5def9dd23631f2371655e788")
    name.send_keys("小明")
    age=driver.find_element_by_id("option_5def9dd23631f2371655e789")
    age.send_keys("25岁")
    link=driver.find_element_by_id("option_5def9dd23631f2371655e78a")
    link.send_keys("1008611")
##通过id查找元素    
    submit=driver.find_element_by_id("next_button")
##点击此元素,提交表单
    submit.click();
    print("第"+str(i)+"次填写完成")
    sleep(5)

运行结果:
在这里插入图片描述

15. 现在就做到这一步,希望大家多提问题,多多交流!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_18820125/article/details/103487539

智能推荐

webstorm 2018 LICENSE SERVER 最新激活网址_webstorm2018.2.10激活服务器地址-程序员宅基地

文章浏览阅读1.8k次。亲测可用:https://idea.qmanga.com/ _webstorm2018.2.10激活服务器地址

HTTP接口的服务端和客户端的实现_手动实现一个http客户端与服务端-程序员宅基地

文章浏览阅读1.9w次。Json大量字段案例(300多个key),需要做一个客户中心抽调各个系统的客户信息的功能,在每个系统中需要写客户端代码,在客户中心系统需要写服务端代码。客户端:json串截图如下,注意在json结构中有对象也有数组也就是集合。在java类和json对象的互相转换过程中,如果将json串转换成java类对象,在里层的特殊类型,也就是[]集合的,我们需要进行特殊的处理。1._手动实现一个http客户端与服务端

Volley用法解析三(转载自郭霖郭大神的程序员宅基地)_volley guolin-程序员宅基地

文章浏览阅读1.3k次。转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17612763经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest、JsonRequest、ImageRequest等。其中StringRequest用于请求一条普通的文本数据,JsonRequest(JsonOb_volley guolin

Android studio如何查看android手机目录_studio 查看运行中apk的目录内容-程序员宅基地

文章浏览阅读2.8k次。1、手机打开开发者调试模式;2、安装Android studio;3,安装adb,命令行直接运行adb brew install --cask android-platform-tools;4、安装AndroidFileTransfer;5、在Android studio创建一个空的demo,就能查看手机的目录了;......_studio 查看运行中apk的目录内容

使用log4j配置不同文件输出不同内容_log4j 项目不同目录输出到不同路径-程序员宅基地

文章浏览阅读660次。敲代码中很不注意写日志,虽然明白很重要。今天碰到记录日志,需要根据内容分别输出到不同的文件。参考几篇文章:感觉最详细:http://blog.csdn.net/azheng270/article/details/2173430/喜欢博客园的日志风格,第一篇参考文章就是它:http://www.cnblogs.com/alipayhutu/archive/2012/06/21/25582_log4j 项目不同目录输出到不同路径

今日美食推荐html代码,美食今日推荐.html-程序员宅基地

文章浏览阅读1.9k次。美食今日推荐*{margin: 0;padding: 0;}#main{border: 1px solid deepskyblue;width: 320px;height:450px;margin: 10px auto;border-radius: 20px;}#left{width: 100px;height: 400px;/*border: 1px solid blue;*/float: le..._美食html代码

随便推点

【WSN定位】基于狼群算法结合神经网络的四基站UWB定位方案附matlab代码-程序员宅基地

文章浏览阅读1.3k次,点赞23次,收藏19次。本文提出了一种基于狼群算法(WOA)结合神经网络的四基站超宽带(UWB)定位方案。该方案利用WOA算法优化神经网络的权重和阈值,提高定位精度。实验结果表明,该方案在复杂室内环境中具有较高的定位精度和鲁棒性。引言无线传感器网络(WSN)在各种应用中发挥着重要作用,其中定位是WSN的关键技术之一。超宽带(UWB)技术具有高精度、高带宽、低功耗等优点,是WSN定位的理想选择。传统的UWB定位算法主要基于时差到达(TDOA)或到达角(AOA)测量。

蓝图逻辑笔记3事件调度器——关卡蓝图呼叫蓝图类事件-程序员宅基地

文章浏览阅读387次。关卡蓝图调用蓝图类接着之前的笔记,上次是在蓝图类里面添加呼叫call,在关卡蓝图里面绑定相关事件,这一次我们是在蓝图类里面用调度器绑定自定义事件,在关卡蓝图内调用。1.在蓝图类内新建一个调度器,然后如图所示绑定自定义事件2.打开关卡蓝图,在选中蓝图实例情况下呼叫蓝图类调度器实习蓝图类绑定的事件。..._蓝图逻辑

17.9处理大数据对象(血干JAVA系类)_大数据数据对象-程序员宅基地

文章浏览阅读476次。总结:处理CLOB数据(文本)【例17.16】写入大文本数据(pstmt写入)【例17.17】读取大文本字段(直接ResultSet)【例17.18】使用Clob读取内容(使用Clob)2.17.9.2 处因为现在的内容是保存在文件中,所以使用FilelnputStream类将文本文件读取进来,然后直接通过PreparedStatement对象将其写入到对应的大文本字段中。写入完成后,下面直接使用将其读取进来,因为写入的时候是按照输入流的方式写入的,所以此时也需要按照输入流的方式读取进来._大数据数据对象

现在系统性地学了嵌入式linux方面的东西之后我再回看之前的简历,就感觉没什么意思了。基础。_以后再看怎么回复-程序员宅基地

文章浏览阅读204次。现在系统性地学了嵌入式linux方面的东西之后我再回看之前的简历,就感觉没什么意思了。确实是这种感觉。我现在更想突出基础,而不是怪不得他们要求写专业课分数,绩点等等的,项目细节也写得很详细,而你之前的简历,就是准备复试的简历,则是一味地高大上。总想弄出一些高大上的项目。现在真正系统踏实地学一些东西之后,我就像突出一些基础所以现在可以理解为什么他们写简历要写熟..._以后再看怎么回复

地震信号系列完结篇-反卷积方法_解卷积的地震干涉测量法-程序员宅基地

文章浏览阅读2.8k次。前言本篇将详细地讲解地震信号中用到的反卷积方法。反卷积方法的作用在文章 地震信号的一些基本概念 中已经阐述过,简单的说就是:在压缩原信号的同时,对频谱进行补偿(反卷积的输出信号)。而在地震信号处理中,除了前面的优势,该方法还可以使反射系数成为尖脉冲,从而提高地震记录的分辨率。地震记录:就是由仪器在地表所测的地震数据反射系数:表征的是地球的每一层对地震波的反射特征,相当于一个系统或是滤波器,..._解卷积的地震干涉测量法

如何用控制台访问HBase开源组件?_hbase组件是不是开源的-程序员宅基地

文章浏览阅读184次。今天介绍如何通过控制台来访问HBase产品的一些开源软件界面,比如说原生HBase的一些界面。来到HBase产品控制台。看到已经有一个运行中的HBase了,点击管理。先修改一下产品的网络白名单。将当前的公网访问IP复制到网络访问白名单中来,点击确认。由于之前没有设置过访问密码,这里需要重置软件访问密码。设置完之后,就可以点击HBase的开源链接进行访问了。输入刚才设置的密码..._hbase组件是不是开源的