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

  1. 谷歌蜘蛛

    
    [root@52os.net ~]# host 66.249.79.161 
    161.79.249.66.in-addr.arpa domain name pointer crawl-66-249-79-161.googlebot.com.
  2. 百度蜘蛛

    [root@52os.net ~]# 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@52os.net ~]# 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资源比较高

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