python语言好还是c语言好,新手学python还是c语言

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: