记录下最近七天一点研究

前提:

一次偶然的机会,我了解到Jsoup这个jar包的使用,对网页数据的抓取迅速勾起我的好奇心,于是我就跟着视频操作,并成功抓取到京东搜索页和当当网搜索页的数据,当时对我来说,就好像开启了代码的新世界,当时我想起来之前有用过的学习工具-学习通,那么我是否能简单获取到我的作业完成情况呢?刚开始的我就是这样想的,接着,我就去实际操作

尝试获取作业完成情况

我试着用Jsoup去获取学系统上面的作业完成情况,结果我发现一个问题,这跟获取京东和当当网上面的数据有些不一样,这个需要登录验证,如果直接去访问作业的提交页面,就会被拦截,然后跳转到用户登录的界面。

哪能怎么办呢?难道学完这个简单爬个静态页面就算了嘛?当然,我的想法肯定不是这样,搞到学习通的数据是我很久之前就有的一个想法,只不过由于技术不到位,根本没法实现这个需求,现在有方向了,肯定要去实践。

接着,我开始从网上了解网站的请求和响应,其实里面的数据交互很简单,这边我们发送一个请求到目标服务器,服务器经过验证,然后返回给我们一些数据,而账号的登录便是做了一些验证,那么我现在要做的实现就是过登录验证这一关

  1. 尝试使用Cookie登录网站:在学完JavaWeb后,我了解到Cookie和session的作用,那么学习通登录完之后,肯定会在浏览器上储存的有Cookie,拿到这个Cookie,是不是就意味着能模拟登录了?结果如我所料,在拿到Cookie之后,我把他加入到Jsoup请求的请求头中,发现能正常登录,第一步实现!

  2. 尝试获取作业情况:在登陆成功的前提下,我试着去访问作业的界面,我又发现了一个问题,从Jsoup.connect().get()返回来的界面中不包含任何作业的信息,这我就很纳闷了明明是可以看的见的信息,为什么就拿不到呢?于是我反复尝试,反复获取,直到账号出现异常的提示信息,还是没有想出问题的原因。

  3. 于是,我准备尝试另外一种方式来获取——HttpClient,在搜索Java爬虫这个关键字后,我发现有HttpClient+Jsoup+webMagic这个视频教程,想着了解一下的原则来学习。我看了下视频的目录,好家伙100多集,直接崩溃。随便翻了翻,我发现有几集是关于模拟登陆的内容,这是我正想要的!

  4. 视频中讲的是模拟豆瓣登录的过程,其中包括获取Cookie,爬取数据等等,更重要的是,Up主的一句提醒解答了我的疑惑:“很多网站都是动态生成的,要么是纯Js生成,要么就是Js+Ajax来进行生成页面,而一开始加载的仅仅只是框架而已!!!!!”

  5. 看完UP主的操作,我茅塞顿开,瞬间有了思路:

    • 先模拟登陆Cookie
    • 模拟操作访问所有的课程界面,获取所有课程
    • 再访问课程的详情界面,获取课程的详细信息
    • 拿到课程界面中的作业链接(因为作业连接中有一个动态生成的验证码Enc,每次进入界面都会商生成不一样的)
    • 然后访问该链接来到作业的详情界面,在这里就可以看到作业的全部信息
    • 整体思路:模拟登录-拿到所有的课程信息-通过课程拿作业的真实地址-到达真实地址来拿作业的详细信息
    • 上面的思路很清晰,也很容易实现,那天晚上,我一直操作到凌晨4点多,最后完成功能:一键查询未完成的作业情况
  6. 在操作的过程中,遇见了一个坑,也就是学习通的网站分新版和旧版,有点课程默认进入的是新版本的网站,而有的课程点进去就是旧版的网站,这就让我很迷惑。最后分析才发现,新版的链接和旧版的连接之间多了一个参数,而就是这个参数来决定你进入的是新版本的界面还是旧版本的界面,好了问题解决,成功拿到所有课程信息和作业完成情况,根据正则表达式来获取我们想要的信息

  7. 登录完成了,课程信息和作业完成情况也拿到了,但是登录是我复制的Cookie,总不能这样经常的去复制Cookie吧,要多麻烦就有多麻烦,那么我能不能模拟学习通的登录呢?

  8. 分析学习通的登录网页,多次提交正确和错误的账号密码,我发现学习通提交的参数里面只要两个数据在变动,那就是账号和密码,而密码则是一串看不懂的英文字母,于是我把手机号和这串英文字母复制,使用Jsoup携带进行访问,成功!

  9. 这串英文字母又是怎样生成的?开始我以为是Url编码的问题,在进行多次解码尝试后果断放弃,太难了,没一点思路。无奈之下我发现了别人写的一篇文章,是模拟学习通签到的,其中也包括模拟登陆,然后我就发现他的代码中有使用Base64解码的过程,于是我尝试使用Base64来进行解码,果然得到了真实密码,至此密码问题解决了,现在已经可以使用账号密码模拟登陆学习通,并一键查询到没有提交的作业和所有课程。

