前两天看到空间里面有人发 问卷星 调查,就想到能不能用 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” 代替了,而且 index 和 visible_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. 现在就做到这一步,希望大家多提问题,多多交流!