前两天看到空间里面有人发 问卷星 调查,就想到能不能用 python 和 网页交互 , 自动 填写 电子表单 ,结果还真有,就尝试了一下,有些还没搞清楚,先大概介绍一下,慢慢来吧。

1. 首先,安装 selenium ,这个很简单,进入控制台(win+R,输入cmd,回车),输入

pip install selenium

很快就安装完成了。

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

选择自己的浏览器版本下载就行了(版本号差不多就可以了),查看自己浏览器的方法为: 设置–>帮助–>关于Google Chrome ,如下就是我的版本号:

Python自动填写网页密码 python 网页自动填写提交_Python自动填写网页密码


(注意,如果想下载比如Microsoft Edge的相关驱动,可以在命令交互界面输入:

import selenium
browser=selenium.webdriver.Edge()

报错的最后一行,会提醒下载网址,copy就可以了,如下所示:

Python自动填写网页密码 python 网页自动填写提交_selenium_02



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

Python自动填写网页密码 python 网页自动填写提交_自动填写_03

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

Python自动填写网页密码 python 网页自动填写提交_python_04


Python自动填写网页密码 python 网页自动填写提交_自动填写_05

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

Python自动填写网页密码 python 网页自动填写提交_Python自动填写网页密码_06

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” ,首先右击需要选中的选项,点击检查元素,找到源代码,如下:

Python自动填写网页密码 python 网页自动填写提交_电子表单_07

看到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. 效果如下所示:

Python自动填写网页密码 python 网页自动填写提交_Python自动填写网页密码_08

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

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)

运行结果:

Python自动填写网页密码 python 网页自动填写提交_selenium_09

15. 现在就做到这一步,希望大家多提问题,多多交流!