对子域名进行收集有很多种方式比如子域名挖掘机(主动)、搜索引擎信息收集(被动) ,要保证尽量不要让目标知道我们的存在 所以如果没有特殊需要 我们选择搜索引擎收集子域名信息
爬虫获取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://email.163.com
-
https://c.m.163.com/news/a/GVAGHR6R05149BJI.html
-
https://c.m.163.com/news/a/GVBSQRJ20008856R.html
二和三算作一个域名 https://c/m.163.com 所以数量为2
再次搜索site:163.com 返回下面三个a标签
- https://email.163.com
- https://cg.163.com
- https://c.m.163.com/news/a/GVAGHR6R05149BJI.html
子域名数量为3
微信扫一扫,打赏作者吧~