当前位置: 首页 > 科技观察

如何用Python写一个子域名收集脚本进行信息收集?

时间:2023-03-16 20:52:55 科技观察

0×00前言任务:借助搜索引擎,使用脚本收集网站子域名信息。准备工具:python安装包、pip、http请求库:requests库,正则库:re库。子域名是相对于网站的主域名而言的。比如百度的主域名是:baidu.com,是一个***域名,***域名前用“.”隔开。加上不同的字符,比如zhidao.baidu.com,那么这是一个二级域名,同理,继续扩展主域名的主机名,比如club.user.baidu.com,这是一个三级域名级域名等。0X00手动收集子域名的过程是怎样的?举个例子,比如我们要收集主域名qq.com,以及百度搜索引擎可以搜索到的所有子域名。首先,使用域名搜索语法进行搜索~搜索域名语法:site:qq.com然后,搜索结果中有我们要的子域名信息,我们可以右键,查看元素,复制出来。如何用python代替人工繁琐的操作?其实就是用代码把手工采集自动化。手动采集步骤:开始采集器制作:1.发起一个搜索httprequestrequest我们使用python的第三方http库,requests需要额外安装,可以使用pip安装pipinstallrequestsrequests基本使用-示例:help(requests)查看请求的帮助手册。dir(requests)查看requests对象的所有属性和方法。requests.get('http://www.baidu.com'发起GET请求,嗯,补充一下基础知识,我们发起一个请求,获取返回包的内容。#-*-coding:utf-8-*-importrequests#导入请求库url='http://www.baidu.com/s?wd=site:qq.com'#设置url请求response=requests.get(url).content#getrequest,content是获取返回包textprintresponse返回包的内容太多了,我们需要找到我们想要的子域名,然后复制出来。查看元素可以发现,子域名被一段代码包裹起来,如下:style="text-decoration:none;">chuangshi.qq.com/2、正则表达式——(.*?)登场:正则规则:style=”text-decoration:none;”>(.*?)/正则表达式难吗?灾难。复杂吗?相当复杂。但是,对于最简单的正则表达式,我们可以使用(.*?)来表示想要的数据。reBasicuse-example:假设我们想从一串字符串'123xxIxx123xxLikexx123xxStudyxx'中提取ILikeStudy,我们可以这样写:eg='123xxIxx123xxLikexx123xxStudyxx'printre.findall('xx(.*?)xx',eg)#Printresults['I','Like','Study']基于上面的例子,根据HuluScoop也可以获取子域名。#-*-coding:utf-8-*-importrequests#导入请求库importre#导入re库url='http://www.baidu.com/s?wd=site:qq.com'#设置url请求响应=requests.get(url).content#getrequest,content是获取返回包text#重点,重点,代码如下~subdomain=re.findall('style="text-decoration:none;">(.*?)/',response)printsubdomainresult:['www.qq.com','chuangshi.qq.com','1314.qq.com','lol.qq.com','tgp.qq.com','open.qq.com','https:','ac.qq.com']3.上面获取的子域名只是返回结果的***页面的内容,如何获取所有页面的结果?key=qq.com#在url中添加页码:url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=0"url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=10"url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=20"#pn=0是***page,pn=10forpage2,pn=20forpage3...天哪,100页一定要写100个url吗?当然不是,循环语句解决你的问题foriinrange(100):#假设有100页i=i*10url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=%s"%i4.太多重复?想变重吗?基础知识:Python的数据类型:setset保存了一系列的元素,但是set的元素没有重复且无序。创建集合的方法是调用set()并传入一个列表,列表中的元素将作为集合的元素。sites=list(set(sites))#利用set实现去重正则表达式匹配得到一个list列表,我们调用set()方法来实现去重。5.完整代码&&总结下面是百度搜索引擎抓取子域名的完整代码。#-*-coding:utf-8-*-importrequestsimportrekey="qq.com"sites=[]match='style="text-decoration:none;">(.*?)/'foriinrange(48):i=i*10url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=%s"%iresponse=requests.get(url).contentsubdomains=re.findall(match,response)sites+=list(subdomains)site=list(set(sites))#set()实现去重printsiteprint"Thenumberofsitesis%d";%len(site)foriinsite:printi结果截图:0X02总结其实,子域挖掘是一个小型爬虫,但是我们使用百度的引擎来爬取,但是bing引擎爬取的数据量会比百度有更多,所以我建议你使用bing引擎。代码编写方法类似百度的,代码就不放了,这里有个小提示,Bing是用domain:qq.com的语法来搜索域名的。