Python中国社区  »  Python

如何用Python编写信息收集之子域名收集脚本

黑白之道 • 1 周前 • 33 次点击  


0×00 前言


任务:


使用脚本借助搜索引擎搜集网站子域名信息。


准备工具:


python安装包、pip、http请求库:requests库、正则库:re库。


子域名是相对于网站的主域名的。比如百度的主域名为:baidu.com,这是一个顶级域名,而在顶级域名前由"."隔开加上不同的字符,比如zhidao.baidu.com,那么这就是一个二级域名,同理,继续扩展主域名的主机名,如club.user.baidu.com,这就是一个三级域名,依次类推。


0X00 正文


手动收集子域名是怎样的一种过程?


举个例子,比如我们要收集qq.com这个主域名,在百度搜索引擎能够搜索到的所有子域名。


首先,使用搜索域名的语法搜索~


搜索域名语法:site:qq.com


然后,在搜索结果中存在我们要的子域名信息,我们可以右键,查看元素,复制出来。



如何用python替代手工的繁琐操作?


其实就是将手工收集用代码来实现自动化,手工收集的步骤:



收集器制作开始:


1.发起一个搜索的http请求


请求我们使用python的第三方http库,requests


需要额外安装,可以使用pip进行安装pipinstallrequests


requests基本使用-example:


help(requests)查看requests的帮助手册。


dir(requests)查看requests这个对象的所有属性和方法。


requests.get('http://www.baidu.com' 发起一个GET请求。


好了,补充基础知识,我们来发起一个请求,并获得返回包的内容。


#-*-coding:utf-8-*-

import requests     #导入requests库

url='http://www.baidu.com/s?wd=site:qq.com' #设定url请求

response=requests.get(url).content  #get请求,content是获得返回包正文

print response


返回包的内容实在太多,我们需要找到我们想要的子域名,然后复制出来。


从查看元素我们可以发现,子域名被一段代码包裹着,如下:


style="text-decoration:none;">chuangshi.qq.com/


2.正则表达式——(.*?) 闪亮登场:


正则 规则: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='http://www.baidu.com/s?wd=site:qq.com'#设定url请求

response=requests.get(url).content#get请求,content是获得返回包正文

#重点,重点,下面这段代码~

subdomain=re.findall('style="text-decoration:none;">(.*?)/',response)

printsubdomain

结果:

['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为第一页,pn=10为第2页,pn=20为第3页…


天啊,100页我要写100个url吗?当然不是,循环语句解决你的困扰。


foriinrange(100):#假设有100页

i=i*10

url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=%s"%i


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.com"

sites=[]

match='style="text-decoration:none;">(.*?)/'

foriinrange(48):

i=i*10

url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=%s"%i

response=requests.get(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.com这个的语法哦。


文章出处:FreeBuf

你会喜欢


网卡厂商自动识别工具(Python版, 附源代码)

多功能Python键盘记录工具:Radium

Python编写的开源Struts2全版本漏洞检测工具



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/fMhJZpDmLP
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4429
 
33 次点击  
分享到微博
分享
社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
WEB开发
linux   Bootstrap   IE   NGINX   js   MQ   其他Web框架   peewee   web工具   Jquery   zookeeper   MongoDB   tornado   Git   Redis   NoSql   bottle   DATABASE  
机器学习
机器学习算法  
Python88.com
公告   社区推广   反馈