子域名收集

对子域名进行收集有很多种方式比如子域名挖掘机(主动)、搜索引擎信息收集(被动) ,要保证尽量不要让目标知道我们的存在 所以如果没有特殊需要 我们选择搜索引擎收集子域名信息

爬虫获取a标签(IO密集型)---->多线程

只爬取几页十几页内容(线程的创建与删除几乎不会影响时间)---->直接创建线程 不使用线程池

"""
只需要修改第23行的baidu.com 就可以获得你想搜寻的子域名   默认爬取十页
"""
import requests
import threading
from lxml import etree
from urllib.parse import urlparse


def get_domain(target: str):
    headers = {
        'Referer': 'https://cn.bing.com/chrome/newtab',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}
    response = requests.get(headers=headers, url=target)
    html = response.content.decode('utf-8')
    tree = etree.HTML(html)
    result = tree.xpath('//*[@id="b_results"]/li/div[1]/h2/a/@href')
    with mutex:
        subdomain.extend([urlparse(j).scheme + '://' + urlparse(j).netloc for j in result])


if __name__ == '__main__':
    domain = 'baidu.com' # 目标域名
    thread_list = list()
    subdomain = list()
    mutex = threading.Lock()

    for i in range(10):  # 爬取多少个页面 一个页面就是一个子线程
        url = f'https://cn.bing.com/search?q=site:{domain}&first={i * 10}'
        thread_list.append(threading.Thread(target=get_domain, args=(url,)))
    for t in thread_list:
        t.start()
    for t in thread_list:  # join等待保证所有线程都执行完毕
        t.join()

    print(set(subdomain))  # 去重

就算搜索的是同一个域名 每次搜索出的子域名数量都可能不同,因为每次返回页面内容可能会有不同!!!

假设 搜索site:163.com ---------->可能会出现这种情况

二和三算作一个域名 https://c/m.163.com 所以数量为2

再次搜索site:163.com 返回下面三个a标签

子域名数量为3

posted @ 2022-02-04 11:56  beginner_z  阅读(342)  评论(0)    收藏  举报