我给女朋友发了20000句情话,她暂时不想听情话了!(详见:女朋友抱怨不会说情话,用python给她发了20000句!让她见识见识情话大全!https://www.52pojie.cn/thread-1113388-1-1.html(出处: 吾爱破解论坛))
女朋友最近不找我下五子棋了!(详见:女朋友下棋比我厉害,还特别嚣张,不能忍。拿python敲个辅助,看她如何嚣张!https://www.52pojie.cn/thread-1116867-1-1.html(出处: 吾爱破解论坛))
不过也没怼我,上次的表情包好像白存了,不过还是留着吧,万一派上用场了呢?(详见:为了防止女朋友怼我,我就先用python爬了3600个怼人表情包等她来战!https://www.52pojie.cn/thread-1118801-1-1.html(出处: 吾爱破解论坛))
也不知道你们找到女朋友了没有,找到的话,一起来交流研究!(详见:别再酸了,女朋友是不可能发,但是可以用python帮你创造机会搞到一个!搞到来告诉我!https://www.52pojie.cn/thread-1119202-1-1.html(出处: 吾爱破解论坛))
女朋友存了好多网上的男明星的照片,我准备用python全部换成我的脸!https://www.52pojie.cn/thread-1120431-1-1.html(出处: 吾爱破解论坛)
为了知道女朋友的小秘密,我用python爬了榜姐微博下60000个女生小秘密!https://www.52pojie.cn/thread-1123043-1-1.html(出处: 吾爱破解论坛)
女朋友每晚都给我发诱惑图,我用python搞了更多诱惑图反击她!https://www.52pojie.cn/thread-1128807-1-1.html(出处: 吾爱破解论坛)
女朋友要和我拼手速,不得不用python让她见识我的手速!年轻人,不要试图和你不知…https://www.52pojie.cn/thread-1139015-1-1.html(出处: 吾爱破解论坛)
为了看看女朋友生日那天是什么样子,我用python爬了一年的照片!https://www.52pojie.cn/thread-1144764-1-1.html(出处: 吾爱破解论坛)
女朋友说A罩杯最流行,我用python爬了几十万的购买数据来证明她是在狡辩!https://www.52pojie.cn/thread-1145712-1-1.html(出处: 吾爱破解论坛)
女朋友说因为异性相吸,所以容易产生真爱!我觉得得用python验证一下!https://www.52pojie.cn/thread-1151862-1-1.html(出处: 吾爱破解论坛)
周扬青和罗志祥分手,女朋友说要去周扬青吧看看有没有经验贴,我只好用python快速…https://www.52pojie.cn/thread-1163712-1-1.html(出处: 吾爱破解论坛)
女朋友比较喜欢民宿风格,我就用python爬了一个短租民宿网站,做个合格的男朋友!https://www.52pojie.cn/thread-1171476-1-1.html(出处: 吾爱破解论坛)
为了提高女朋友的计算速度,我用python帮她做了一个出题器,提升一下她的智力水平!https://www.52pojie.cn/thread-1187174-1-1.html(出处: 吾爱破解论坛)
不要998,不要668,不要188,只要10行代码!手把手带你给女朋友写本《吃不胖经》!https://www.52pojie.cn/thread-1235152-1-1.html(出处: 吾爱破解论坛)

前段时间,女朋友接到任务要做个问卷收集,每个人要收集至少3000份,每个人的链接都不一样,最后还要在后台考核!
在各个群中发红包,求爷爷,告奶奶的求人来填写问卷,结果收效甚微!!!
一起吃个饭心不在焉的,看个电影心不在焉的,反正就是各种心不在焉……
实在是影响心情,只好打开电脑帮她敲些代码来完成任务!

由于她的问卷收集完毕了,所以就在论坛里找了一个帖子中的问卷链接来展示一下代码。
帖子:提高问卷调查数https://www.52pojie.cn/thread-1251847-1-1.html(出处: 吾爱破解论坛)

主要是通过selenium和python来实现自动填写和提交。

问卷链接:https://www.wjx.cn/jq/88736026.aspx
问卷链接可以改为:https://www.wjx.cn/m/88736026.aspx 操作起来更简单些,代码用的是这个

打开问卷发现,主要题型是单选、多选、表格单选、填空题,可以通过xpath进行定位选项,然后使用click来进行点击。
   
用Ctrl+shift+打开浏览器控制台,然后根据选项位置找到对应的标签位置,利用.find_element_by_xpath()和.find_element_by_id()进行定位。
填写完成后,用.find_element_by_id()找到提交按钮的id来定位提交。
先进行基本的定位测试,然后再考虑随机填写。
固定选项填写代码如下:

[Python] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# -*- coding:utf-8 -*-
from selenium import webdriver
import random
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
import time    #导入时间库
need = 2000    #设置需求数量
num = 1   #当前初始数值为1
while num < int(need):    #当数值num小于需求数量就会一直运行
    try:    #防止出错后停止运作,用try来实现持续运行
        '''----------- 该部分代码为打开浏览器界面运行 适合调试时使用 -----------'''
        '''----------- 需要无界面运行时,将该部分代码注释掉,然后取消无界面运行部分的代码注释 -----------'''
        chromedriver = 'chromedriver.exe'    #浏览器内核文件位置
        chome_options = webdriver.ChromeOptions()
        wd = webdriver.Chrome(chromedriver, chrome_options=chome_options)
        wd.delete_all_cookies()  # 删除cookies
        wd.maximize_window()  # 将浏览器最大化
        wd.implicitly_wait(120)   #最大等待120秒以防网速问题导致页面无法加载
        '''-----------------以上代码不需要改动 - ---------------'''
        
        
        
        '''---------------- 可以使用该部分代码实现无界面运行 ---------------'''
        # opt = Options()
        # opt.add_argument('--no-sandbox')  # 解决DevToolsActivePort文件不存在的报错
        # opt.add_argument('window-size=1920x3000')  # 设置浏览器分辨率
        # opt.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
        # opt.add_argument('--hide-scrollbars')  # 隐藏滚动条,应对一些特殊页面
        # opt.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片,提升运行速度
        # opt.add_argument('--headless')  # 浏览器不提供可视化界面。Linux下如果系统不支持可视化不加这条会启动失败
        #
        # wd = Chrome(options=opt)    # 创建无界面对象
        '''-----------------以上代码不需要改动 - ---------------'''
        """------------------以上代码不需要改动----------------"""
        wd.get("https://www.wjx.cn/m/88736026.aspx")  # 调用WebDriver 对象的get方法 让浏览器打开网址
        element = wd.find_element_by_xpath('//*[@for="q1_1"]')    #利用xpath找到第一问题选项中的一个选项的位置
        element.click()    #点击
        element = wd.find_element_by_id('q2')   #利用by_id()和元素id进行定位
        element.send_keys('2000')  #输入文字
        element = wd.find_element_by_xpath('//*[@for="q3_1"]')   #同上,不再赘述
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q4_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q5_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q6_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q7_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q8_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q9_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q10_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv11_1"]/td[4]/a')   #利用xpath找到问题选项中的一个选项的位置,注意表格单选与普通单选的xpath不同
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv11_2"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv11_3"]/td[4]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv11_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv11_5"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv11_6"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv11_7"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv12_1"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv12_2"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv12_3"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv12_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv12_5"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv12_6"]/td[4]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q13_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q14_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv15_1"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv15_2"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv15_3"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv15_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv15_5"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv15_6"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_1"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_2"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_3"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_5"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_6"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_7"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv16_8"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_1"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_2"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_3"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_5"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_6"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_7"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_8"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_9"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv17_10"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_1"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_2"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_3"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_5"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_6"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_7"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_8"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_9"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv18_10"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q19_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv20_1"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv20_2"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv20_3"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv20_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv20_5"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv20_6"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv20_7"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@for="q21_1"]')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_1"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_2"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_3"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_4"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_5"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_6"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_7"]/td[2]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_8"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_9"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_10"]/td[3]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_11"]/td[5]/a')
        element.click()
        element = wd.find_element_by_xpath('//*[@id="drv22_12"]/td[4]/a')
        element.click()
        element = wd.find_element_by_id('q23')
        element.send_keys('吾爱破解论坛——创造太阳测试')
        print('全部填写完成!')    #填写完成
        time.sleep(random.randint(35))   #等待一个随机时间,后台会根据少于某个时间的问卷判定为无效问卷,3秒钟填完二十几道题目肯定不是人干的
        element = wd.find_element_by_id('ctlNext')  #找到提交按钮
        element.click()  #点击
        print('第'+ str(num) + '次提交成功!')   #记录提交的次数
        
        wd.quit()   #退出浏览器
        num += 1  #数值+1
    except:   #遇到问题,直接退出浏览器
        wd.quit()

