实验1:域名信息收集工具
实验内容:
本次实验主要考察大家的编程能力及子域名的信息收集方法,在文件夹“Lab1_code”提供了使用Bing搜索引擎的域名收集功能。请对该代码进行扩展,使其可支持百度搜索引擎的域名收集功能。需要实现如下功能:
a) 支持百度搜索引擎的域名提取,其中从百度搜索引擎提取的域名需为真实域名,而非百度的域名跳转链接;
b) 可扩充其他功能,比如域名所在的标题等信息。
示例:bing搜索qq.com的子域名
#本次实验内容主要为:收集baidu.com域名下的子域名,
#收集方法为使用bing搜索引擎,采用爬手段,爬取搜索到的域名
bing搜索引擎搜索子域名的语法为:domain:[域名]
import requests #用于请求网页
from bs4 import BeautifulSoup #用于处理获取的到的网页源码数据
from urllib.parse import urlparse #用于处理url
#定义一个采用bing搜索的方法
def bing_search():
Subdomain = [] #定义一个空列表用于存储收集到的子域名
#定义请求头,绕过反爬机制
hearders = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.56',
'accept':'*/*',
'referer':'https://cn.bing.com/search?q=domain%3abaidu.com&qs=HS&pq=domain%3a&sc=10-7&cvid=B99CC286861647E79EF504A4D5B819F1&FORM=QBLH&sp=1',
'cookie':'MUID=15F7A3347F9B66091BBBAC017EB56733'
}
#定义请求url
url = "https://cn.bing.com/search?q=domain%3aqq.com&qs=n&sp=-1&pq=domain%3abaidu.com&sc=0-16&sk=&cvid=E6DAE965B2BD4FDC8DF857015E0499C1&first=9&FORM=PQRE1"
resp = requests.get(url,headers=hearders) #访问url,获取网页源码
print("\n")
print(type(resp))
soup = BeautifulSoup(resp.content,'html.parser') #创建一个BeautifulSoup对象,第一个参数是网页源码,第二个参数是Beautiful Soup 使用的 HTML 解析器,
job_bt = soup.find_all('h2') #find_all()查找源码中所有<h2>标签的内容
for i in job_bt:
print("i\n")
print(type(i))
print("i.a\n")
print(type(i.a))
link = i.a.get('href') #循环获取‘href’的内容
#urlparse是一个解析url的工具,scheme获取url的协议名,netloc获取url的网络位置
domain = str(urlparse(link).scheme + "://" + urlparse(link).netloc)
if domain in Subdomain: #如果解析后的domain存在于Subdomain中则跳过,否则将domain存入子域名表中
pass
else:
Subdomain.append(domain)
print(domain)
bing_search()
实验环境:
vscode
python 3.7.7
实验步骤及结果
1.运行Sub_Domain_Search.py,得到运行结果。
2. . 绕过反爬机制 观察bing_search的headers,图中referer是在bing中搜索domain:qq.com的结果,需要将其改为在百度中搜索domain:qq.com的结果;并将cookie改为自己的浏览器发送报文时候的cookie.
结果如图:
3.修改url
图中网址是在bing中搜索domain:qq.com的结果,需要换成百度的:
结果如图:
4.修改源码处理方式:
图中代码和在bing搜索domain:qq.com检查元素的标签一致,需要换成百度中的,即把h2换成h3
修改如图:
运行结果:
发现源码中的链接是由百度跳转到我们要的网址的
尝试把全部链接显示出来,在打印的url后面加path、params、query
运行结果:
现在我们需要把它们转换为重定向后的url。
改回原来的url打印方式:
成功获得子域名:
5.扩展功能——打印子域名的标题:
最终代码:
# 本次实验内容主要为:收集baidu.com域名下的子域名,
# 收集方法为使用bing搜索引擎,采用爬手段,爬取搜索到的域名
# bing搜索引擎搜索子域名的语法为:domain:[域名]
import requests #用于请求网页
from bs4 import BeautifulSoup #用于处理获取的到的网页源码数据
from urllib.parse import urlparse #用于处理url
import urllib
#定义一个采用bing搜索的方法
def baidu_search():
Subdomain = [] #定义一个空列表用于存储收集到的子域名
#定义请求头,绕过反爬机制
hearders = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.56',
'accept':'*/*',
'referer':'https://www.baidu.com/s?ie=UTF-8&wd=domain%3Abaidu.com',
'cookie':'<你浏览器的cookie,别人的可用cookie也行>',
'Connection':'close'
}
#定义请求ul
# url = "https://www.baidu.com/s?ie=UTF-8&wd=domain%3Aqq.com"
url="https://www.baidu.com/s?ie=UTF-8&wd=domain%3Aqq.com&qq-pf-to=pcqq.c2c"
resp = requests.get(url,headers=hearders) #访问url,获取网页源码
soup = BeautifulSoup(resp.content,'html.parser') #创建一个BeautifulSoup对象,第一个参数是网页源码,第二个参数是Beautiful Soup 使用的 HTML 解析器,
job_bt = soup.find_all('h3') #find_all()查找源码中所有<h2>标签的内容
for i in job_bt:
link0 = i.a.get('href') #循环获取‘href’的内容
link=urllib.request.urlopen(link0).geturl()
#urlparse是一个解析url的工具,scheme获取url的协议名,netloc获取url的网络位置
domain = str(urlparse(link).scheme + "://" + urlparse(link).netloc)
if domain in Subdomain: #如果解析后的domain存在于Subdomain中则跳过,否则将domain存入子域名表中
pass
else:
Subdomain.append(domain)
print(domain)
#接下来打印title
source = requests.get(domain,headers=hearders) #访问url,获取网页源码
# print(resp.content)
soup = BeautifulSoup(source.content,'html.parser')
title0 = soup.find('head')
title= title0.title.getText() #getText函数获取标签文本
print(title)
baidu_search()
本文含有隐藏内容,请 开通VIP 后查看