1.邮件爬取原理
(1)邮件爬取收集工具:常见的搜索引擎,例如百度、Bing等
(2)邮件爬取原理:在指定网页上对邮件的关键字进行搜索,对搜索到的邮件相关信息进行爬取,处理
(3)邮件爬取作用:在得到邮件相关信息后,可以进行邮件钓鱼,通过邮件钓鱼来达到渗透的目的。
2,邮件爬取脚本
(1)输入相关库函数
import sys
import getopt
import requests
from bs4 import BeautifulSoup
import re
(2) 利用getopt.getopt()函数来处理命令行参数,这个函数有两种格式,一种为短选项,即“-"加上单个字母选项,另外一种为长选项,即“--”加一个单词选项。
def start(argv):
url = ""
pages = ""
if len(sys.argv) < 2:
print("-h 帮助信息;\n")
sys.exit()
try:
banner()
opts,args = getopt.getopt(argv,"-u:-p:-h") #这个函数是为了从外部输入不同的命令行选项时,对应执行不同的功能,函数返回两个列表:opts 和arg
except getopt.GetoptError:
print('Error an argument!')
sys.exit()
for opt, arg in opts: #opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数),输出opts列表数值并赋值给自定义的变量。
if opt == "-u":
url = arg
elif opt == "-p":
pages = arg
elif opt =="-h":
print(usage())
launcher(url, pages) #后面自己编写的函数
(3)帮助信息,其实就是说明使用规则,使得输出结果显得简洁美观,编辑显示方式、前景色、背景色。输入格式:python xx.py -u 域名 -p 页数
#开头: \033[显示方式;前景色;背景色m
#结尾: \033[0m
def banner(): #输出帮助信息
print('\033[1:34m ################################ \033[0m\n'
'\033[1:34m 米多奇勇士 \033[0m\n'
'\033[1:34m ################################ \033[0m\n')
def usage(): #使用规则。
print('-h: --help 帮助;')
print('-u: --url 域名;')
print('-p: --pages 页数;')
print('eg: python -u "www.baidu.com" -p 100'+'\n')
sys.exit() #可以通过捕捉SystemExit异常,在finally语句中进行一些清理操作;不捕捉SystemExit异常将直接退出程序。
(4) 编写通过正则表达式获取邮箱号码的代码
def search_email(html):
emails = re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+",html,re.I)
#用包含方式匹配,把所有匹配到的字符放到以列表中的元素返回多个匹配值
return emails
def headers(referer):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko20100101 Firefox/60.0','Accept':'*/*',
'Accept-Language': 'en-US,en:q=0.5',
'Accept-Encoding': 'gzip,deflate',
'Referer': referer
}
return headers
(5)编写bing_search()函数和baidu_search()函数来对bing搜索引擎和百度进行爬取
def bing_search(url, page, key_word):
referer = "http://cn.bing.com/search?q=email+site%3abaidu.com&qs=n&sp=-1&pq=emailsite%3abaidu.com&first=1&FORM=PERE1"
#referer作用是指示一个请求是从哪里链接过来
conn = requests.session()
#session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies
bing_url = "http://cb.bing.com/search?q=" + key_word + "site%3a" + url + "&qs=n&sp=-1&pq=" +key_word+"site%3a"+ url +"&first=" + str((page-1)*10) +"&FORM=PERE1"
conn.get('http://cn.bing.com', headers=headers(referer))
r = conn.get(bing_url, stream=True, headers=headers(referer), timeout=8)
emails = search_email(r.text)
return emails
def baidu_search(url, page, key_word):
email_list = []
emails = []
referer = "http://www.baidu.com/s?wd=email+site%3Abaidu.com&pn=1"
baidu_url = "http://www.baidu.com/s?wd="+key_word+"+site%3A"+url +"&pn="+str((page-1)*10)
conn = requests.session()
conn.get(referer, headers=headers(referer))
r = conn.get(baidu_url, headers=headers(referer))
soup = BeautifulSoup(r.text, 'lxml') #用来解析HTML和XML文档,lxml的优点速度很快,兼容性好
tagh3 = soup.find_all('h3') #寻找h3标签
for h3 in tagh3:
href = h3.find('a').get('href') #获取 a 标签下 href 的属性值
try:
r = requests.get(href, headers=headers(referer), timeout=8)
emails = search_email(r.text)
except Exception as e:
pass
for email in emails:
email_list.append(email) #append在列表末尾添加新的对象
return email_list
(6)通过调用百度和Bing搜索引擎的爬取函数【bing_search()和baidu_search()】,得到爬取结果,进行合并 ,去重之后再输出。
def launcher(url,pages): #漏洞调回函数,定义关键字,在bing和百度中搜索,将查询结果去重输出,
email_num = []
key_words = ['email', 'mail', 'mailbox', '邮件', '邮箱', 'postbox']
for page in range(1, int(pages)+1):
for key_word in key_words:
bing_emails = bing_search(url, page, key_word) #编写的bing函数
baidu_emails = baidu_search(url, page, key_word) #编写的百度函数
sum_emails = bing_emails + baidu_emails
for email in sum_emails:
if email in email_num:
pass
else:
print(email)
with open('data.txt', 'a+') as f:
f.write(email + '\n')
email_num.append(email)
(7) 结合起来就是一个完整的python邮件爬取脚本了
import sys
import getopt
import requests
from bs4 import BeautifulSoup
import re
def start(argv):
url = ""
pages = ""
if len(sys.argv) < 2:
print("-h 帮助信息;\n")
sys.exit()
try:
banner()
opts,args = getopt.getopt(argv,"-u:-p:-h") #这个函数是为了从外部输入不同的命令行选项时,对应执行不同的功能,函数返回两个列表:opts 和arg
except getopt.GetoptError:
print('Error an argument!')
sys.exit()
for opt, arg in opts: #opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数),输出opts列表数值并赋值给自定义的变量。
if opt == "-u":
url = arg
elif opt == "-p":
pages = arg
elif opt =="-h":
print(usage())
launcher(url, pages) #后面自己编写到的函数
#开头: \033[显示方式;前景色;背景色m
#结尾: \033[0m
def banner(): #输出帮助信息
print('\033[1:34m ################################ \033[0m\n'
'\033[1:34m 米多奇勇士 \033[0m\n'
'\033[1:34m ################################ \033[0m\n')
def usage(): #使用规则。
print('-h: --help 帮助;')
print('-u: --url 域名;')
print('-p: --pages 页数;')
print('eg: python -u "www.baidu.com" -p 100'+'\n')
sys.exit() #可以通过捕捉SystemExit异常,在finally语句中进行一些清理操作;不捕捉SystemExit异常将直接退出程序。
def launcher(url,pages): #漏洞调回函数,定义关键字,在bing和百度中搜索,将查询结果去重输出,
email_num = []
key_words = ['email', 'mail', 'mailbox', '邮件', '邮箱', 'postbox']
for page in range(1, int(pages)+1):
for key_word in key_words:
bing_emails = bing_search(url, page, key_word) #编写的bing函数
baidu_emails = baidu_search(url, page, key_word) #编写的百度函数
sum_emails = bing_emails + baidu_emails
for email in sum_emails:
if email in email_num:
pass
else:
print(email)
with open('data.txt', 'a+') as f:
f.write(email + '\n')
email_num.append(email)
def bing_search(url, page, key_word):
referer = "http://cn.bing.com/search?q=email+site%3abaidu.com&qs=n&sp=-1&pq=emailsite%3abaidu.com&first=1&FORM=PERE1"
#referer作用是指示一个请求是从哪里链接过来
conn = requests.session()
#session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies
bing_url = "http://cb.bing.com/search?q=" + key_word + "site%3a" + url + "&qs=n&sp=-1&pq=" +key_word+"site%3a"+ url +"&first=" + str((page-1)*10) +"&FORM=PERE1"
conn.get('http://cn.bing.com', headers=headers(referer))
r = conn.get(bing_url, stream=True, headers=headers(referer), timeout=8)
emails = search_email(r.text)
return emails
def baidu_search(url, page, key_word):
email_list = []
emails = []
referer = "http://www.baidu.com/s?wd=email+site%3Abaidu.com&pn=1"
baidu_url = "http://www.baidu.com/s?wd="+key_word+"+site%3A"+url +"&pn="+str((page-1)*10)
conn = requests.session()
conn.get(referer, headers=headers(referer))
r = conn.get(baidu_url, headers=headers(referer))
soup = BeautifulSoup(r.text, 'lxml') #用来解析HTML和XML文档,lxml的优点速度很快,兼容性好
tagh3 = soup.find_all('h3') #寻找h3标签
for h3 in tagh3:
href = h3.find('a').get('href') #获取 a 标签下 href 的属性值
try:
r = requests.get(href, headers=headers(referer), timeout=8)
emails = search_email(r.text)
except Exception as e:
pass
for email in emails:
email_list.append(email) #append在列表末尾添加新的对象
return email_list
def search_email(html):
emails = re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+",html,re.I) #用包含方式匹配,把所有匹配到的字符放到以列表中的元素返回多个匹配值
return emails
def headers(referer):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko20100101 Firefox/60.0','Accept':'*/*',
'Accept-Language': 'en-US,en:q=0.5',
'Accept-Encoding': 'gzip,deflate',
'Referer': referer
}
return headers
if __name__ == '__main__':
# 定义异常
try:
start(sys.argv[1: ])
except KeyboardInterrupt:
print("interrupted by user, killing all threads ... ")
结果:
3.书籍推荐
如果给位小伙伴对python安全攻防感兴趣,强烈推荐这本书,本人就是根据这本书进行学习的。
以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的点赞和分享哟,谢谢!