如何⽤Python编写信息收集之⼦域名收集脚本
0×00 前⾔
任务:
使⽤脚本借助搜索引擎搜集⽹站⼦域名信息。
准备⼯具:
python安装包、pip、http请求库:requests库、正则库:re库。
⼦域名是相对于⽹站的主域名的。⽐如百度的主域名为:baidu,这是⼀个顶级域名,⽽在顶级域名前由".";隔开加上不同的字符,⽐如zhidao.baidu,那么这就是⼀个⼆级域名,同理,继续扩展主域名的主机名,如club.user.baidu,这就是⼀个三级域名,依次类推。
0X00 正⽂
⼿动收集⼦域名是怎样的⼀种过程?
举个例⼦,⽐如我们要收集qq这个主域名,在百度搜索引擎能够搜索到的所有⼦域名。
⾸先,使⽤搜索域名的语法搜索~
搜索域名语法:site:qq
然后,在搜索结果中存在我们要的⼦域名信息,我们可以右键,查看元素,复制出来。
如何⽤python替代⼿⼯的繁琐操作?
其实就是将⼿⼯收集⽤代码来实现⾃动化,⼿⼯收集的步骤:
收集器制作开始:
1.发起⼀个搜索的http请求
请求我们使⽤python的第三⽅http库,requests
需要额外安装,可以使⽤pip进⾏安装pipinstallrequests
requests基本使⽤-example:
help(requests)查看requests的帮助⼿册。
dir(requests)查看requests这个对象的所有属性和⽅法。
好了,补充基础知识,我们来发起⼀个请求,并获得返回包的内容。
#-*-coding:utf-8-*-
import requests    #导⼊requests库
(url).content  #get请求,content是获得返回包正⽂
print response
返回包的内容实在太多,我们需要到我们想要的⼦域名,然后复制出来。
从查看元素我们可以发现,⼦域名被⼀段代码包裹着,如下:
>chuangshi.qq/ </a>
2.正则表达式——(.*?) 闪亮登场:python正则表达式爬虫
正则规则:style=”text-decoration:none;”>(.*?)/
正则表达式难吗?难。复杂吗?挺复杂的。
然⽽最简单的正则表达式,我们把想要的数据⽤(.*?)来表⽰即可。
re 基本使⽤-example:
假设我们要从⼀串字符串'123xxIxx123xxLikexx123xxStudyxx';取出ILike Study,我们可以这么写:
eg='123xxIxx123xxLikexx123xxStudyxx'
printre.findall('xx(.*?)xx',eg)
#打印结果
['I','Like','Study']
基于上述例⼦,依葫芦画瓢也可以获取⼦域名了。
#-*-coding:utf-8-*-
importrequests#导⼊requests库
importre#导⼊re库
(url).content#get请求,content是获得返回包正⽂
#重点,重点,下⾯这段代码~
subdomain=re.findall('>(.*?)/',response)
printsubdomain
结果:
[';,'chuangshi.qq','1314.qq','lol.qq','tgp.qq','open.qq','https:','ac.qq']  3.翻页的处理
上⾯获得的⼦域名,仅仅只是返回结果的第⼀页内容,如何获取所有页⾯的结果?
key=qq
#为url添加页码:
#pn=0为第⼀页,pn=10为第2页,pn=20为第3页…
天啊,100页我要写100个url吗?当然不是,循环语句解决你的困扰。
foriinrange(100):#假设有100页
i=i*10
4.重复项太多?想去重?
基础知识:
python的数据类型:set
set持有⼀系列的元素,但是set的元素没有重复项,且是⽆序的。
创建set的⽅式是调⽤set()并传⼊⼀个list,list的元素将作为set的元素。
sites=list(set(sites))#⽤set实现去重
正则表达式匹配得到的是⼀个列表list,我们调⽤set()⽅法即可实现去重。
5.完整代码&&;总结
下⾯是百度搜索引擎爬取⼦域名的完整代码。
#-*-coding:utf-8-*-
importrequests
importre
key="qq"
sites=[]
match='>(.*?)/'
foriinrange(48):
i=i*10
(url).content
subdomains=re.findall(match,response)
sites+=list(subdomains)
site=list(set(sites))#set()实现去重
printsite
print"Thenumberofsitesis%d"%len(site)
foriinsite:
printi
结果截图:
0X02 总结
其实⼦域名挖掘就是⼀个⼩⼩的爬⾍,只不过我们是⽤百度的引擎来爬取,不过呢,⽤bing引擎爬去的数据量会⽐百度更多,所以建议⼤家使⽤bing的引擎,代码的编写⽅法和
百度的⼤同⼩异就不放代码了,给个⼩tip,bing搜索域名⽤的是domain:qq这个的语法哦。
* 参考来源:,淼淼兮与怀编译,转载注明来⾃FreeBuf.COM