吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10866|回复: 10
上一主题 下一主题
收起左侧

[Python 转载] 简单无头浏览器爬虫,与知网的相爱相杀

[复制链接]
跳转到指定楼层
楼主
天域至尊 发表于 2019-5-11 18:03 回帖奖励
每到毕业季,大家都在跟知网相爱相杀,这不,我毕设领了个任务,爬取用户感兴趣的知网论文。别误会,这只是毕设的一个小功能……

上次讲到,我们学校有知网的授权,我已经编写好了自动下载知网论文的利器了,并且发布了,我真的好后悔,干嘛那么着急发布,还开源,不知道接下来在毕设里面用会不会算我抄袭……

自己抄袭自己的那种……很担心查重出问题。

首先出于硬件性能的问题,我不可能爬取知网的所有知识库,我所想实现的,仅仅是教授们每天早上一起来,微信就提醒他,今天知网更新了几篇您所感兴趣领域的论文,选几篇喜欢的吧,我下载好发给你的那种。

当然,这个需求只是毕设的一部分……

针对于知网最新更新的论文,我第一反应当然是使用知网自己的搜索引擎了,那么好的东西为啥不用?

老规矩,测试,抓包,分析……
神他喵,异步加载,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和原来所有的东西都会保留,知网验证是没有问题的。
我通过程序构建好了请求链接,在搜索结束后,程序主动控制浏览器再次请求搜索结果,成功了。


至此,知网的外衣已经被我撕下,而他的内衣,我前几天早撕了。

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
eflyz + 1 热心回复!
李玉风我爱你 + 3 + 1 直接用requests的session啊
晏南风 + 1 虽然看不懂,但感觉很厉害
aq24 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| 天域至尊 发表于 2019-5-11 18:46 |楼主
葫芦炒鸡蛋 发表于 2019-5-11 18:32
。。。这么简单的功能没必要用selenium,直接requests就搞定了,伪装成浏览器即可。目测代码不会超过100行 ...

第一是为了简化开发步骤和周期,因为不想烦cookie与关键字绑定的步骤,第二个,整套模拟下来分析很麻烦,不如这两个一结合,方便得很。代码20行都到不了。
沙发
 楼主| 天域至尊 发表于 2019-5-11 18:08 |楼主
对了,这篇文章相当于学习日记吧,并没有系统的讲项目与程序,我源码都没发,等毕业审核以后发吧,要不然被老师指责自己抄袭自己就麻烦了。大家相当于编程版的文字vlog看下吧
3#
千夜瞬 发表于 2019-5-11 18:24
4#
lizhipei78 发表于 2019-5-11 18:27
大神,好厉害啊
5#
葫芦炒鸡蛋 发表于 2019-5-11 18:32
。。。这么简单的功能没必要用selenium,直接requests就搞定了,伪装成浏览器即可。目测代码不会超过100行。
7#
杨雨辰 发表于 2019-7-28 11:22
有没有java版的... 我只会java...
8#
 楼主| 天域至尊 发表于 2019-7-29 22:21 |楼主
杨雨辰 发表于 2019-7-28 11:22
有没有java版的... 我只会java...

好可怜,小声告诉我,什么是世界上最好的语言?推荐学习下python的,有java基础的话,不到一个星期就会了。
9#
watchbone 发表于 2019-7-31 12:36
爬虫、、、、一直想学习的东西。。。。
10#
vanity_chang 发表于 2019-7-31 16:06
天域至尊 发表于 2019-7-29 22:21
好可怜,小声告诉我,什么是世界上最好的语言?推荐学习下python的,有java基础的话,不到一 ...

Java
本来想说PHP的,但是吾爱不让
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 21:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表