python工具学习-子域名收集工具

  • A+
所属分类:安全工具


△△△点击上方“蓝字”关注我们了解更多精彩




0x00 Preface [前言/简介]

重点

  该脚本属于python学习使用,工作使用的话,作者本人选择使用在线子域名网站

https://phpinfo.me/domain/

 但是!鲁迅说过:就算你写的是垃圾,你也要去写一遍,才能知道通往优秀作品的路。

 因此过年这段时间,捡起放在床底的python书籍,这是一篇我写满备注,不需要会python都能看懂的代码。

待解决的问题

  大量的访问,以至于会被中断访问,因此收集不全,目前正在寻找解决办法



0x01 需要说一下的代码

思路

  通过搜索引擎搜索该域名,然后将搜索出来的域名进行去重,也就是说我把搜索出来的每一页的信息爬取下来,然后再将其中域名部分提取出来,再去重,重而达到我的收集目的。

 如图,搜索关键词是在上面url里面,我下面的代码,就是将该url拿出来,拼接进入我们想要搜索的页面,并且查看多少页


python工具学习-子域名收集工具

url = "https://cn.bing.com/search?q=site%3a" + site + "&go=Search&qs=ds&first=" + str((int(i) - 1) * 10) + "&FORM=PERE"

 当我们完成一步后,接着将每一个搜索出来的内容进行爬取,读取出域名部分,该部分位于h2标签的a标签的href内,我们提取出来再去重即可。



0x02 __name__解释

 一个很多刚刚学python都会疑惑的问题,写这个有什么用?我不写程序一样能运行。

if __name__ == '__main__':    main()

 无论什么语言,都可以使用导入功能,因此这个方式是为了防止导入后输出错乱,因此这样写。

 首先,__main__和下面的main()没有关系,它代表的就是这个代码文件本身

具体作用

1、当当前代码文件a被别的文件b导入,当b运行的时候,

  不会运行main()

2、当代码文件a直接被运行的时候,

  会运行if__name__==‘__main__’下面的main()



0x03 代码示例(已全部写满注释)

#! /usr/bin/env python# _*_  coding:utf-8 _*_
import requests #请求url相关from bs4 import BeautifulSoup #用于爬取网页中的数据的模块from urllib.parse import urlparse #处理url相关import sysimport time
def bing_search(site,pages): Subdomain = [] #建立一个列表,装子域名 headers = { #伪装一个请求头,这样更真实一些,搜索引擎不会直接断掉搜索 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip,deflate', 'Referer': "https://cn.bing.com/search?q=site%3abaidu.com&qs=n&sp=-1&pq=site%3abaidu.com&sc=0-14&sk=&cvid=8D311FFA33984B8A9E5F0C2F0308C40E&first=1&FORM=PERE", 'Cookie': "MUID=3B16E5BB57DC6D5300C5EACA56F26CF1; MUIDB=3B16E5BB57DC6D5300C5EACA56F26CF1; _EDGE_S=F=1&SID=10751AC54EAB619433FE15B44F856024&mkt=zh-cn; _EDGE_V=1; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=64FD5CC7783F4B1D89298A27EE989D36&dmnchg=1; SRCHUSR=DOB=20201028&T=1603843719000; _SS=SID=10751AC54EAB619433FE15B44F856024&bIm=113; SRCHHPGUSR=CW=1322&CH=670&DPR=1&UTC=-240&DM=1&WTS=63739440510&HV=1603844080&BRW=M&BRH=S; ipv6=hit=1603847309782&t=6" } for i in range(1,int(pages)+1): #多少页就请求多少次 url = "https://cn.bing.com/search?q=site%3a" + site + "&go=Search&qs=ds&first=" + str((int(i) - 1) * 10) + "&FORM=PERE" html = requests.get(url,headers=headers,timeout=5) #进行一次get请求,并且附带headers属性,值就是我们之前设置的headers # print(html) 代码测试,每完成一个功能,都应该输出一下测试代码,下面备注的print都是测试 soup = BeautifulSoup(html.content,'html.parser') # print(soup) #这里使用.content方式保存请求的url,用text的有可能会出现汉字乱码 #content返回的是二进制的数据,需要再解码,text返回的是unicode类型的数据 #BeautifulSoup将html.content的内容解码 格式为soup=beautifulsoup(解析内容,解析器) 常用解析器:html.parser,lxml,xml,html5lib,一般用第一个即可 jobdir = soup.findAll('h2') # print(jobdir) # 将获取到的内容存放到变量中 #利用findall进行标签的筛选,域名存放在H2标签里面, for i in jobdir: # print(i) #测试打印 link= i.a.get('href') # #将h2标签里面的a属性中的href值获取出来 # print(link) #这里测试,当发起大量请求的时候,有很多链接失败的返回来,导致于会报错。解决办法是在上面的请求里面添加一个timeout,另外查到说,改为国内源即可 domain = str(urlparse(link).scheme + "://" + urlparse(link).netloc) #urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接 # print(domain) 进行代码测试 if domain in Subdomain: #进行一下过滤去重 pass else: Subdomain.append(domain) #如果发现的域名不存在subdomain列表中,则添加 print(domain) time.sleep(0.1)if __name__ == '__main__': if len(sys.argv) == 3: site = sys.argv[1] page = sys.argv[2] else: print ("usage: %s baidu.com 10" % sys.argv[0]) #用户输入错误时输出格式提示 sys.exit(-1) Subdomain = bing_search(site, page)



0x04 Summary 总结

写了这个以后,对于三个库requests bs4 urllib更加熟悉,time库使用有点失败,没能成功避开搜索引擎的检测,以至于爬取过程中被断开。

关于子域名收集,之前群里已经有个师傅写过在他的信息收集集成脚本里面,使用的方式和我这个思路是不一样的。

接下来的python工具,写一个socket通信的,大概一个星期后搞完,欢迎再来看。

最后BB一句,md搜索引擎好伤人啊,大量访问怎么了?!难受。。



END



如您有任何投稿、问题、建议、需求、合作、后台留言NOVASEC公众号!


或添加NOVASEC-MOYU 以便于及时回复。

python工具学习-子域名收集工具


感谢大哥们的对NOVASEC的支持点赞和关注

加入我们与萌新一起成长吧!


本团队任何技术及文件仅用于学习分享,请勿用于任何违法活动,感谢大家的支持!!



本文始发于微信公众号(NOVASEC):python工具学习-子域名收集工具

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: