网上能搜到很多引擎蜘蛛的地址,这些地址不全而且好多已经过期了。如果想自己搜集蜘蛛的IP,最好的方法是分析网站的日志,即快又准确,但是不够全。如果有时间和资源,可以用本文的笨方法来抓取所有蜘蛛IP。原理是大多数的搜索引擎蜘蛛的ip都做了IP反解析,可以在linux下用host或者nslookup命令反查,先看几个例子

  1. 谷歌蜘蛛

    [root@nixops.me ~]# host 66.249.79.161
    161.79.249.66.in-addr.arpa domain name pointer crawl-66-249-79-161.googlebot.com.

  2. 百度蜘蛛

    [root@nixops.me ~]# host 220.181.108.170
    170.108.181.220.in-addr.arpa domain name pointer baiduspider-220-181-108-170.crawl.baidu.com.

  3. 搜狗蜘蛛

    [root@nixops.me ~]# host 106.120.173.147
    147.173.120.106.in-addr.arpa domain name pointer sogouspider-106-120-173-147.crawl.sogou.com.

  4. msn/bing

    [root@FreeBSD ~]# host 40.77.167.134
    134.167.77.40.in-addr.arpa domain name pointer msnbot-40-77-167-134.search.msn.com.

  5. yandex

    [root@FreeBSD ~]# host 141.8.142.56
    56.142.8.141.in-addr.arpa domain name pointer spider-141-8-142-56.yandex.com.

  6. yahoo

    [root@FreeBSD ~]# host 68.180.229.117
    117.229.180.68.in-addr.arpa domain name pointer b115329.yse.yahoo.net.
    以上这些搜索引擎蜘蛛IP都可以反查,也有部分搜索引擎是不支持反查的,如: YisouSpider和360,但360有提供蜘蛛IP地址,知道原理了,就可以写shell脚本来反查了,不多说直接上脚本

    #!/usr/bin/env bash

    # google dns, opendns,Comodo Secure DNS,level 3 dns,Verisign dns, 114 dns , alidns,baidu dns,dnspod dns,cnnic dns
    dns=(8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 8.26.56.26 8.20.247.20 4.2.2.1 4.2.2.2 64.6.64.6 64.6.65.6 114.114.114.114 114.114.115.115 223.5.5.5 223.6.6.6 180.76.76.76 119.29.29.29 182.254.116.116 1.2.4.8 210.2.4.8)
    result=/root/spider.txt

    function rand(){
    # min=$1
    # max=$(($2-$min+1))
    # num=$(cat /dev/urandom | head -n 10 | cksum | awk -F ' ' '{print $1}')
    # echo $(($num%$max+$min))
    expr $RANDOM % 19 + 1 # 共19台dns,产生1-19随机数
    }

    function cmd(){
    # rnd=$(rand 0 18)

     rnd=$(rand)
     dns=${dns[$rnd]} 
     timeout 1 host $1 $dns 

    }

    tmp_fifofile="/tmp/$$.fifo"
    mkfifo $tmp_fifofile # 新建fifo
    exec 6<>$tmp_fifofile # 将fifo文件的输入输出重定向到文件描述符6
    rm $tmp_fifofile

    thread=80 # 定义开启的线程数
    for ((i=0;i<$thread;i++));do

     echo

    done >&6 # 向fd6中写入$thread个空行

    for ((a=1;a<254;a++))
    do
    for ((b=0;b<254;b++))

        do
       for ((c=0;c<254;c++))
            do
           for ((d=1;d<254;d++))
             do
             read -u6  #从文件描述符6读取空行
              {
              cmd $a.$b.$c.$d |grep -i -E 'baidu|google|msn|yahoo|sogou|yandex|bot|spider' >> $result
               echo >&6  #补充用掉的回车符,保持线程数
                  } &       #每读取一个空行,将程序放入后台执行
             done
         done
         echo >&6    #每跑完一个C段在补充一次,防止因产生僵尸进程导致线程越来越少
     done

    done

    wait # 等待所有的后台子进程结束
    exec 6>&- # 关闭fd6
    exit 0

整个IPv4的地址实在太多了,如果单线程执行可能几年都执行不完,我这里开启了80个线程,跑完一个A段也大概要5天,如果机器配置够高可以在多开一些线程,能快一些,本脚本有几个缺点:

  1. bash只能用这种方法间接实现多线程,容易产生僵尸进程
  2. 虽然用多台dns轮询还是效率太低,查询太慢
  3. 网络占用比较小,但占用CPU资源比较高

综上,这个脚本玩玩就行了,如果真想反查还是用其它语言写吧