用shell脚本反查搜索引擎蜘蛛IP
网上能搜到很多引擎蜘蛛的地址,这些地址不全而且好多已经过期了。如果想自己搜集蜘蛛的IP,最好的方法是分析网站的日志,即快又准确,但是不够全。如果有时间和资源,可以用本文的笨方法来抓取所有蜘蛛IP。原理是大多数的搜索引擎蜘蛛的ip都做了IP反解析,可以在linux下用host或者nslookup命令反查,先看几个例子
谷歌蜘蛛
[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.百度蜘蛛
[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.搜狗蜘蛛
[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.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.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.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.txtfunction 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_fifofilethread=80 # 定义开启的线程数
for ((i=0;i<$thread;i++));doecho
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天,如果机器配置够高可以在多开一些线程,能快一些,本脚本有几个缺点:
- bash只能用这种方法间接实现多线程,容易产生僵尸进程
- 虽然用多台dns轮询还是效率太低,查询太慢
- 网络占用比较小,但占用CPU资源比较高
综上,这个脚本玩玩就行了,如果真想反查还是用其它语言写吧