一只爬虫(一)

免责的废话

本篇无标题,都说爬虫写得好,牢饭吃到饱,原本不想写爬虫的,毕竟风险有点高,可是做为一个搞搜索的人,怎么能不了解一下爬虫呢,怎么能不本身深刻了解一下爬虫的原理呢,并且,知道了爬虫的通常性原理和一些开源的爬虫框架之后,写出一个本身的小爬虫并非一件很难的事情,而一个本身的小爬虫,有时候仍是颇有用的,好比....又好比....,只要发挥你的想象,爬虫也能作不少事情。python

当今的互联网世界,本质上是个数据的世界,谁掌握了数据谁就能独步天下,可是,对于咱们这种互联网上小喽啰,数据确定是不会来主动找咱们为咱们所用的,那么,如何更高效的获取你须要的数据,就变成了一门独立的职业---爬虫工程师(又称看守所预科班),接下来几篇文章,咱们抛开这些商业行为,从纯技术的角度来讲一说爬虫,这门和互联网一块儿诞生的古老技艺。算法

 对于爬虫的历史,咱们不作太多的介绍了,毕竟这些东西在网上一搜一大把,并且这个系列文章也没有太多的爬虫技巧,毕竟我也不是来教你如何吃牢饭的,懂得太多的爬虫技巧,容易误入歧途走向万劫不复的深渊,这并非我写这篇文章的初衷,同时,最重要的是,由于我也不会爬虫的技巧,因此也没办法教你缓存

为了让你有个对爬虫的总体了解,整个系列文章大概分为几个方面吧,一是爬虫的原理,这里会介绍一些爬虫最底层的数据结构和原理,而后第二部分是一个简单爬虫的架构和模块,这一篇会主要介绍一下要实现一个完整的爬虫须要哪些个模块,最后第三部分,我会基于Elasticsearch的插件实现一个简单的爬虫框架(放心,安全得狠,你拿去也没用),另外,我想安利一下Elasticsearch这个搜索引擎,若是你把他的搜索属性抛开,你会发现他能够作不少事情,好比这里就能够用来作爬虫,我还拿他作了缓存,消息队列等等。。安全

好了,闲话少说(MD已经说了这么多了),咱们开始爬虫之旅吧。服务器

基础的基础

  
提及爬虫的基础,其实只有两点:网页的下载和连接的遍历,几乎全部的资料跟你说的都是,一个爬虫都是从一批种子网页开始爬取,而后分析页面中的连接,再将连接再爬取一遍,如此反复,直到把整个互联网爬完,好像很简单,写代码出来不就是一个for循环里面一堆curl么。微信

咱们从一个最简单的爬虫开始,一步一步升级咱们的爬虫,经过一个一个的点,让他进化成一个分布式的,可自由扩展的爬虫。数据结构

丐中丐版

丐中丐版本没啥好说的,直接上代码:多线程

import requests
content=requests.get("http://www.baidu.com")
print content

上面这三行作为丐中丐没问题吧,三行代码爬下百度,丐中丐版本没啥好说的,但这也是一个爬虫最核心的需求,就是爬下一个网页。从丐中丐版出发,咱们解决一些问题之后,就能够变成一个比较强大的爬虫了,首先须要解决的就是如何遍历页面。架构

页面遍历

上面的丐中丐版本,只是一个页面,对于一个爬虫,咱们须要解决的问题是,让爬虫能够一直运行下去,也就是能够获取到网页中的连接,这里就涉及到第一个爬虫相关的知识点,广度优先搜索和深度优先搜索。广度优先和深度优先是大学数据结构的基础内容,相似于树结构中的前序遍历,通常在搜索一个图的数据结构中使用这两种搜索算法,首先,咱们简单介绍一下这两种搜索算法,总体上来讲,深度优先就是压栈,弹栈,广度优先就是入队,出队。框架

深度优先搜索(DFS)

DFS就是尽量的往深处遍历,直到遍历到没有节点了或者遇到已经遍历过的节点了,再返回到上一级,找到下一个节点,继续上面的过程。

image.png

