您的位置:首页 > 其它

爬虫入门教程②— 必备知识基础(一)反爬虫简介

2018-12-05 14:47 302 查看

这一节我们需要明确的是爬虫的一些目标。

爬虫的首要目标 — 正确获取到数据
为什么只是获取数据呢?因为获取到数据之后,不管是解析还是存储,都是我们自己单方面的处理,并不需要目标网站的“配合”了。所以爬虫最复杂的部分,就在于获取数据。获取不到目标数据,不管你的解析代码写的多么好,你的存储速度多么快,那都是个没用的爬虫程序。这是我们必须要明确的一点。
很多网站觉得自己的数据比较宝贵,会花时间去对付爬虫,从而达到保护自己的数据的目的。毕竟在这个数据为王的时代,谁拥有了数据,谁就有了更多的赚钱的机会。那么这些网站为了防止我们的小蜘蛛拿到他们的数据,会采取哪些措施呢?
 最常见的:图形验证码。我们的目标数据必须要登录后才能看到,但是登录又需要输入验证码。如果不能正确输入验证码先登录,那么我们就无法获取到我们需要的数据了,而网站也就成功达到目的了。普通的无差别爬虫遇到这种情况就到此为止了。比如搜索引擎,你没办法在百度搜到你的说说内容吧?
 最粗暴直接的:限制访问速度,这个也是非常常见的一种反爬虫的办法,网站服务端往往设置了一个访问速度上限,到了这个上限,那么一段时间内网站会拒绝你的访问。当然这个速度会比正常人浏览网页要快得多,比如1小时1000次或者1秒3次,都有可能。我们偶尔刷新网页过快,就有可能触发这个保护机制,然后网站就会显示你被拒绝访问了,而网页上总是会出现一个大大的数字—403,通常还伴随着一个单词——Forbidden。
 最机智的:拖动滑块验证、选出图片中的颠倒的文字、数据加密后传输。为什么当时12306的变态验证码被无数人吐槽,那就是因为需要防止抢票程序对服务器造成高负荷,保证大家都是手动抢票的公平公正。这些情况的处理,往往会比较复杂,制作爬虫需要花费的精力也会更多。

上面的就是网站常见的反爬虫措施了。而我们写爬虫的,是一定要和反爬虫斗智斗勇的。所谓道高一尺魔高一丈,既然网站能够想出这么机智的办法来反爬虫,那我们也可以根据网站的根本目的来反反爬虫。网站的根本目的?当然就是,把正确的内容展示给用户。这也是为什么不管反爬虫策略多么高级,还是会有挡不住的爬虫的原因。因为不能阻碍了正常用户的浏览使用,那么只要爬虫伪装得足够好,足够像人在操作一般,那就可以获取到想要的信息。
爬虫的进阶目标 — 优秀的爬取策略
我们拿到一个目标之后,首先要做的,并不是开始盲目地写代码,而是制订爬取策略。
a. 从哪个页面开始
b. 怎么进入到我们的目标网页
c. 如何从目标网页解析出我们的目标数据
d. 解析后的数据如何存储
e. 如何防止页面重复爬取
以上都是我们编写爬虫必须要思考的问题。不下笔墨不读书,不想清楚不写代码。这也是我从写代码中领悟到的道理,做事情一定要有计划,你要知道你这一步在做什么,下一步要做什么,什么时候开始,什么时候停止。
举一个制订爬取策略的例子吧。假设我们需要获取我们所在学校的所有学生的数据(姓名、学号、专业、班级、性别)。第一步是什么?当然是找一找网站到底有没有我们需要的数据啦。
于是我们找啊找,找了半天,发现在教务处首页里面,有个查看学生名单的链接;
点进去一看,哇,被骗了!这不是学生名单,而是是学校的所有专业网页,但是这些专业都可以点击;
点进去专业信息的网页呢?我们可以看到这个专业的所有班级的链接了;
于是我们继续点了班级的链接我们终于看到了学生信息的网页;
网页很整齐,大概就是一个表格,如下。

