中国领先的IT技术网站
|
|

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

本文使用Python脚本借助搜索引擎搜集网站子域名信息。其实子域名挖掘就是一个小小的爬虫,只不过我们是用百度的引擎来爬取。

作者:淼淼兮与怀来源:36大数据|2017-12-05 10:40

开发者大赛路演 | 12月16日,技术创新,北京不见不散


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

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&#39

发起一个GET请求。

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

  1. #-*-coding:utf-8-*- 
  2.  
  3. import requests     #导入requests库 
  4.  
  5. url='http://www.baidu.com/s?wd=site:qq.com' #设定url请求 
  6.  
  7. response=requests.get(url).content  #get请求,content是获得返回包正文 
  8.  
  9. print response 

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

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

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

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

正则 规则:style=”text-decoration:none;”>(.*?)/

正则表达式难吗?难。复杂吗?挺复杂的。

然而最简单的正则表达式,我们把想要的数据用(.*?)来表示即可。

re 基本使用-example:

假设我们要从一串字符串'123xxIxx123xxLikexx123xxStudyxx'取出ILike Study,我们可以这么写:

  1. eg='123xxIxx123xxLikexx123xxStudyxx' 
  2.  
  3. printre.findall('xx(.*?)xx',eg) 
  4.  
  5. #打印结果 
  6.  
  7. ['I','Like','Study'] 

基于上述例子,依葫芦画瓢也可以获取子域名了。

  1. #-*-coding:utf-8-*- 
  2.  
  3. importrequests#导入requests库 
  4.  
  5. importre#导入re库 
  6.  
  7. url='http://www.baidu.com/s?wd=site:qq.com'#设定url请求 
  8.  
  9. response=requests.get(url).content#get请求,content是获得返回包正文 
  10.  
  11. #重点,重点,下面这段代码~ 
  12.  
  13. subdomain=re.findall('style="text-decoration:none;">(.*?)/',response) 
  14.  
  15. printsubdomain  

结果:

  1. ['www.qq.com','chuangshi.qq.com','1314.qq.com','lol.qq.com','tgp.qq.com','open.qq.com','https:','ac.qq.com'] 

3.翻页的处理

上面获得的子域名,仅仅只是返回结果的第一页内容,如何获取所有页面的结果?

  1. key=qq.com 
  2.  
  3. #为url添加页码: 
  4.  
  5. url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=0" 
  6.  
  7. url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=10" 
  8.  
  9. url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=20" 
  10.  
  11. #pn=0为第一页,pn=10为第2页,pn=20为第3页… 

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

  1. foriinrange(100):#假设有100页 
  2.  
  3. i=i*10 
  4.  
  5. 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.完整代码&&总结

下面是百度搜索引擎爬取子域名的完整代码。

  1. #-*-coding:utf-8-*- 
  2.  
  3. importrequests 
  4.  
  5. importre 
  6.  
  7. key="qq.com" 
  8.  
  9. sites=[] 
  10.  
  11. match='style="text-decoration:none;">(.*?)/' 
  12.  
  13. foriinrange(48): 
  14.  
  15. i=i*10 
  16.  
  17. url="http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=%s"%i 
  18.  
  19. response=requests.get(url).content 
  20.  
  21. subdomains=re.findall(match,response) 
  22.  
  23. sites+=list(subdomains) 
  24.  
  25. site=list(set(sites))#set()实现去重 
  26.  
  27. printsite 
  28.  
  29. print"Thenumberofsitesis%d"%len(site) 
  30.  
  31. foriinsite: 
  32.  
  33. printi 

结果截图:

0X02 总结

其实子域名挖掘就是一个小小的爬虫,只不过我们是用百度的引擎来爬取,不过呢,用bing引擎爬去的数据量会比百度更多,所以建议大家使用bing的引擎,代码的编写方法和百度的大同小异就不放代码了,给个小tip,bing搜索域名用的是domain:qq.com这个的语法哦。

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

C#高级编程(第4版)

C#经典名著!2006年最受读者喜爱的十大技术开发类图书!也是Wrox红皮书中最畅销的品种之一,从第一版开始就名满天下;其第3版被中华读书报...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