• 辣条君写爬虫4【帮小姐姐删垃圾邮件】


    我司系统报错或者重要监控数据会发邮件到个人邮箱,这就导致邮箱一段时间就好几百页了。小姐姐说,辣条君和某昊然谁先帮她删完邮件,就和谁去看电影。于是乎,打算写个小脚本,先拿自己的账号实验一下吧~

    Tip:本文仅供学习与交流,切勿用于非法用途!!!

    1.需求分析

    这次,我们需要删除的QQ邮箱内的部分邮件。

    只需要将我司日志那些邮件,全部勾选,然后点击最上面的彻底删除就好了嘛。so easy。首先我们可以抓包,找接口。由于涉及登录,我打算用笨方法(还不是菜),让页面自己跑。用到了selenium。用这个库,你首先需要将你浏览器对应的驱动放到环境变量中。然后模拟认为操作,一步一步写代码就好了。

    2.撸起袖子写代码

    首先,我们需要登录,我们使用账号和密码登录(这样就知道小姐姐qq密码了)。打开qq邮箱,qq推荐的是快捷登录,我们需要模拟点击转换按钮,选择账号密码登录方式。

    from selenium import webdriver
    driver = webdriver.Chrome()
    # 获取页面
    driver.get("https://mail.qq.com/")
    
    def login(qq, password):
        driver.switch_to.frame("login_frame")
        # 可能会出现QQ快捷登录页面
        if driver.find_element_by_xpath('//*[@id="switcher_plogin"]'):
            driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
        driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq)
        driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
        driver.find_element_by_xpath('//*[@id="login_button"]').click()
    

    我使用的是谷歌浏览器,所以使用Chrome()方法,利用xpath选取控件,xpath路径可以直接从浏览器处copy。

    登录之后,点击左边收件箱就可以进入到邮件列表页面。这里需要注意一下,因为这个页面内部包含frame,所以需要进入到某标签的frame才可以顺利获取某页面。一页有25个邮件,我们for循环注意判断如果是我司日志,就可以在多选框把它勾上了。然后点击最上面的彻底删除,点击确定,之后会弹出来一个删除成功的Dialog,再点击取消就可以了。

        # 回到主页面
        driver.switch_to.default_content()
        # 点击左边 收件箱 按钮
        driver.find_element_by_xpath('//*[@id="folder_1"]').click()
        # 进入列表的mainFrame
        driver.switch_to.frame("mainFrame")
        # for循环每一页的25个列表,判断打勾
        for i in range(1,26):
            try:
                span = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span'
                input = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[1]/input'
                if driver.find_element_by_xpath(span).text == del_text:
                    driver.find_element_by_xpath(input).click()
            except Exception as e:
                print(e.args)
        driver.find_element_by_xpath('//*[@id="quick_completelydel"]').click()
        # 切换到弹出框
        driver.switch_to.parent_frame()
        # 点击确定删除
        driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_confirm"]').click()
        # 显示等待,等待取消按钮出现
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'QMconfirm_QMDialog_cancel')))
        driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_cancel"]').click()
    

    del_text就是我司日志四个字。首先利用switch_to.default_content()进入主页面,然后点击收件箱按钮,在跳转到邮件列表所在framemainFrame。接着for循环,看看那个适合打上勾。接着点击确定和删除成功提示按钮即可,这一过程需要切换frame。如果一切顺利的话,页面会自动刷新,然后我们进行第二次筛选、删除即可。

    这里有个问题,如果当前页(或者说第一页),没有我司日志,你不停的彻底删除,当前页的数据一直不变,那岂不是后面的数据一直得不到删除啊。所以我们需要记录下当前需要跳转的页数,然后逐页跳转到可能拥有我司日志的页码上就好了。

    # 需要跳转的页
    need_turn_page = 1
    
    def delete(del_text):
        global need_turn_page
        # 从第一页开始
        current_page = 1
        # 记录一下,本页需要删除的有邮件
        count = 0
    	# 仿佛有一些代码
    	# 跳转到当前页
        if need_turn_page > current_page:
            for page in range(1, need_turn_page):
                print("我跳转了")
                current_page = current_page + 1
                driver.find_element_by_xpath('//*[@id="nextpage1"]').click()
        # for循环每一页的25个列表,判断打勾
        for i in range(1,26):
            try:
    			# 仿佛有一些代码
                if driver.find_element_by_xpath(span).text == del_text:
                    count = count+1
                    driver.find_element_by_xpath(input).click()
            except Exception as e:
                print(e.args)
        if count > 0:
            # 仿佛有一些代码
        # 否则翻页
        else:
            need_turn_page = need_turn_page + 1
    

    3.完整代码

    '''
    QQ 邮箱删除垃圾邮件
    '''
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import time
    driver = webdriver.Chrome()
    
    # 需要跳转的页
    need_turn_page = 1
    # 获取页面
    driver.get("https://mail.qq.com/")
    
    # 登录
    def login(qq, password):
        driver.switch_to.frame("login_frame")
        # 可能会出现QQ快捷登录页面
        if driver.find_element_by_xpath('//*[@id="switcher_plogin"]'):
            driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
        driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq)
        driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
        driver.find_element_by_xpath('//*[@id="login_button"]').click()
    
    def delete(del_text):
        global need_turn_page
        # 从第一页开始
        current_page = 1
        # 防止太快,腾讯找我麻烦
        time.sleep(1)
        # 记录一下,本页需要删除的有邮件
        count = 0
        # 回到主页面
        driver.switch_to.default_content()
        # 点击左边 收件箱 按钮
        driver.find_element_by_xpath('//*[@id="folder_1"]').click()
        # 进入列表的mainFrame
        driver.switch_to.frame("mainFrame")
        # 跳转到当前页
        if need_turn_page > current_page:
            for page in range(1, need_turn_page):
                print("我跳转了")
                current_page = current_page + 1
                driver.find_element_by_xpath('//*[@id="nextpage1"]').click()
        # for循环每一页的25个列表,判断打勾
        for i in range(1,26):
            try:
                span = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span'
                input = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[1]/input'
                if driver.find_element_by_xpath(span).text == del_text:
                    count = count+1
                    driver.find_element_by_xpath(input).click()
            except Exception as e:
                print(e.args)
        if count > 0:
            driver.find_element_by_xpath('//*[@id="quick_completelydel"]').click()
            # 切换到弹出框
            driver.switch_to.parent_frame()
            # 点击确定删除
            driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_confirm"]').click()
            # 显示等待,等待取消按钮出现
            WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'QMconfirm_QMDialog_cancel')))
            driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_cancel"]').click()
        # 否则翻页
        else:
            need_turn_page = need_turn_page + 1
    
    
    
    
    
    if __name__ == '__main__':
        login('your qq','your password')
        for page in range(1, 126):
            delete('我司日志')
    
    

    结束了,好了,现在要去帮小姐姐删邮件去了。右手拍座椅,转180度,“I want you”。咦,他们人呢???

    4.代码优化

    既然他们走了,那我还是默默留下优化下代码吧。

    '''
    QQ 邮箱删除垃圾邮件
    '''
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import time
    driver = webdriver.Chrome()
    
    # 获取页面
    driver.get("https://mail.qq.com/")
    
    # 登录
    def login(qq, password):
        driver.switch_to.frame("login_frame")
        # 可能会出现QQ快捷登录页面
        if driver.find_element_by_xpath('//*[@id="switcher_plogin"]'):
            driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
        driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq)
        driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
        driver.find_element_by_xpath('//*[@id="login_button"]').click()
    
    def delete(del_text):
        # 防止太快,腾讯找我麻烦
        time.sleep(3)
        # 记录一下,本页需要删除的有邮件
        count = 0
        # for循环每一页的25个列表,判断打勾
        for i in range(1,26):
            try:
                span = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span'
                input = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[1]/input'
                if driver.find_element_by_xpath(span).text == del_text:
                    count = count+1
                    driver.find_element_by_xpath(input).click()
            except Exception as e:
                print(e.args)
        print("count:"+str(count))
        if count > 0:
            driver.find_element_by_xpath('//*[@id="quick_completelydel"]').click()
            # 切换到弹出框
            driver.switch_to.parent_frame()
            # 点击确定删除
            driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_confirm"]').click()
            # 显示等待,等待取消按钮出现
            try:
                WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'QMconfirm_QMDialog_cancel')))
                driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_cancel"]').click()
            except Exception as e:
                pass
        # 否则翻页
        else:
            # 回到主页面
            driver.switch_to.default_content()
            # 进入列表的mainFrame
            driver.switch_to.frame("mainFrame")
            WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'nextpage1')))
            driver.find_element_by_xpath('//*[@id="nextpage1"]').click()
    
    if __name__ == '__main__':
        login('your qq','your password')
        WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'folder_1')))
        # 回到主页面
        driver.switch_to.default_content()
        # 点击左边 收件箱 按钮
        driver.find_element_by_xpath('//*[@id="folder_1"]').click()
        # 进入列表的mainFrame
        driver.switch_to.frame("mainFrame")
        for page in range(1, 126):
            delete('我司日志')
    
  • 相关阅读:
    [CentOS7] 常用工具 之 差异备份工具 rdiff-backup
    [CentOS7] 常用工具 之 防暴力破解工具 Fail2ban
    [CentOS7] 增加yum源
    [CentOS7] firewalld重启失败 Failed to start firewalld
    常见性能优化
    Acunetix 11 配置详解
    linux 环境安装及学习
    linux 个人配置记录
    linux 配置阿里云yum库
    阿里云 oss实时日志查询
  • 原文地址:https://www.cnblogs.com/pjjlt/p/14019074.html
Copyright © 2020-2023  润新知