一个活动非得让我拉几百人个人填表单,无奈。

找了一半天脚本找不到,想通过油猴来完成这个浏览器操作。但是却发现表单限制,记录浏览器记录,只能填一次:-)

于是决定通过python的Selenium库来实现浏览器操作,同时模拟出500个用户信息。

环境搭建

环境已配置好请忽略

关于Selenium库的安装及环境配置请参照Python Selenium库的使用文章

需要注意一下几点坑了我好久:

  1. 下载Selenium驱动程序时请在:这里下载与你Chromium内核版本一致的驱动程序。

  2. 下载的驱动程序包需要放置在你的浏览器exe文件同一目录

  3. 配置环境变量时名称应填chromedriver,值应填写到该目录下。

    • 也可python中指定chromedriver路径,只有当py中没有指定路径时才会去环境变量中去搜Chromium的路径。

测试配置


在配置完成后python执行:
1
2
3
from selenium import webdriver
driver = webdriver.Chrome("")# 指定chromedriver路径,例如我的"D:\Desktop\web\chromedriver.exe"
driver.get("https://nrhs-space.github.io/") # 地址栏里输入网址

不出意外的话会打开一个新窗口,打开我的博客页面。

测试操作


1
2
3
4
5
from selenium import webdriver
driver = webdriver.Chrome("")# 指定chromedriver路径,例如我的"D:\Desktop\web\chromedriver.exe"
driver.get("https://www.baidu.com") # 地址栏里输入网址
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("三体") # 搜索框输入三体
driver.find_element_by_xpath('//*[@id="su"]').click() # 点击百度一下按钮

不出意外的话会打开一个新浏览器窗口,并且打开百度搜索”三体”。

到这里一切正常就代表成功搭建了环境。

执行操作

打开页面,使用开发者工具定位到选项标签。复制Xpath下来。

selenium有多种定位的方法,详情见CDSDN博客

一般我们使用的就是find_element_by_xpath或者find_element_by_name,find_element_by_id

即通过路径表达式,name和id

在这里我们使用xpath找到标签,进行点击操作

1
2
3
4
5
6
import time
from selenium import webdriver
Brower = webdriver.Chrome("D:\Desktop\web\chromedriver.exe")
Brower.get('url...')
time.sleep(3) # 延时
Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[4]/div/div/div[2]/div[1]/div/span/div/div[1]/div/div/label').click()

运行代码,不出意外的话就会自动点击了

不出意外的话就会出意外

有时候你会发现get出了页面,但没有点击操作。这个时候或许可以:

  1. 检查xpath是否正确,可以尝试定位到该元素的父标签上
  2. chromedriver驱动程序版本是否与你内核版本一致。
  3. 尝试x+1次

有5道题目,我们对其进行5次点击操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from selenium import webdriver

import time

Brower = webdriver.Chrome("D:\Desktop\web\chromedriver.exe")

Brower.get('...')

time.sleep(3)

Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[4]/div/div/div[2]/div[1]/div/span/div/div[1]/div/div/label').click()

Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[6]/div/div/div[2]/div[1]/div/span/div/div[2]/div/div/label').click()

Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[8]/div/div/div[2]/div[1]/div/span/div/div[3]/div/div/label').click()

Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[10]/div/div/div[2]/div[1]/div/span/div/div[1]/div/div/label').click()

Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[12]/div/div/div[2]/div[1]/div/span/div/div[1]/div/div/label').click()

可以看见其中的[]内容控制了选项与题目。不出意外的话你的5道题目应该已经选好了。

使用name定位点击下一页

1
Brower.find_element_by_class_name('published-form__footer').click()

填充文本

input中需要我们填写姓名,学校,电话等内容

这里使用name获取到inputsend_keys填充内容

1
Brower.find_element_by_name('field_16').send_keys("霍格沃茨")

然后我们用点击下一页的方法点击提交即可

关闭浏览器

1
Brower.close()

最后贴一下我简单的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import time
from selenium import webdriver
import requests
import re
import random

# post提交,生成500个姓名
data = {
'xing': '',
'xinglength': '1',
'minglength': 'all',
'sex': 'all',
'dic': 'gudai',
'num': '500',
}
xm = requests.post("https://www.qmsjmfb.com/", data)
data2 = re.findall(r'<li>(.+?)</li>', xm.text)

# 随机数生成500个电话号码
list_1 = ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178",
"182", "183", "184", "187", "188", "198"] # 中国移动号码段
list_2 = ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"] # 中国联通号码段
list_3 = ["133", "149", "153", "173", "177", "180", "181", "189", "191", "199", "193"] # 中国电信号码段
num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] # 存放0-9数字,号码的4-11位从这里取

phone_all = list() # 存放所有生成的电话号码

phone_output = list() # 存放去重后的电话号码

def create_phone(count, choice): # 参数1为生成号码的个数,参数2为运营商选择
for t in range(count):
phone = random.choice(choice) + "".join(random.choice(num) for i in range(8)) #使用random函数生成电话号码
if phone not in phone_all: # 判断该电话号码是不是出现过
phone_output.append(phone) # 没出现则放到phone_output
phone_all.append(phone) # 把生成的每个号码都存起来,用去去重比对
print(phone_output) # 打印去重后的电话

create_phone(500, list_3) #调用函数

# 读取学校名单txt文件
with open('002.txt', 'r', encoding="utf-8") as f:
xx=f.readlines()

# 循环提交
for i in range(500):
Brower = webdriver.Chrome("D:\Desktop\web\chromedriver.exe")
Brower.get('url...')
time.sleep(3) # 延时操作
Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[4]/div/div/div[2]/div[1]/div/span/div/div['+str(random.randint(1,3))+']/div/div/label').click() # 随机选择一个选项
Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[6]/div/div/div[2]/div[1]/div/span/div/div['+str(random.randint(1,3))+']/div/div/label').click()
Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[8]/div/div/div[2]/div[1]/div/span/div/div['+str(random.randint(1,3))+']/div/div/label').click()
Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[10]/div/div/div[2]/div[1]/div/span/div/div['+str(random.randint(1,3))+']/div/div/label').click()
Brower.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/div/div[12]/div/div/div[2]/div[1]/div/span/div/div['+str(random.randint(1,3))+']/div/div/label').click()
time.sleep(random.randint(3,6)) # 随机延时几秒
Brower.find_element_by_class_name('published-form__footer').click()
#------------------------------
time.sleep(random.randint(6,10))# 随机延时几秒
Brower.find_element_by_name('field_15').send_keys(data2[200+i])#xm
Brower.find_element_by_name('field_16').send_keys(xx[i])#xx
Brower.find_element_by_name('field_17').send_keys(phone_output[i])#dh
Brower.find_element_by_class_name('published-form__submit').click()
Brower.close() # 关闭浏览器
print("已完成:", i, "次")

此为学习自动化操作笔记,完成一些不重要的指标要求。谴责恶意刷题行为!