邮件爬取,Python脚本

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安全攻防感兴趣,强烈推荐这本书,本人就是根据这本书进行学习的。

 

以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的点赞和分享哟,谢谢!

 

                                                                                             

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值