每到毕业季,大家都在跟知网相爱相杀,这不,我毕设领了个任务,爬取用户感兴趣的知网论文。别误会,这只是毕设的一个小功能……
上次讲到,我们学校有知网的授权,我已经编写好了自动下载知网论文的利器了,并且发布了,我真的好后悔,干嘛那么着急发布,还开源,不知道接下来在毕设里面用会不会算我抄袭……
自己抄袭自己的那种……很担心查重出问题。
首先出于硬件性能的问题,我不可能爬取知网的所有知识库,我所想实现的,仅仅是教授们每天早上一起来,微信就提醒他,今天知网更新了几篇您所感兴趣领域的论文,选几篇喜欢的吧,我下载好发给你的那种。
当然,这个需求只是毕设的一部分……
针对于知网最新更新的论文,我第一反应当然是使用知网自己的搜索引擎了,那么好的东西为啥不用?
老规矩,测试,抓包,分析……
神他喵,异步加载,cookie保持,中间有一个步骤错了就不认,要模拟那么多步骤,或者测试那一步骤不是必须的。
我选择放弃……主要是因为我的数据量也不大,就抓今天更新的,神他喵,一天一个领域撑死几十篇论文,多了也没必要传给客户,所以业务上没有数据量的需求。
那为啥子还要模拟咯,无头不是蛮好的吗,更何况运行环境在树莓派原生系统,内置谷歌浏览器,谷歌浏览器现在都支持无头模式。
既然如此,光明伟岸的新明天就开始了。
方案确定,用无头干他喵的!
上面所说的,都是扯犊子,请您从这里开始往下看
啥是无头浏览器,就是headless浏览器。
貌似是废话,其实就是没有界面的浏览器。没有窗口,没有展示,小白用的蒙圈,骂的开心的那种浏览器。
很多人估计都蒙圈了,没有界面和窗口的浏览器怎么用?当然不是给你刷B站用的,他跟普通的浏览器一样,具有浏览器的所有功能,主要用于测试和爬虫。换句话说,他们是由命令行和程序控制的。
因为它本身就是真真正正的浏览器,所以对抗反爬措施还是比较强的,我们知道,反爬措施的目的就是保证正常用户的访问,拒绝爬虫的访问。
就以现在的情况而言,正常用户往往使用正常浏览器,爬虫往往会把自己伪装成浏览器。而在这种假设的前提下,反爬措施的主要任务就是把浏览器和伪装成浏览器的爬虫区分开来。
而在这种假设下,反爬手段是明显出于劣势的,额,换句话说,就以目前主流的反爬手段而言,全部处于劣势。
那么,反爬手段就有了一个发展方向,复杂化,对于请求和步骤尽可能复杂化,使用复杂的JS计算得出复杂的关键字,进行复杂的请求步骤。
目的只有一个,就是尽可能的导致爬虫开发方的成本上升,开发周期变长。这样对于那些不是特别需要他们数据的公司来说,出于成本原因可能会考虑放弃。
换而言之就是他们家数据的价值还没我爬虫值钱,我为啥还要开发这个爬虫?
但是,从理论和技术上来说,只要成本到位,主流的反爬措施都是摆设。
这个时候,我们就在思索一件事,不管他步骤怎样复杂化,他还是要对正常的浏览器提供业务支持,换而言之,他再复杂的请求步骤也会被浏览器完美执行。
使用浏览器自己当爬虫,加大了资源消耗,爬取速度明显变慢,但是简化了开发步骤,缩短了开发周期,在某些情况下,这个技术还是非常有利可图的。
这个时候大家就搬来用来做测试的无头浏览器,还有selenium模块。无头浏览器没有界面,可以被selenium完美的控制,这样只需要用这个模块控制浏览器去一个个的打开网页,模仿输入点击等等,数据自然而然的就到手了。
无头浏览器就是真的浏览器,只不过没有了界面,而网站服务器是难以发现的,所以这就给反爬措施上了一大课!
那么,是不是只要你愿意牺牲资源,牺牲速度,一切问题就都解决了呢?
下面看看我在树莓派原生系统上与知网搜索引擎的爱恨情仇吧。
开发环境在这篇文章:https://www.52pojie.cn/thread-952290-1-1.html
python+selenium+谷歌浏览器的教程在这里:https://www.cnblogs.com/zhaof/p/6953241.html
知网链接:http://www.cnki.net/
向这篇博客的作者表示致谢,我不是那种乱抄别人的东西伪装成原创的人。
首先配置好开发环境,环境中内置了谷歌浏览器,现在的谷歌浏览器都支持无头模式,安装python3,环境内也内置了。
安装selenium。
[Bash shell] 纯文本查看 复制代码 pip3 install selenium
sudo pip3 install selenium
建议执行上面两条命令,原因是有时使用管理员权限调用python脚本,可能因为用户隔离的原因,并不能调用普通权限的selenium模块,具体原因我还没探究,不过欢迎大家批评指正。
接下来我们要安装chromedriver,它是让selenium正常驱动谷歌浏览器的模块,一说这个我就气不打一处来。
我解决这个的安装,用了一天半,网上各种教程我都试了,全他喵是抄的!一个比一个复杂,一个比一个不能用。记住,我教你怎么装,全网可能就我这有真正管用的解决方案。
看好命令:
[Bash shell] 纯文本查看 复制代码 sudo apt-get install chromedriver
我没骗你,这个,就这一条命令浪费我一天半,网上每个教程不下十几个步骤,都不能用!就我这个能用!
然后开始正式的编程之旅
首先我打开知网,在搜索引擎搜索关键字“爬虫”。加载出这个界面:
我需要的只是搜索结果的名称和链接,那么我只需从源代码里把这些结果抓出来就好了。
ctrl+u打开源代码,一搜索,没有。他喵喵咪的,咋没有?
通过抓包分析发现,它是异步单独请求的,请求返回数据是这样
是这样哦,那我先用谷歌无头来试试,编程成功以后,发现使用selenium模块果然提取不到搜索结果数据,因为他的搜索结果不在源代码里,所以找不到。
一度发愁,该怎么办?通过重发请求发现,它是用cookie保持你的搜索记录,也就是说,不登录他也用cookie保持。
意味着,我们必须得去探索它是在哪一步把搜索关键字和你的cookie挂钩的。
如果这一步解决了,我们使用无头浏览器就没有意义了,手动构建请求不就好了?
又回到最初的起点,记忆中……
要知道,我们写的是爬虫,我们有无数的方法可以解决,我们不可能被知网憋死。
这是,我分析知网搜索结果请求的链接很有意思,解码后是这样
http://kns.cnki.net/kns/brief/brief.aspx?pagename=ASP.brief_default_result_aspx&isinEn=1&dbPrefix=SCDB&dbCatalog=中国学术文献网络出版总库&ConfigFile=SCDBINDEX.xml&research=off&t=1557514359097&keyValue=爬虫&S=1&sorttype=
关键字t肯定是时间戳,其他的都不变啊,keyValue是我们的搜索关键字。
我们要明白这样一件事,无头浏览器在执行完搜索以后,cookie已经跟知网协商好了,并且保持,这个时候重新发送加载搜索结果的请求,cookie和原来所有的东西都会保留,知网验证是没有问题的。
我通过程序构建好了请求链接,在搜索结束后,程序主动控制浏览器再次请求搜索结果,成功了。
至此,知网的外衣已经被我撕下,而他的内衣,我前几天早撕了。
|