Python 爬虫问卷星填写
因为一些没必要的问卷作业,需要一批问卷数据。尝试用Python实现问卷星的问卷填写,参考了目前网络上的Python问卷星的填写,貌似很多漏洞已经修复了。12月时,基本上爬虫的方式来批量填写已经不能完成。但是,既然有了问题还是要解决的。
以下是目前网络上流传的方式
1、利用Python + selenium 实现模拟浏览器
参考:
- 成果:可以实现浏览器的正常打开,并能够实现问卷的输入
- 问题:在提交时候会出现智能验证码,貌似问卷星会检测是否为爬虫,尝试过加入header参数,目前无法解决。
2、传统构建 post 请求,通过参数传递的方式进行填写
- 成果:可以实现网页链接的构建,但是请求失败
- 问题:目前问卷星添加了更多的验证参数,导致数据请求失败(22表示请求失败)
这里写一下主要的参数改变,通过抓取问卷星实际的POST请求进行测试,筛查掉一些没有必要的参数外,主要参数包括以下几个:
param = {
"jqpram":"?",
"jqsign":"%3F6%3Fc%3Ed37%2B0%6040%2B23%3Eg%2B%3F223%2Bdd0%3F5025cc52",# 可以根据ktimes 和 jqnonce 生成
"jqnonce":"可以直接问卷链接请求中获取,生成jqsign",#
"starttime":"请求时间,可以直接问卷链接请求中获取",
"curID":"问卷星的编码值,可以直接问卷链接请求中获取",
"submittype":1,# 问卷类型,一般为 1
"rn":3673390564,
"sd":"http%3A%2F%2Fwww.wjx.cn%2F" # 默认值
"ktimes":15 # 完成时间
"rn":"从请求中获取,相较之前发生变化,只保留前半部分"
}
相较之前博主写的,目前post请求已经发了一部分变化,其中最主要的变化在于添加了 jqpram,参数,这个参数我在请求中查找了一段时间,最终放弃了通过手动来生成,原因是,给出的js代码全是密文,应该经过问卷星加密后的,目前暂时没办法读,链接附上,感兴趣的可以尝试一下。
解决方案
既然按照传统的爬虫,行不通,有需要批量的填写,怎么办呢?那直接使用原链接试一试(貌似也不算是正规的爬虫了)。方法如下
- 首先,需要通过浏览器的开发者工具,获取当前需要填写的问卷的post请求链接,(跳转貌似很快,注意使用浏览器的暂停功能,防止链接被刷掉),(点击提交,再点击浏览器的红色按钮,暂停浏览器)
- 得到 URL,填写post请求参数,格式如下
- " 题目编号"+”$"+“题目选项(多选采用 | 分隔)”+“}"
1$4}2$2}3$1|3|4}4$3}5$3}6$1}7$3}8$4}9$3}10$1}11$2}12$1|2|4}13$1|2|3|4}14$1|2|3|4}15$1|2|3|4
- 最后就是愉快的发送请求了,采用最简单post请求方式即可
response = requests.post(url=post_url, data=data, headers=header)
,这样也可以根据需要填写,headers,和 cookie参数,但是好像没有也问题不大,(当然最好还是要有的)- 目前测试过,问卷星貌似不会封 ip,但是会限制一定时间的请求数量,最好请求一次后,sleep 一会再进行请求,一般100张的问卷需要半小时左右。
- 当然,为了提高效率,可以采用多个 种子URL,同时进行请求,貌似也是可以的
大概解决方案就是这样,当然,这不是最好的解决办法,而且,比较机械,本人能力有限,这大概时目前找到的可行的解决办法。