用户
搜索
  • TA的每日心情
    开心
    2016-10-30 16:15
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看

    i春秋-见习白帽

    Rank: 3Rank: 3

    23

    主题

    38

    帖子

    254

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2016-6-6
    发表于 2017-11-21 10:03:08 2919100
    本期任务:使用脚本借助搜索引擎搜集网站子域名信息。
    准备工具:python安装包、pip、http请求库:requests库、正则库:re库。


    问题引入:

    1. 何为子域名?

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

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

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

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

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

    00.webp.jpg


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

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

    01.webp.jpg


    收集器制作开始:

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

    请求我们使用python的第三方http库,requests
    需要额外安装,可以使用pip进行安装 pip install requests
    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/ </a>

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

    正则 规则:style=”text-decoration:none;”>(.*?)/
    正则表达式难吗?难。复杂吗?挺复杂的。
    然而最简单的正则表达式,我们把想要的数据用(.*?)来表示即可。

    re 基本使用-example:
    假设我们要从一串字符串'123xxIxx123xxLikexx123xxStudyxx'取出ILike Study,我们可以这么写:
    eg='123xxIxx123xxLikexx123xxStudyxx'
    print re.findall('xx(.*?)xx',eg)

    #打印结果
    ['I', 'Like', 'Study']

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

    #-*-coding:utf-8-*-
    import requests     #导入requests库
    import re           #导入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)
    print subdomain

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

    3. 翻页的处理

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


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

    for i in range(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-*-
    import requests
    import re
    key="qq.com"
    sites=[]
    match='style="text-decoration:none;">(.*?)/'
    for i in range(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()实现去重
    print site
    print "The number of sites is %d"%len(site)
    for i in site:         
       print i

    结果截图:

    截图.webp.jpg


    小小心得:

    其实子域名挖掘就是一个小小的爬虫,只不过我们是用百度的引擎来爬取,不过呢,用bing引擎爬去的数据量会比百度更多,所以建议大家使用bing的引擎,代码的编写方法和百度的大同小异就不放代码了,给个小tip,bing搜索域名用的是domain:qq.com这个的语法哦,好了,本期的手把手教你制作信息收集器就介绍到这里,我们下期见,关于bing的脚本就请有需要的同学留言吧~

    文章下载地址链接:http://pan.baidu.com/s/1dFLEAdz

    密码:
    游客,如果您要查看本帖隐藏内容请回复



    640.webp.jpg


    发表于 2017-11-23 19:33:42
    [Python] 纯文本查看 复制代码
    #-*-coding:utf-8-*-
    
    import requests
    import re
    key="qq.com"
    sites=[]
    match='style="text-decoration:none;">(.*?)/'
    for i in range(48):
        i=i*10
        url="[url]http://www.baidu.com.cn/s?wd=site:"+key+"&cl=3&pn=%s"%i[/url]
        response=requests.get(url).content
        subdomains=re.findall(match,response)
        sites += list(subdomains)
    site=list(set(sites)) #set()实现去重
    print site
    print "The number of site is %d"%len(site)
    for i in site:
        print i

    使用道具 举报 回复
    发表于 2017-11-23 12:45:54
    还有一种是通过字典的形式,枚举,然后询问DNS服务器是否存在。目前大部分的都是这类的。
    使用道具 举报 回复
    6666666666666666666666666666666666
    使用道具 举报 回复
    发表于 2017-11-26 00:55:28
    贴个图更好,测试报错还是很无奈。。。
    使用道具 举报 回复
    66666666666666666666666
    使用道具 举报 回复
    6666666666666666666666
    使用道具 举报 回复
    沙发沙发
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    试试看效果。
    使用道具 举报 回复
    发表于 2017-11-23 13:41:37
    留爪留爪
    使用道具 举报 回复
    发表于 2017-11-23 14:00:36
    看看,表哥还是厉害啊
    使用道具 举报 回复
    感谢分享,前来学习一下
    使用道具 举报 回复
    发表于 2017-11-23 16:06:55
    kanyiyankanyiyan
    使用道具 举报 回复
    发表于 2017-11-23 18:42:13
    python 姿势学习了
    使用道具 举报 回复
    发表于 2017-11-23 18:54:59
    这代码……
    使用道具 举报 回复
    发表于 2017-11-23 19:22:35
    使用道具 举报 回复
    发表于 2017-11-23 23:27:41
    谢谢分享
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册