你以为到这里就算结束了?

其实,按照我们的思路,这样做的话,是完全没有问题的,可是总有意外和惊喜出现,在从页面中解析时,经常会出现账号异常的问题要验证,这又是什么原因呢?

  1. 原因是学习通对我们的请求频率做的有检测,也就是说正常操作的情况下,是不可能那么高频率的点击或访问某一界面,只要超过这个频率,那么就会对账号进行验证操作或者限制其行为。那么该如何去解决呢?

  2. 要想解决这个问题,有两种方案,第一就是降低软件的运行速率,在学习通限制的频率范围内;第二就是找到接口,直接请求接口来获得数据,因为我发现,页面中的数据并不全是源代码直接携带的,而是一个动态生成的网页,那么来讲,页面中的数据肯定来源于某一个请求信息,只要找到这个请求信息,我们就可以通过直接访问请求的方式来获得想要的数据

  3. 当然,一开始我是选择第一种方案,每次运行查询的时候设定休眠一秒,但是,尽管是这样,还是不能从根本上解决问题,最后我还是从别的地方找到了Api接口,至此,学习通查询课程的功能已经实现了,后面我又实现了签到功能,思路跟这个差不多,就不一一叙述了,重点是思路,思路很重要!!

总结

写到这里已经两千二百多字了,其实我还想描述下分析抖音短视频的过程但是这个就涉及到一些敏感的地方,不方便在这里透露,那么就讲讲一周来的总结吧

  1. 学东西要做笔记!!!这个真的很重要,不关你做的笔记优劣,总之做笔记就对了!我在实战过程中发现很多之前熟的不能再熟的操作,基本上忘得干干净净,就连参考都找不到地方参考,只能再学一遍,而那些做笔记的部分,直接就跟着思路捋一遍就上手很快

  2. 学知识要注重基础,当你学的越来越高层的时候,你会发现基础知识多么重要,打个比方说,这里我用的框架,虽然我会用了,但是这个框架的实现原理以及本质我都不清楚,多线程、io流、反射机制,这些很重要的地方,都没有掌握牢固,导致后面用到的时候还要去查

  3. 要有想法有需求,这里我想想到一个词“懒惰”,意思是说:对于一个渴望做好的事,一定要有想法并且懒,这里的懒并不是贬义词。举个例子来说吧,比如说我想用爬虫下载抖音的无水印视频,我只是简单的想下载,于是我一开始写了三个方法,一个方法一个方法的运行。虽然基本功能实现了,但是每次都要去运行这些方法就很烦,然后我就把他们整合到一个方法中,接着呢,就很方便了,每次下载只需要点击运行就行了,但是,这时候我发现,单线程的程序下载很慢,于是我又有了提升下载速度的想法,然后又去学习了多线程,速度提升了20倍,但是速度提升上去了,每次运行都要打开编辑器,就很麻烦,我又去学程序打包,最后打包成exe程序,直接点击就能运行了,到这里已经很完善了吧,但是,我还是嫌麻烦,我又写了个自动化脚本,直接放开双手下载。这就是懒

  4. 要注意时间安排,从了解爬虫开始,到最终完成了几个小项目,十天左右的时间,我几乎每天都是早上五点多就起来,然后坐在电脑前啪啪啪的敲代码,来实现我的各种想法。一直到中午,草草的吃个午饭(早饭没吃),就回到电脑前继续写代码,到了晚上十一点多,本来就很疲惫了,但是这个时候又有一些新的想法,总想着去实现,就这样,十天左右,我没有一天不是早上五点就起来的,没有一天晚上是在凌晨两点之前就睡觉的,最晚的一次是凌晨四点睡得,早上七点就起来了,因为还要上网课,最后脸上也冒了几个痘。总之,还是先休息好

你可能感兴趣的:(心得,笔记,爬虫,java,python)