python语言好还是c语言好,新手学python还是c语言
其实我之前写过一个帖子。
之前在使用教务系统的过程中,无意中发现登录教务系统后再退出的登录网址是不需要验证码的。我以为之前有写了教务系统模拟登录的爬虫,不需要验证码就能轻松搞定(之前折腾了很久hhh,selenium的性能还是用selenium的成绩爬出来的,和直接爬相比,selenium的性能终究还是不如Selenium原来用于自动化的hhh),然后今天闲着没事就重写了一个一样的。
写一个简单的想法:百度直接搜索的教务系统网站,需要验证码。登录后,注销后无需验证码即可获得登录网站。
点开它,我们可以发现需要验证码。
登录,然后注销,如下面的箭头所示:
退出后,你是不是神奇的发现验证码不见了(见下图)?哈哈哈,这就是我们想要的。
看了半天我们的形式化分析,发现根本看不懂,以为反正这个文件里的函数都被调用了,不如自己改代码调用encodeInp()函数,看能不能调用成功,输出和调试工具里的编码一样。如果是一样的,我们的目的就达到了。加密过程是调用submitForm1()中的encodeInp()函数,与cookie无关。
我在这里用了我的账号密码,结果是一样的。
当我们直接找到表单位置的时候,可以注意到当我们点击登录的时候会触发函数submitForm1()==OK。这不是很容易吗?接下来,我们好好玩玩。
我们复制函数名,直接ctrl+F找到函数的位置。
仔细看一下函数,不难发现,函数在得到我们在表单中输入的账号密码后,调用encodeInp()函数,然后形成一个用变量编码保存的字符串。
3.输入错误的账号密码,点击登录,在开发者调试工具中查看网络情况。
我们可以注意到红框中的post请求。
点开之后可以看到cookie,不难发现编码的字样,所以可以猜测这是提交的表单中唯一的数据,而且是登录验证的唯一数据(比之前简单多了,我流下了伤心的眼泪)。
然后,分析一下,关掉浏览器,重新打开这个不需要验证码的网址(重新获取一个服务器分配的cookie),输入刚好错误的账号密码,然后看看那个编码有没有变化,因为根据我上次的经验,编码是根据每次分配的cookie变化的.然后我们发现没有变化!没有变化!没有变化!(重要的事情说三遍不容易吧?)
上面说了,点击网页上的登录按钮会触发函数submitForm1(),然后在这个函数中会调用处理账号密码(实际是加密hhh)的encodeInp()函数。我们找到encodeInp()函数的位置,做同样的操作CTRL F,却发现函数不在这里。
由于这个函数不在这个页面的源代码中,所以它必须是一个导入的js文件。我们在html的头中寻找导入的文件,发现只引入了一个js文件,所以可以确定encodeInp()函数在那个文件中。
在你点击的conwork.js文件中搜索encodeInp()函数,找到了!
要分析,必须看网页源代码(右键查看网页源代码),当然还有F12提供的开发者调试工具。
2.我们来看看网页的源代码。
说吧(战术滑稽脸)
仔细看看conwork.js文件。接下来,我们可以编写python代码。首先,我们把conwork.js文件的代码和已经修改过的、可以被python的execjs库调用的submitForm1()函数放在同一个js文件中(这里我把函数的名字改成了encode)
我就不说写代码的想法了。代码贴在下面,但是这次我很惊讶的发现,我可以直接登录,不用头文件。导入请求
importexecjs
frombs4importBeautifulSoup
类别登录:
def__init__(self):
自我。URL= http://交五2。胡夫。edu。cn/jsxsd/
header={
content-Type : text/html;charset=utf-8 ,
变化:接受编码
}
self.session=requests.session()
self.session.get(self.url,headers=header)
自我。用户名= * * * #账号
自我。密码= * * * #密码
自我GetEncoded()
self.login()
defGetEncoded(self):#该函数获取加密后的字符串
withopen(rconwork.js ,encoding=utf-8)asf:
js=execjs.compile(f.read())
self.encoded=js.call(encode ,self.username,self.password)
f.close()
返回自我编码
爆胎(自我):
postData={
encoded:self.encoded.strip()#账号密码加密后的东西
}
回归自我。会话。帖子( http://交五2。胡夫。edu。cn/jsxsd/xk/LoginToXk ,data=postData)
defGetScore(self):#爬取全部课程成绩
回应=自我。会话。得到( http://交五2。胡夫。edu。cn/jsxsd/kscj/cjcx _ list’)
grade_html=response.text
soup=BeautifulSoup(grade_html, html.parser )
tr _ lable=汤。find _ all( tr )[1:]
all_rows=[]#该列表存放每一个课程的详细信息。
所有行。append([I . textforiinshoop。find _ all( th )])
fortrintr _ lable:
tds=tr.find_all(td )
row=[]
fortdintds:
row.append(td.text)
all _ row。追加(行)
返回所有行
测试=登录()
test.login()
打印(测试. GetScore())#打印爬取的成绩
最后,代码肯定有很多写的不够好的地方,望大家多多包含。嘿嘿嘿~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。