用Python自动填写问卷星

用Python自动填写问卷星

很长时间没有写爬虫相关的文章啦
这次来点干货,妈妈再也不用担心我求同学帮忙填问卷了

缘起

我想被强迫写论文的小伙伴有很多
被强迫用什么问卷调查法的小伙伴也有很多
被问卷折腾的死去活来的小伙伴当然也有很多

求爹爹告奶奶地在各大群请人帮忙填写问卷

一来别人看到这种消息的心情就和看到代购差不多
二来肯定也不会认真填写的啦

不知道你们是不是,
反正每次我填问卷都是看都不看abc
逃~

所以我就想干脆写个小脚本来帮我填问卷好了
于是花了一个多小时搞定了

基本思路

做问卷调查的小伙伴基本上都用过:
问卷星:wjx.cn/

所以这次我就以这个平台为例子

首先是创建一个测试问卷


然后随便点点,点击提交
看看都向服务器发送了什么样的包


哇 so easy,居然只是向一个地址发送了:


  • 问卷id curlD
  • 发送时间 t
  • 开始答题时间 starttime
  • 不知道什么鬼id rn
  • 题目答案 submitdata

那模拟提交问卷的思路也就很清晰了

  1. 请求页面 就解析出什么鬼id(rn)
  2. 计算其他参数,如t、starttime
  3. 找到所有的问题,并随机做答,构造submitdata
  4. 发送请求

具体代码

最主要的就两个部分

找到什么鬼ID rn

def parse_post_url(resp):
    '''
    解析出提交问卷的url
    '''
    # 找到rn
    rn = int(resp.html.search('rndnum="{}"')[0].split('.')[0])
    # 提交问卷的时间
    raw_t = round(time.time(), 3)
    t = int(str(raw_t).replace('.', ''))
    # 模拟开始答题时间
    starttime = datetime.fromtimestamp(
        int(raw_t) - randint(1, 60 * 3)).strftime("%Y/%m/%d %H:%M:%S")

    url = POST_URL_MAP.format(QUESTION_ID, t, starttime, rn)
    return url

找到所有题目

def parse_post_data(resp):
    '''
    解析出问题和选项
    返回post_data
    '''
    post_data = {'submitdata': ""}
    questions = resp.html.find('fieldset', first=True).find('.div_question')

    for i, q in enumerate(questions):
        title = q.find('.div_title_question_all', first=True).text
        choices = [t.text for t in q.find('label')]
        random_index = randint(0, len(choices) - 1)
        choice = choices[random_index]
        post_data['submitdata'] += '{}${}}}'.format(i+1, random_index+1)
        print(QUESTION_INFO.format(title, choices, choice))
        time.sleep(0.5)
    # 去除最后一个不合法的`}`
    post_data['submitdata'] = post_data['submitdata'][:-1]
    return post_data

来看看效果吧

执行时


问卷星后台


关注公众号「findyourownway

回复:『问卷星』
获取全部代码哦~

发布于 2018-04-28

文章被以下专栏收录