hj170520 发表于 2020-5-4 20:56

书接上文,利用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把需要的几个变量拿出来发送就成功了。我很奇怪。
有大佬帮忙作个解释吗? 以及有需要改进的地方,你们直说,我太需要被你们批评了。

lntuer 发表于 2020-5-4 21:16

一、不是动态参数的,例如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

hj170520 发表于 2020-5-4 21:05




第一个图是抓包返回来的值,第二个是我试了千万遍,发现只需要提交这几个变量就行了。
但是我如果把从getinfo的变量都上传上去,就返回错误。

还希望大佬们解释一下。{:301_1007:}

hj170520 发表于 2020-5-4 21:18

lntuer 发表于 2020-5-4 21:16
一、不是动态参数的,例如data_submit["twfw"] = list_dict["twfw"],你可以写成data_submit["twfw"] =“0 ...

啊哈!动态参数,我第一次遇到这个词!多谢。
第二个就是 我开始是写的后面的那一个,但是报错。所以我试了半天,用前面的那一个居然成功了。我不知道问题出在哪,我的是python3.7

hj170520 发表于 2020-5-4 21:22

lntuer 发表于 2020-5-4 21:16
一、不是动态参数的,例如data_submit["twfw"] = list_dict["twfw"],你可以写成data_submit["twfw"] =“0 ...

饿,我好像错了。
我估计打错代码了{:301_1001:}。刚才又去测试了一下。您说的办法可行。
谢谢

hj170520 发表于 2020-5-5 09:05

想趁人打铁,玩个爬虫。{:301_999:}
先研究大佬们的代码吧

雷晨 发表于 2020-12-10 17:48

大佬这么厉害吗,python都没有学直接从模块入手了

hj170520 发表于 2020-12-11 09:53

雷晨 发表于 2020-12-10 17:48
大佬这么厉害吗,python都没有学直接从模块入手了

????
我只是看着别人怎么写,然后弄懂每行代码的意思。
然后就套公式一样地用,就行了。
页: [1]
查看完整版本: 书接上文,利用requests包来实现疫情期间的“学校签到”