如何用Python编写信息收集之子域名收集脚本
子域名是相对于网站的主域名的。比如百度的主域名为:baidu.com,这是一个顶级域名,而在顶级域名前由 quot;. quot;隔开加上不同的字符,比如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( #39;http://www.baidu.com #39 发起一个GET请求。
好了,补充基础知识,我们来发起一个请求,并获得返回包的内容。
#-*-coding:utf-8-*-
import requests #导入requests库
url= #39;http://www.baidu.com/s?wd=site:qq.com #39; #设定url请求
response=requests.get(url).content #get请求,content是获得返回包正文
print response
返回包的内容实在太多,我们需要找到我们想要的子域名,然后复制出来。
从查看元素我们可以发现,子域名被一段代码包裹着,如下:
>
2.正则表达式——(.*?) 闪亮登场:
正则 规则: >
正则表达式难吗?难。复杂吗?挺复杂的。
然而最简单的正则表达式,我们把想要的数据用(.*?)来表示即可。
re 基本使用-example:
假设我们要从一串字符串 #39;123xxIxx123xxLikexx123xxStudyxx #39;取出ILike Study,我们可以这么写:
eg= #39;123xxIxx123xxLikexx123xxStudyxx #39;
printre.findall( #39;xx(.*?)xx #39;,eg)
#打印结果
[ #39;I #39;, #39;Like #39;, #39;Study #39;]
基于上述例子,依葫芦画瓢也可以获取子域名了。
#-*-coding:utf-8-*-
importrequests#导入requests库
importre#导入re库
url= #39;http://www.baidu.com/s?wd=site:qq.com #39;#设定url请求
response=requests.get(url).content#get请求,content是获得返回包正文
#重点,重点,下面这段代码~
subdomain=re.findall( #39; >
printsubdomain
结果:
[ #39;www.qq.com #39;, #39;chuangshi.qq.com #39;, #39;1314.qq.com #39;, #39;lol.qq.com #39;, #39;tgp.qq.com #39;, #39;open.qq.com #39;, #39;https: #39;, #39;ac.qq.com #39;]
3.翻页的处理
上面获得的子域名,仅仅只是返回结果的第一页内容,如何获取所有页面的结果?
key=qq.com
#为url添加页码:
url= quot;http://www.baidu.com.cn/s?wd=site: quot;+key+ quot; amp;cl=3 amp;pn=0 quot;
url= quot;http://www.baidu.com.cn/s?wd=site: quot;+key+ quot; amp;cl=3 amp;pn=10 quot;
url= quot;http://www.baidu.com.cn/s?wd=site: quot;+key+ quot; amp;cl=3 amp;pn=20 quot;
#pn=0为第一页,pn=10为第2页,pn=20为第3页…
天啊,100页我要写100个url吗?当然不是,循环语句解决你的困扰。
foriinrange(100):#假设有100页
i=i*10
url= quot;http://www.baidu.com.cn/s?wd=site: quot;+key+ quot; amp;cl=3 amp;pn=%s quot;%i
4.重复项太多?想去重?
基础知识:
python的数据类型:set
set持有一系列的元素,但是set的元素没有重复项,且是无序的。
创建set的方式是调用set()并传入一个list,list的元素将作为set的元素。
sites=list(set(sites))#用set实现去重
正则表达式匹配得到的是一个列表list,我们调用set()方法即可实现去重。
5.完整代码 amp; amp;总结
下面是百度搜索引擎爬取子域名的完整代码。
#-*-coding:utf-8-*-
importrequests
importre
key= quot;qq.com quot;
sites=[]
match= #39; >
foriinrange(48):
i=i*10
url= quot;http://www.baidu.com.cn/s?wd=site: quot;+key+ quot; amp;cl=3 amp;pn=%s quot;%i
response=requests.get(url).content
subdomains=re.findall(match,response)
sites+=list(subdomains)
site=list(set(sites))#set()实现去重
printsite
print quot;Thenumberofsitesis%d quot;%len(site)
foriinsite:
printi
结果截图:
0X02 总结其实子域名挖掘就是一个小小的爬虫,只不过我们是用百度的引擎来爬取,不过呢,用bing引擎爬去的数据量会比百度更多,所以建议大家使用bing的引擎,代码的编写方法和百度的大同小异就不放代码了,给个小tip,bing搜索域名用的是domain:qq.com这个的语法哦。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/54679.html
python相关文章
- 如何为pycharm配置Python解释器_pycharm选择python解释器
- Python多线程通信_python socket多线程
- Python入门系列(六)一篇学会python函数
- python中dtype什么意思_NumPy Python中的数据类型对象(dtype)
- python 匹配文本全角转半角字符「建议收藏」
- Python实现索伯尔算子[通俗易懂]
- 怎么将python代码编译_python怎么编译运行
- Python数组切片_python print数组
- Python 反转字符串_python输出字符串
- python抛出异常写法_零基础学 Python(32):如何抛出和捕获异常?「建议收藏」
- 5分钟NLP:Python文本生成的Beam Search解码
- Python使用platform库获取系统信息:操作系统信息、硬件信息、python环境信息
- Python将byte数组转换为int详解编程语言
- 一步步学习:利用Python连接MySQL数据库(python连接mysql数据库)
- Python如何连接PostgreSQL数据库?(python连接postgresql)
- Python轻松连接SQL Server数据库(python连接sqlserver)
- Python实现Oracle数据库连接(python连接oracle数据库)
- 下的应用玩转Python:Linux下的Python应用之旅(python在linux)
- 在Python中简单调用MySQL(python调用mysql)
- Python如何连接MySQL数据库(python怎么连接mysql数据库)
- Python脚本实现Linux命令快捷控制(python执行linux命令)
- Linux下运行Python脚本的步骤简介(linux如何运行python脚本)
- python读取csv文件示例(python操作csv)