这样的固定填写肯定是不行的,下一步就进行随机填写。主要是对xpath部分进行随机生成,然后进行选择填写。
观察问卷可以发现,选项为两项的有1,5,6,13题,三项的有8.19.21题,四项的有7,9题……九项的有10题,填空题是2,23题,表格单选中,问题有六个的是12,15题,七个的是11,20题……,十二个的是22题。
因此可以利用random.randint()函数来生成所需要的的随机数,使得xpath信息可以得到随机。
代码如下:

[Python] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# -*- coding:utf-8 -*-
from selenium import webdriver
import random
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
import time    #导入时间库
def tx():       #定义一个填写函数tx()
    for in range(1,24):    #循环生成数字1-23
        if == 1 or == 5 or == 6 or == 13:   #当i == 1,5,6,13时
            = random.randint(12)  #随机生成1-2之间的整数,也就是两项选一
            wjnum = '//*[@for="q'+str(i)+'_' + str(n) +'"]'    #拼接xpath
            element = wd.find_element_by_xpath(wjnum)   #用xpath来查找元素位置
            element.click()   #点击
        if == 8 or == 19 or == 21:
            = random.randint(13)   #随机生成1-3之间的整数,也就是三项选一
            wjnum = '//*[@for="q' + str(i) + '_' + str(n) + '"]'
            element = wd.find_element_by_xpath(wjnum)
            element.click()
        if == 7 or == 9:
            = random.randint(14)
            wjnum = '//*[@for="q' + str(i) + '_' + str(n) + '"]'
            element = wd.find_element_by_xpath(wjnum)
            element.click()
        if == 3 or == 14:
            = random.randint(15)
            wjnum = '//*[@for="q' + str(i) + '_' + str(n) + '"]'
            element = wd.find_element_by_xpath(wjnum)
            element.click()
        if == 4:
            = random.randint(16)
            wjnum = '//*[@for="q' + str(i) + '_' + str(n) + '"]'
            element = wd.find_element_by_xpath(wjnum)
            element.click()
        if == 10:
            = random.randint(19)
            wjnum = '//*[@for="q' + str(i) + '_' + str(n) + '"]'
            element = wd.find_element_by_xpath(wjnum)
            element.click()
        if == 2:
            element = wd.find_element_by_id('q2')
            = random.randint(1998,2002)
            element.send_keys(str(n))
        if == 23:
            element = wd.find_element_by_id('q23')
            element.send_keys("吾爱破解论坛——创造太阳")
        if == 12 or == 15:    #表格类单选题目
            for in range(1,7):    #先依次生成1-6,即有6道题目,每道题目都需要填写
                = random.randint(1,6)   #随机生成选项,六选一
                # element = wd.find_element_by_xpath('//*[@id="drv11_6"]/td[3]/a')   #查看xpath信息
                wjnum = '//*[@id="drv' + str(i) + '_' + str(m) + '\"]/td[' +str(n) +']/a'   #拼接xpath信息
                element = wd.find_element_by_xpath(wjnum)
                element.click()
        if == 11 or == 20:
            for in range(1,8):
                = random.randint(1,6)
                wjnum = '//*[@id="drv' + str(i) + '_' + str(m) + '\"]/td[' +str(n) +']/a'
                element = wd.find_element_by_xpath(wjnum)
                element.click()
        if == 16 :
            for in range(1,9):
                = random.randint(1,6)
                wjnum = '//*[@id="drv' + str(i) + '_' + str(m) + '\"]/td[' +str(n) +']/a'
                element = wd.find_element_by_xpath(wjnum)
                element.click()
        if == 17 or ==18 :
            for in range(1,11):
                = random.randint(1,6)
                wjnum = '//*[@id="drv' + str(i) + '_' + str(m) + '\"]/td[' +str(n) +']/a'
                element = wd.find_element_by_xpath(wjnum)
                element.click()
        if == 22:
            for in range(1,13):
                = random.randint(1,6)
                wjnum = '//*[@id="drv' + str(i) + '_' + str(m) + '\"]/td[' +str(n) +']/a'
                element = wd.find_element_by_xpath(wjnum)
                element.click()
