危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18982269

Python实现抓取网站子域名

有时候需要获取某个网站的子域名,在检测一些大站的时候常会用到。以前找某个网站的子域名我用的方法是在网站内和链接处找,偶尔也会用到google。后来听朋友乔三少说bt5下有个获取子域名的小工具,没怎么在意。有一天要获取某个网站的子域名了,就问他要程序名字,结果他一时想不起来了。。。然后他说有个在线查询的网站,把网址发给了我。要查询某个网站的子域名,在“domain”右面的输入框中输入网站的域名,然后点“Query”按钮就可以列出该网站的子域名了。来查询下百度的子域名。百度不愧是大站,有N多子域名,目测至少有几百个。

通过网站就可以查询某个网站有哪些子域名,真是太方便了。能不能更方便一点做个本地查询工具呢?在本地运行一下程序就可以获得某个网站的子域名,结果是提取的是subdomain.php的查询结果。当然,还有安全性的考虑,如果直接去网站查询,如果网站被人挂了马,没打补丁的话就悲剧了。本地查询的话就可以避免这个风险。

考虑用我会点的Python来实现。大体思路是通过Python发送数据包模拟在网站上的查询,获取查询结果页面的源代码,用正则匹配源代码中的子域名,最后输出结果。

可以看到查询的过程就是向subdomain.php以POST方式提交数据,其中百度就是我们查询的域名。

需要以POST方式提交数据,我用的方法是urllib模块中的urlopen()函数,函数原型为:

urlopen(url, data=None, proxies=None)

其中url就是提交数据到哪里的具体地址,data就是以POST方式提交数据时提交的具体数据。默认情况下是以GET方式提交数据,所以默认情况下只有url一个参数。经过测试,subdomain.php以POST方式提交数据时也会返回查询到的子域名,如果把要查询的域名定义为一个变量domainname,要提交的数据定义为变量postdata,则POST提交的数据为:

postdata='domain='+ domainname

经过危险漫步测试,从返回的网页源码中提取查询到的子域名的正则表达式。

特别说明一下,程序的说明部分参考了他人写的某个python程序中说明部分的写法,在此感谢和说明。

把代码保存为文件getsubdomain.py,放到了C盘根目录下。按“Win"r键加R调出“运行”窗口,输入cmd后回车,打开命令行窗口。输人命令“cd\”,回车,切换到C盘根目录下,输入命令“pythongetsubdomain.py”,回车后就可以看到的程序说明了。因为我已经把python.exe所在的目录加进了系统环境变量中,所以不需要输入python.exe所在的目录,你如果没把python.exe所在的目录加进系统环境变量中,可能需要输入python.exe所在的具体目录或把文件getsubdomain.py放到文件python.exe同目录下。

小程序的使用方法的格式为:

python getsubdomain,py-d[domainl-o[filename]

其中-d足必选参数,domain对应的是要查询子域名的网站的域名;-o是可选参数,你可以把查询到的结果保存到文件,filename是保存文件时的文件名。当然默认情况下是只在屏幕上打印查询到的结果,不把结果保存到文件。

来测试下程序是否可用,还是来查询下百度的子域名。输入命令,回车后,查询出了850个子域名,真够多的。

和网页上的查询结果相比,我做了点小改进:

1.统计了总共查询出了多少个子域名。

2.对查询到的子域名输出的时候左对齐,美观了一点。

3.给每个查询到的子域名一个编号,检测子域名的时候不容易重复检测或漏检。

如果查询出的结果太多,前面的结果在命令窗口中会看不到,只能看到第554个及以后的结果。

这时候如果要查看全部结果,可以把结果输出到文件,比如我想把结果保存到当前目录下的文件baidu.txt中,则输入命令。

回车后在当前目录(C:\)下生成了文件baidu.txt。打开baidu.txt,就可以看到查询到的所有子域名了。

再来查询下网易的子域名,在命令行下输惹命令。查询出的子域名真多,居然有2943个(当然,里面有不少个人博客的子域名)!

看来小程序功能正常。

写的这个Python小程序就是抓取网站查询子域名的结果,代码写的很烂,有写错或更好的写法欢迎到危险漫步的微博或黑客内参HackNc的官方论坛与我交流。

相关推荐