网络爬虫初探
网络爬虫通过遍历网页的节点,把网页中的内容抓取下来。
网络的结构
将一个页面比作是一个节点,将URL看作是一个从原网页指向目标页面的有向边。因此一个url下的网络接口可以看做是从一个源节点出发,形成的有限或无限的有向图。爬虫就是负责遍历这些节点,将每个节点中的网页内容保存到本地。
简单深度优先遍历
深度优先就是优先遍历子页面,当当前页面没有子页面是才返回,遍历第二个子页面。一般需要维护一个栈,保存访问的路径。将栈顶页面的第一个未访问的子页面添加到栈中。当栈顶不存在未访问的子页面时,将它退栈,继续访问新栈顶页面未访问的子页面。
这种遍历方式容易造成爬虫在一条过长的路径上浪费过多的时间。
简单宽度优先搜索
爬虫优先遍历当前节点的所有子页面。这需要维护一个队列操作,首先抓取队列中所有url的页面内容,然后依次将队首的url中的子页面url添加到队尾,然后将此url出队,直到所有已访问的url全部出队。这种遍历方式的弊端显而易见,即抓取数据量随着层数的增加呈指数级别增加。
带偏好的宽度优先策略
与当前页面相关度大的连接往往与当前页面的距离越近,因此采用宽度优先可以更集中的获得有意义的页面。但是广告以及一些与页面无关的连接会白白增大抓取工作的工作量。因此我么需要为所有连接建立一种评估机制,优先抓取一些等级高的页面,将一些优先级低的页面放在后面抓取甚至是不抓取。
1. 大站优先策略
维护一个优先级队列,对队列中的所有url按照其所包含的子页面数量进行排序,数量高的放在前面。
2. 反向链接数策略
优先遍历队列中指向它的链接数多的页面。这只又在拥有十分庞大的页面数据时才可以使用(吧)
3. 网页排名
为每个网页赋予一定的重要性数值。当存在从A指向B的连接时,则将A的重要性分摊给B一部分。这样,外部链接多的页面,以及无关连接少的页面,得分会比较高。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。