重点:
该脚本属于python学习使用,工作使用的话,作者本人选择使用在线子域名网站
https://phpinfo.me/domain/
但是!鲁迅说过:就算你写的是垃圾,你也要去写一遍,才能知道通往优秀作品的路。
因此过年这段时间,捡起放在床底的python书籍,这是一篇我写满备注,不需要会python都能看懂的代码。
待解决的问题:
大量的访问,以至于会被中断访问,因此收集不全,目前正在寻找解决办法
思路:
通过搜索引擎搜索该域名,然后将搜索出来的域名进行去重,也就是说我把搜索出来的每一页的信息爬取下来,然后再将其中域名部分提取出来,再去重,重而达到我的收集目的。
如图,搜索关键词是在上面url里面,我下面的代码,就是将该url拿出来,拼接进入我们想要搜索的页面,并且查看多少页
url = "https://cn.bing.com/search?q=site%3a" + site + "&go=Search&qs=ds&first=" + str((int(i) - 1) * 10) + "&FORM=PERE"
当我们完成一步后,接着将每一个搜索出来的内容进行爬取,读取出域名部分,该部分位于h2标签的a标签的href内,我们提取出来再去重即可。
一个很多刚刚学python都会疑惑的问题,写这个有什么用?我不写程序一样能运行。
if __name__ == '__main__':
main()
无论什么语言,都可以使用导入功能,因此这个方式是为了防止导入后输出错乱,因此这样写。
首先,__main__和下面的main()没有关系,它代表的就是这个代码文件本身
具体作用:
1、当当前代码文件a被别的文件b导入,当b运行的时候,
不会运行main()
2、当代码文件a直接被运行的时候,
会运行if__name__==‘__main__’下面的main()
#! /usr/bin/env python
# _*_ coding:utf-8 _*_
import requests #请求url相关
from bs4 import BeautifulSoup #用于爬取网页中的数据的模块
from urllib.parse import urlparse #处理url相关
import sys
import time
def bing_search(site,pages):
Subdomain = [] #建立一个列表,装子域名
headers = { #伪装一个请求头,这样更真实一些,搜索引擎不会直接断掉搜索
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip,deflate',
'Referer': "https://cn.bing.com/search?q=site%3abaidu.com&qs=n&sp=-1&pq=site%3abaidu.com&sc=0-14&sk=&cvid=8D311FFA33984B8A9E5F0C2F0308C40E&first=1&FORM=PERE",
'Cookie': "MUID=3B16E5BB57DC6D5300C5EACA56F26CF1; MUIDB=3B16E5BB57DC6D5300C5EACA56F26CF1; _EDGE_S=F=1&SID=10751AC54EAB619433FE15B44F856024&mkt=zh-cn; _EDGE_V=1; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=64FD5CC7783F4B1D89298A27EE989D36&dmnchg=1; SRCHUSR=DOB=20201028&T=1603843719000; _SS=SID=10751AC54EAB619433FE15B44F856024&bIm=113; SRCHHPGUSR=CW=1322&CH=670&DPR=1&UTC=-240&DM=1&WTS=63739440510&HV=1603844080&BRW=M&BRH=S; ipv6=hit=1603847309782&t=6"
}
for i in range(1,int(pages)+1): #多少页就请求多少次
url = "https://cn.bing.com/search?q=site%3a" + site + "&go=Search&qs=ds&first=" + str((int(i) - 1) * 10) + "&FORM=PERE"
html = requests.get(url,headers=headers,timeout=5) #进行一次get请求,并且附带headers属性,值就是我们之前设置的headers
# print(html) 代码测试,每完成一个功能,都应该输出一下测试代码,下面备注的print都是测试
soup = BeautifulSoup(html.content,'html.parser')
# print(soup)
#这里使用.content方式保存请求的url,用text的有可能会出现汉字乱码
#content返回的是二进制的数据,需要再解码,text返回的是unicode类型的数据
#BeautifulSoup将html.content的内容解码 格式为soup=beautifulsoup(解析内容,解析器) 常用解析器:html.parser,lxml,xml,html5lib,一般用第一个即可
jobdir = soup.findAll('h2')
# print(jobdir)
# 将获取到的内容存放到变量中
#利用findall进行标签的筛选,域名存放在H2标签里面,
for i in jobdir:
# print(i) #测试打印
link= i.a.get('href')
# #将h2标签里面的a属性中的href值获取出来
# print(link) #这里测试,当发起大量请求的时候,有很多链接失败的返回来,导致于会报错。解决办法是在上面的请求里面添加一个timeout,另外查到说,改为国内源即可
domain = str(urlparse(link).scheme + "://" + urlparse(link).netloc)
#urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接
# print(domain) 进行代码测试
if domain in Subdomain: #进行一下过滤去重
pass
else:
Subdomain.append(domain) #如果发现的域名不存在subdomain列表中,则添加
print(domain)
time.sleep(0.1)
if __name__ == '__main__':
if len(sys.argv) == 3:
site = sys.argv[1]
page = sys.argv[2]
else:
print ("usage: %s baidu.com 10" % sys.argv[0]) #用户输入错误时输出格式提示
sys.exit(-1)
Subdomain = bing_search(site, page)
写了这个以后,对于三个库requests bs4 urllib更加熟悉,time库使用有点失败,没能成功避开搜索引擎的检测,以至于爬取过程中被断开。
关于子域名收集,之前群里已经有个师傅写过在他的信息收集集成脚本里面,使用的方式和我这个思路是不一样的。
接下来的python工具,写一个socket通信的,大概一个星期后搞完,欢迎再来看。
最后BB一句,md搜索引擎好伤人啊,大量访问怎么了?!难受。。
END
本文始发于微信公众号(NOVASEC):python工具学习-子域名收集工具
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论