zoukankan      html  css  js  c++  java
  • 爬虫那些事儿-- 简介

       从事爬虫相关的工作已经两年多了。简要做下总结。

    爬虫(Crawler),有些也叫蜘蛛(Spider),用来从互联网下载网页。是搜索引擎的重要组成。爬虫是搜索引擎的数据来源,是数据的入口。爬虫的基本思想是认为整个互联网类似于一个交错的蜘蛛网。在互联网中每个网页都可以通过url访问。任何一个网页都会被互联网中的其他一些网页所指向(即其他页面中包含该页面的url链接)。而几乎每个网页都存在一些指向其他网页的链接。我们可以通过初始的若干URL开始,获取这些URL,并从这些URL对应的网页中发现新的URL,然后获取新的URL对应的页面,通过不断的执行该过程,可以遍历整个互联网(即发现互联网上所有的URL并获取所有的页面)。虽然对于庞大的互联网来说,访问互联网上全部的url是不现实的。但是该理论指引了我们爬虫的工作。爬虫可以基于该理论工作,从而获取互联网上绝大多数我们希望获取的url。

    在实际的工作中,爬虫中需要考虑的主要问题如下

    • 爬取哪个页面的选择策略:

    互联网可谓是世界上最大的“垃圾场”,互联网上的网页繁多,每日互联网上都产生上百亿的新增页面。我们按照100亿的网页,每个页面20KB来计算,100亿的网页约为200TB的大小。抓取这些数据需要的网络带宽为200*1000GB/86400 = 2.3GB,即至少需要18Gbps的网络带宽。因此想要全部抓取是不可能的。就需要有选择的抓取。而选择那些页面进行抓取就是首先需要考虑的一个问题。这里一般主要考虑的问题就是如何选择优质的页面去爬虫以及如何尽量避免重复爬取。

    • 检测页面变化的重访策略:

    搜索引擎会对爬虫爬取的网页建索引,然后用户就可以使用搜索引擎检索所需的内容从而获取到对应网页的URL。而由于互联网是动态的,互联网中的网页是变化的。所谓的页面变化主要分为两种,更新和删除。更新是指页面的内容改变了,即url还在,而对应的网页的内容改变了。删除是指url对应的网页已经无效了。即不存在了(即称之为死链)。因此,爬虫就需要感知网页的变化。而感知网页变化的途径就是通过对网页进行重访。通过上面的介绍我们知道由于不可能访问互联网全部的网页,因此爬虫的爬取资源是有限而珍贵的。把所有已经爬取的页面都拿去不断的重访来判断变化是一种明显的浪费。因此我们就需要设计我们的重访策略。所谓的重访策略包括选择那些页面去重访以及间隔多久去重访两部分的问题。

    • 避免站点压力过大的礼貌策略

    由于网页站点的服务器主要目的是提供用户访问的。而站点的服务器受限于机器的配置和网络资源,能容忍的访问频次是有限的。当访问较频繁时,则会造成服务器压力过大,从而无法响应请求。轻则影响正常用户的访问,重则可能导致web服务器的瘫痪。因此,为了能获取站点的数据又尽量造成对服务器的压力。爬虫爬取站点数据时需要礼貌的访问,即以站点可以接受的频次来访问站点数据。同时在现实中,一些服务器为了避免爬虫的频繁访问会设置一些限制,当爬虫访问的频次超过其设置时,有些通过采取弹窗输入验证码来区分人为行为和爬虫(目前的大部分爬虫还不能做到像人那样识别弹出窗口的验证码并输入)。有些则拒绝爬虫的响应(针对爬虫的访问返回404,503等返回码)。遇到这样的情况爬虫都无法正常的获取到所需的内容。同时由于不同的站点站点规模不同、用户访问量不同,使用的机器配置不同,其容忍的访问频次和设定的访问频次不尽相同,而站点不会主动对爬虫提供自己能容忍的站点压力,因此对爬虫来说,避免站点压力过大的礼貌策略是一个较大的难题。

    • 分布式抓取协作的并行策略

    由于互联网网页数据是海量的。即使只抓取其中的部分,需要抓取的网页也是较多的。此时通过单台机器完成网页的抓取是不太可能的。互联网网页的平均大小为20KB左右。一个100Mbps的带宽一天能抓取的网页数约为

    100*1000/20*86400 = 54000000。多机器的分布式抓取协作是一种必然的模式。因此需要处理分布式抓取的并行问题。

    refer:http://en.wikipedia.org/wiki/Web_crawler

  • 相关阅读:
    Netty事件监听和处理(上)
    Netty事件监听和处理(上)
    Netty事件监听和处理(上)
    nginx 反向代理转发导致css,js,图片失效
    nginx 反向代理转发导致css,js,图片失效
    nginx 反向代理转发导致css,js,图片失效
    【leetcode】507.Perfect Number
    【leetcode】507.Perfect Number
    【leetcode】507.Perfect Number
    Javascript中的类实现
  • 原文地址:https://www.cnblogs.com/lovemdx/p/3189828.html
Copyright © 2011-2022 走看看