need = 2000    #设置需求数量
num = 1   #当前初始数值为1
while num < int(need):    #当数值num小于需求数量就会一直运行
    try:    #防止出错后停止运作,用try来实现持续运行
        '''----------- 该部分代码为打开浏览器界面运行 适合调试时使用 -----------'''
        '''----------- 需要无界面运行时,将该部分代码注释掉,然后取消无界面运行部分的代码注释 -----------'''
        chromedriver = 'chromedriver.exe'    #浏览器内核文件位置
        chome_options = webdriver.ChromeOptions()
        wd = webdriver.Chrome(chromedriver, chrome_options=chome_options)
        wd.delete_all_cookies()  # 删除cookies
        wd.maximize_window()  # 将浏览器最大化
        wd.implicitly_wait(120)   #最大等待120秒以防网速问题导致页面无法加载
        '''-----------------以上代码不需要改动 - ---------------'''
        '''---------------- 可以使用该部分代码实现无界面运行 ---------------'''
        # opt = Options()
        # opt.add_argument('--no-sandbox')  # 解决DevToolsActivePort文件不存在的报错
        # opt.add_argument('window-size=1920x3000')  # 设置浏览器分辨率
        # opt.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
        # opt.add_argument('--hide-scrollbars')  # 隐藏滚动条,应对一些特殊页面
        # opt.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片,提升运行速度
        # opt.add_argument('--headless')  # 浏览器不提供可视化界面。Linux下如果系统不支持可视化不加这条会启动失败
        #
        # wd = Chrome(options=opt)    # 创建无界面对象
        '''-----------------以上代码不需要改动 - ---------------'''
        """------------------以上代码不需要改动----------------"""
        wd.get("https://www.wjx.cn/m/88736026.aspx")  # 调用WebDriver 对象的get方法 让浏览器打开网址
        tx()  #填写函数tx()
        print('全部填写完成!')    #填写完成
        time.sleep(random.randint(35))   #等待一个随机时间,后台会根据少于某个时间的问卷判定为无效问卷,3秒钟填完二十几道题目肯定不是人干的
        element = wd.find_element_by_id('ctlNext')  #找到提交按钮
        element.click()  #点击
        print('第'+ str(num) + '次提交成功!')   #记录提交的次数
        wd.quit()   #退出浏览器
        num += 1  #数值+1
    except:   #遇到问题,直接退出浏览器
        wd.quit()

轻松完成大量问卷的随机填写!

微信图片_20200823111849.png (111.94 KB, 下载次数: 28)

微信图片_20200823111849.png

免费评分