对于上面这个图来讲,深度优先搜索的路径就是:A -- B -- D -- E -- F -- C

对于DFS来讲,实现起来比较简单,每遍历到一个节点,就把这个节点压栈,而后再在这个节点上找一条路径继续遍历下一个节点,遍历到之后,再压栈,直到遍历到的节点没有路径可走了,这时候弹栈,找另一条路径继续遍历,如此反复,这样的实现方式,若是图很复杂的话,栈很容易爆掉,而互联网这张用超连接链接起来的图,复杂性就不用多说了吧,因此对于爬虫来讲,若是采用这样的方式进行遍历,通常会设置一个搜索深度,到达这个深度就不在搜索了,省得内存给爆了。

广度优先搜索(BFS)

BFS和深度优先不一样的在于,每遍历到一个新的节点,先把和这个新节点相邻的节点遍历完,而后一个一个依次深刻到下一个层级,继续上面的过程。
image.png
对于上图来讲,广度优先搜索的路径就是: A -- B -- C -- D -- E -- F

对于BFS来讲,实现起来也不是很复杂,通常都是使用队列的方式来实现,每遍历到一个节点,就把这个节点上的一级路径走一遍,找到相邻的全部节点,而后把这些节点压到队列里面去,每次从队列的头部取出节点出来,重复上面的过程,BFS比较好进行异步化和多线程的操做,经过设置队列的长度,也能够很好的控制内存,而且不会出现遍历不到的状况,因此通常使用这种搜索方法来爬取数据也比较常见。

页面优先级

在一个爬虫系统中,单使用广度优先算法或者单使用深度优先算法,实际上都不能达到很好的效果,由于有些网站是比较重要的,有些网站是一些歪瓜裂枣的网站,把流量耗费在这些歪瓜裂枣上,获取的数据也没什么价值,因此通常都会在把网页塞到队列的时候给一个优先级,优先级高的页面先爬取,带优先级的队列实现起来比较容易,由于这里的优先级并无很是细的粒度,因此给几个不一样优先级的队列,根据给定的不一样优先级放入到不一样的队列中,取数据的时候优先取最高优先级的那个队列就好了。

优先级队列和实现方法都有了,那优先级如何断定呢,这就是一个开放性的问题了,方法有不少种,好比,获取到一个待爬取的网页后,看一下这个网站的alax排名,排名高的优先级高,好比前100名的放到最高优先级里面,1000名的放到次优先级队列中,依次类推;又好比,经过本身的分析,若是是详情页面,优先级高,若是是列表类的页面,优先级低,这种在爬取某些特定的网站的时候能够用,好比你爬某些电商的搜索列表页,翻页的连接优先级能够低一点,各个详情页面能够高一点;总之,优先级的这一块和你爬取的实际状况是强相关的,具体如何打分就仁者见仁智者见智了。

总结

这一篇简单的介绍了一下爬虫的知识,爬虫涉及的方面很是广,任何一个小的方向均可以深挖很多,好比代理服务器部分就能够作很多东西出来,另外,如今内容都在各类阿啪啪上,如何优雅的模拟出手机去阿啪啪爬数据也是一个复杂的问题,有时候为了爬取出阿啪啪中的广告信息,还须要模拟出地理位置信息,否则广告出不来,而全部的这些,被爬取人也是知道的,他会用各类办法来防止你爬取他的数据,因此这也是一个斗智斗勇的工程,另外,特别须要注意的是,有些数据是不容许爬取的,好比涉及我的隐私的数据,有版权申明的数据,或者你把你爬取的数据拿出去卖,这些都得考虑法律问题。总之,从纯技术的角度上来讲,爬虫仍是颇有意思也颇有技术深度的,但使用爬虫的时候请想清楚,这些能爬吗?

若是你以为不错,欢迎转发给更多人看到,也欢迎关注个人公众号,主要聊聊搜索,推荐,广告技术,还有瞎扯。。文章会在这里首先发出来:)扫描或者搜索微信号XJJ267或者搜索西加加语言就行

图片描述

相关文章
相关标签/搜索