书接上文,利用requests包来实现疫情期间的“学校签到”
本帖最后由 hj170520 于 2020-5-11 16:28 编辑书接上文,https://www.52pojie.cn/thread-1171440-1-1.html
早上用的selenium包来完成的自动签到,下午看来有些大佬说request做很快。我还要感谢我的一位学JAVA的同学,尽管他也不太懂python,但是他还是在关键的地方帮到我了 。我是做出来了,但我花了一下午{:301_999:}
我是小白,啥也不懂,requests的原理也不懂,逛知乎看了个答案觉得很好 https://www.zhihu.com/question/21471960/answer/100866141
(借用的图)
原理就:上传了几个参数到服务器
一个是 first =true, 一个是kd = android, (关键字) 一个是pn =1 (page number 页码)
构造一个数据包来模拟用户的点击动作。
post_data = {'first':'true','kd':'Android','pn':'1'}
然后使用python中库中最简单的requests库来提交数据。 而这些数据 正是抓包里看到的数据。
import requests
return_data=requests.post("http://www.lagou.com/jobs/posi ... ot%3B,data=post_data)
print return_data.text
返回来的json数据,再对它进行处理
我靠,到这一步我有点懂了,就是我假装是隔壁老王,到隔壁家去做羞羞的事。
所以,我该提交什么数据呢?我看这个熟悉的POST,我好像在哪见过。Fiddle 和 免流见过,{:301_997:}
然后我打开了我的Charles
打开我们上午的网页http://*********/dailyReportAllZ/#/?PersonID=+学号 (学号我就不提供了。我不,能出卖同学)
按顺序看了一下“提交”和“返回”的数据。顺序依次是getMD5, getinfo, submit
然后我发现了规律,需从getMD5到getinfo最后到submit
因为getMD5返回的"data" = "md5"(出现在getinfo)最后getinfo出现在了submit发送框里
所以我开始写代码了。 我直接把代码放出来把
import json
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15'
}
url_MD5 = "*********"
url_info = "*********"
url_submit = '*********'
cardId = input('你的学号:')
my_data = {"cardId": cardId}
res_MD5 = requests.request("post", url_MD5, headers = headers, data = my_data).text #取到了对方发回来的json文件
res_MD_dict = json.loads(res_MD5) #loads:把json转换为dict 便于把数据单独取出来
MD5 = res_MD_dict["data"]
my_data["md5"] = MD5
res_info = requests.request("post", url_info, headers = headers, data = my_data).text
res_info_dict = json.loads(res_info) #loads:把json转换为dict 便于把数据单独取出来
# print(res_info_dict) 检测出json.loads输出的空值为null
list = res_info_dict["data"]["list"] #层层剥开,名字要对准 输出的文件格式是"list"
# print(list) 检测出转化后的null变成了none
list_dict = dict(list) # list输出之后转dict,这一步很关键,费了不少时间
data_submit = {}
data_submit["bh"] = list_dict["bh"]
data_submit["xykh"] = list_dict["xykh"]
data_submit["twfw"] = list_dict["twfw"]
data_submit["sfzx"] = list_dict["sfzx"]
data_submit["sfgl"] = list_dict["sfgl"]
data_submit["szsf"] = list_dict["szsf"]
data_submit["szds"] = list_dict["szds"]
data_submit["szxq"] = list_dict["szxq"]
data_submit["sfcg"] = list_dict["sfcg"]
data_submit["bllb"] = list_dict["bllb"]
data_submit["sfjctr"] = list_dict["sfjctr"]
data_submit["sbr"] = list_dict["sbr"]
data_submit["sjd"] = 0
# for keys in list_dict:
# my_data = list_dict #想做去除none的循环,最后发现不会。。。。。
# for values in my_data.values():
# ifvalues == None:
# values =
res_submit = requests.request("post", url_submit, headers = headers, data = data_submit).text
print(res_submit)
我说实话,我最后把my_data这个dict把所有变量发送出去返回来是失败的,最后从my_data把需要的几个变量拿出来发送就成功了。我很奇怪。
有大佬帮忙作个解释吗? 以及有需要改进的地方,你们直说,我太需要被你们批评了。 一、不是动态参数的,例如data_submit["twfw"] = list_dict["twfw"],你可以写成data_submit["twfw"] =“0”
二、requests.request("post", url_MD5, headers = headers, data = my_data).text,写成这样不香吗?requests.post(url_MD5, headers = headers, data = my_data).text
第一个图是抓包返回来的值,第二个是我试了千万遍,发现只需要提交这几个变量就行了。
但是我如果把从getinfo的变量都上传上去,就返回错误。
还希望大佬们解释一下。{:301_1007:} lntuer 发表于 2020-5-4 21:16
一、不是动态参数的,例如data_submit["twfw"] = list_dict["twfw"],你可以写成data_submit["twfw"] =“0 ...
啊哈!动态参数,我第一次遇到这个词!多谢。
第二个就是 我开始是写的后面的那一个,但是报错。所以我试了半天,用前面的那一个居然成功了。我不知道问题出在哪,我的是python3.7 lntuer 发表于 2020-5-4 21:16
一、不是动态参数的,例如data_submit["twfw"] = list_dict["twfw"],你可以写成data_submit["twfw"] =“0 ...
饿,我好像错了。
我估计打错代码了{:301_1001:}。刚才又去测试了一下。您说的办法可行。
谢谢 想趁人打铁,玩个爬虫。{:301_999:}
先研究大佬们的代码吧 大佬这么厉害吗,python都没有学直接从模块入手了 雷晨 发表于 2020-12-10 17:48
大佬这么厉害吗,python都没有学直接从模块入手了
????
我只是看着别人怎么写,然后弄懂每行代码的意思。
然后就套公式一样地用,就行了。
页:
[1]