学生信息
那么我们从这里可以明确到:目标数据是可以获取到的(因为我们能看到,哈哈哈嗝)。虽然我们不能在学生名单页面获取到所有的信息,比如专业班级。但这些信息都可以从之前的页面去获取,所以所有的数据,都是可以获取到的,那么我们开始制定策略了。
 首先从所有专业的网页开始。为什么是这个网页而不是教务处首页?因为教务处的首页没有有用的信息,而这个网页不仅可以帮助我们获取到专业名字,还有所有班级的网页的入口链接,我们又可以获取到班级信息,又可以从班级信息获取到学生名单的入口链接。
那么这个流程,可以形成一个循环了:点开A专业的页面,获取到A专业的所有班级,再点开A专业Z班的页面,得到了A专业Z班所有人的信息之后,再返回上级,点开A专业X班的页面,再获取A专业X班的所有人的信息。直到A专业的所有的班级爬取完成。然后又从B专业开始重复。到这里,我们基本上对整个处理流程就有了个大概的轮廓了。
 下一步,当然是思考如何从网页里面,只获取到我们需要的信息,而过滤掉其他没用的信息。这一步我们称之为解析。
 然后就是思考数据如何存储了,这个通常取决于用途,但是大部分时候我们都存在数据库,因为这样可以方便地通过工具转换成其他我们需要的格式。比如 txt文件、表格文件。
 页面重复爬取?tan90°。在本案例,不会有重复。因为我们是非常有条理,一层一层往下搜索的,并不会遇到有重复页面的问题。什么时候可能会遇到重复的页面呢?比如a网页有b网页的链接,b网页又有a网页的链接。你爬了a网页,发现并进入了b网页,又爬了b网页,发现了a网页,这时候就需要考虑怎么判断出a网页是我们已经爬过的了。
虽然本案例页面不会重复,但是,数据却可能重复。比如由于教务处的疏忽,X同学原来在S班,后来转到了B班。而我们在B班的网页看到了X同学的信息,又在S班看到了X同学的信息。这当然会对后期的操作造成影响,我们就需要去掉这种重复的数据,怎么办呢?那我们就想一想爬取的这些数据有哪些特性,这个特性要是每个人都有,但是每个人又不一样,能够用来和其他人区别开的。名字?重名的可能性是存在的,不行。身份证号码?太棒了,只可惜我们获取不到呢。学号?完美!这是一个我们既能够获取到,同时也是每个人都独有的信息。在本案例中,我们就可以用学号来去掉重复的数据。
那么问题到此就基本上解决了,我们也制定出了一个有效的策略了。剩下的就是编写代码了。写代码教程会在基础讲解完成之后再开始,敬请关注。
爬虫的高级目标 — 数量少却高效的代码
同样的一个网站,不同的人写出来,会有不同的效率。A同学只用100行就搞定了,但是却运行了10分钟。B同学用了50行,时间竟然只用了5分钟。为什么人与人之间会有这么大的差距呢?(´థ౪థ)σ 嘤嘤嘤
 首先,非常重要的一个方面,那就是经验。熟能生巧,B同学可能拥有5年的写代码经验,A同学只有6个月。所以很可能B同学的代码逻辑会更加完整,思路也更清晰简洁,由此减少了很多不必要的流程,从而节省了代码量,节约了时间。
 另一个可能是辅助工具的选择,Python里面,写爬虫有很多非常优秀的库(别人写好的代码)可以给大家使用,A同学的10行代码完成的功能,B同学调用一个A不知道的库,一行就OK了,并且功能还比A强大,速度还更快。积少成多,最后量变发生质变。所以,记住这句话:不要重复造轮子。当然如果你造出来的轮子,还没别人的好,那就更不要了emmmm。
经验我们除了多写代码没办法改变,而使用友好快捷的工具,是我们追寻的目标。这也是编程的艺术,简单优于复杂。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: