前提: 【心得|记录下最近七天一点研究】一次偶然的机会,我了解到Jsoup这个jar包的使用,对网页数据的抓取迅速勾起我的好奇心,于是我就跟着视频操作,并成功抓取到京东搜索页和当当网搜索页的数据,当时对我来说,就好像开启了代码的新世界,当时我想起来之前有用过的学习工具-学习通,那么我是否能简单获取到我的作业完成情况呢?刚开始的我就是这样想的,接着,我就去实际操作
尝试获取作业完成情况 我试着用Jsoup去获取学系统上面的作业完成情况,结果我发现一个问题,这跟获取京东和当当网上面的数据有些不一样,这个需要登录验证,如果直接去访问作业的提交页面,就会被拦截,然后跳转到用户登录的界面。
哪能怎么办呢?难道学完这个简单爬个静态页面就算了嘛?当然,我的想法肯定不是这样,搞到学习通的数据是我很久之前就有的一个想法,只不过由于技术不到位,根本没法实现这个需求,现在有方向了,肯定要去实践。
接着,我开始从网上了解网站的请求和响应,其实里面的数据交互很简单,这边我们发送一个请求到目标服务器,服务器经过验证,然后返回给我们一些数据,而账号的登录便是做了一些验证,那么我现在要做的实现就是过登录验证这一关
- 尝试使用Cookie登录网站:在学完JavaWeb后,我了解到Cookie和session的作用,那么学习通登录完之后,肯定会在浏览器上储存的有Cookie,拿到这个Cookie,是不是就意味着能模拟登录了?结果如我所料,在拿到Cookie之后,我把他加入到Jsoup请求的请求头中,发现能正常登录,第一步实现!
- 尝试获取作业情况:在登陆成功的前提下,我试着去访问作业的界面,我又发现了一个问题,从Jsoup.connect().get()返回来的界面中不包含任何作业的信息,这我就很纳闷了明明是可以看的见的信息,为什么就拿不到呢?于是我反复尝试,反复获取,直到账号出现异常的提示信息,还是没有想出问题的原因。
- 于是,我准备尝试另外一种方式来获取——HttpClient,在搜索Java爬虫这个关键字后,我发现有HttpClient+Jsoup+webMagic这个视频教程,想着了解一下的原则来学习。我看了下视频的目录,好家伙100多集,直接崩溃。随便翻了翻,我发现有几集是关于模拟登陆的内容,这是我正想要的!
- 视频中讲的是模拟豆瓣登录的过程,其中包括获取Cookie,爬取数据等等,更重要的是,Up主的一句提醒解答了我的疑惑:“很多网站都是动态生成的,要么是纯Js生成,要么就是Js+Ajax来进行生成页面,而一开始加载的仅仅只是框架而已!!!!!”
- 看完UP主的操作,我茅塞顿开,瞬间有了思路:
- 先模拟登陆Cookie
- 模拟操作访问所有的课程界面,获取所有课程
- 再访问课程的详情界面,获取课程的详细信息
- 拿到课程界面中的作业链接(因为作业连接中有一个动态生成的验证码Enc,每次进入界面都会商生成不一样的)
- 然后访问该链接来到作业的详情界面,在这里就可以看到作业的全部信息
- 整体思路:模拟登录-拿到所有的课程信息-通过课程拿作业的真实地址-到达真实地址来拿作业的详细信息
- 上面的思路很清晰,也很容易实现,那天晚上,我一直操作到凌晨4点多,最后完成功能:一键查询未完成的作业情况
- 在操作的过程中,遇见了一个坑,也就是学习通的网站分新版和旧版,有点课程默认进入的是新版本的网站,而有的课程点进去就是旧版的网站,这就让我很迷惑。最后分析才发现,新版的链接和旧版的连接之间多了一个参数,而就是这个参数来决定你进入的是新版本的界面还是旧版本的界面,好了问题解决,成功拿到所有课程信息和作业完成情况,根据正则表达式来获取我们想要的信息
- 登录完成了,课程信息和作业完成情况也拿到了,但是登录是我复制的Cookie,总不能这样经常的去复制Cookie吧,要多麻烦就有多麻烦,那么我能不能模拟学习通的登录呢?
- 分析学习通的登录网页,多次提交正确和错误的账号密码,我发现学习通提交的参数里面只要两个数据在变动,那就是账号和密码,而密码则是一串看不懂的英文字母,于是我把手机号和这串英文字母复制,使用Jsoup携带进行访问,成功!
- 这串英文字母又是怎样生成的?开始我以为是Url编码的问题,在进行多次解码尝试后果断放弃,太难了,没一点思路。无奈之下我发现了别人写的一篇文章,是模拟学习通签到的,其中也包括模拟登陆,然后我就发现他的代码中有使用Base64解码的过程,于是我尝试使用Base64来进行解码,果然得到了真实密码,至此密码问题解决了,现在已经可以使用账号密码模拟登陆学习通,并一键查询到没有提交的作业和所有课程。
- 原因是学习通对我们的请求频率做的有检测,也就是说正常操作的情况下,是不可能那么高频率的点击或访问某一界面,只要超过这个频率,那么就会对账号进行验证操作或者限制其行为。那么该如何去解决呢?
- 要想解决这个问题,有两种方案,第一就是降低软件的运行速率,在学习通限制的频率范围内;第二就是找到接口,直接请求接口来获得数据,因为我发现,页面中的数据并不全是源代码直接携带的,而是一个动态生成的网页,那么来讲,页面中的数据肯定来源于某一个请求信息,只要找到这个请求信息,我们就可以通过直接访问请求的方式来获得想要的数据
- 当然,一开始我是选择第一种方案,每次运行查询的时候设定休眠一秒,但是,尽管是这样,还是不能从根本上解决问题,最后我还是从别的地方找到了Api接口,至此,学习通查询课程的功能已经实现了,后面我又实现了签到功能,思路跟这个差不多,就不一一叙述了,重点是思路,思路很重要!!
- 学东西要做笔记!!!这个真的很重要,不关你做的笔记优劣,总之做笔记就对了!我在实战过程中发现很多之前熟的不能再熟的操作,基本上忘得干干净净,就连参考都找不到地方参考,只能再学一遍,而那些做笔记的部分,直接就跟着思路捋一遍就上手很快
- 学知识要注重基础,当你学的越来越高层的时候,你会发现基础知识多么重要,打个比方说,这里我用的框架,虽然我会用了,但是这个框架的实现原理以及本质我都不清楚,多线程、io流、反射机制,这些很重要的地方,都没有掌握牢固,导致后面用到的时候还要去查
- 要有想法有需求,这里我想想到一个词“懒惰”,意思是说:对于一个渴望做好的事,一定要有想法并且懒,这里的懒并不是贬义词。举个例子来说吧,比如说我想用爬虫下载抖音的无水印视频,我只是简单的想下载,于是我一开始写了三个方法,一个方法一个方法的运行。虽然基本功能实现了,但是每次都要去运行这些方法就很烦,然后我就把他们整合到一个方法中,接着呢,就很方便了,每次下载只需要点击运行就行了,但是,这时候我发现,单线程的程序下载很慢,于是我又有了提升下载速度的想法,然后又去学习了多线程,速度提升了20倍,但是速度提升上去了,每次运行都要打开编辑器,就很麻烦,我又去学程序打包,最后打包成exe程序,直接点击就能运行了,到这里已经很完善了吧,但是,我还是嫌麻烦,我又写了个自动化脚本,直接放开双手下载。这就是懒
- 要注意时间安排,从了解爬虫开始,到最终完成了几个小项目,十天左右的时间,我几乎每天都是早上五点多就起来,然后坐在电脑前啪啪啪的敲代码,来实现我的各种想法。一直到中午,草草的吃个午饭(早饭没吃),就回到电脑前继续写代码,到了晚上十一点多,本来就很疲惫了,但是这个时候又有一些新的想法,总想着去实现,就这样,十天左右,我没有一天不是早上五点就起来的,没有一天晚上是在凌晨两点之前就睡觉的,最晚的一次是凌晨四点睡得,早上七点就起来了,因为还要上网课,最后脸上也冒了几个痘。总之,还是先休息好
推荐阅读
- MySQL|1亿条数据批量插入 MySQL,哪种方式最快()
- SQL|这道 Mysql 的解题思想,值得学习!
- Python学习|GitHub原生AI代码生成工具Copilot的试用记录
- python|GitHub原生AI代码生成工具Copilot,官方支持Visual Studio 2022
- 数据库|让 AI 为你写代码 - 体验 Github Copilot
- 笔记|GitHub AI 编程工具自动写代码神器Copilot插件体验
- github|你还在手动写代码吗(Github的Copilot有多强?)
- 有趣的库|Pycharm GitHub Copilot python 代码建议和代码补全
- python|python-OpenCV-人脸、眼睛,微笑检测