Python3+Scrapy+Selenium腾讯企业邮箱的指定邮件读取功能

1.最近经理被邮件烦到了,可能是太多了,想着批量读取并将需要的数据处理好,传到他的接口去,无奈腾讯的js又多,又难,又绕~看不懂看不懂,手动狗头。于是准备使用selenium模拟浏览器的方式

2.由于需要每天定时爬取,所以这里使用的是scrapy框架,其实、、主要作用是为了定时方便才用的,直接发布就行了。之前有定时框架了,所以采用scrapy。不是定时的朋友直接用自己喜欢的方式就行了

3.先导入一些库,好像有些没用到。。反正是灰色的就去掉或者注释就行了~

import json
import re
import time

import requests
import scrapy
from django.http import request, HttpResponse
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions, DesiredCapabilities

4.以下是爬虫代码了,嗐,别喷我,写在start_requests里面方便一点。。。别问我为什么。。本人很懒。。但是给你们注释好~

5.这里有个坑,注意到上面的browser.switch_to.frame(“mainFrame”),这里必须要跳到这个iframe,不然接下来的元素你找不到会报错,并且等待3秒钟也是必要的,不然也找不到.

class TEMAILSpider(scrapy.Spider):
    name = 'Temail'
    allowed_domains = []

    start_urls = []
    custom_settings = {'CONCURRENT_REQUESTS': '10', }#线程数~

    def chuliinfo(self, shuju):
        shuju = ''.join(shuju)
        shuju = shuju.replace('\n', '').replace(' ', '')
        return shuju

    def start_requests(self):
        option = ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)
        # 这里开启无头,这样能快很多
        # option.add_argument('--headless')
        option.add_argument('--disable-gpu')
        # 这里是禁止加载提高速度
        # prefs = {

        #     'profile.default_content_setting_values': {
        #         'images': 2,#2这个状态是禁止加载图片
        # #         # 'javascript': 2
        #     }
        # }
        # option.add_experimental_option('prefs', prefs)
        # 谷歌浏览器
        desired_capabilities = DesiredCapabilities.CHROME
        desired_capabilities["pageLoadStrategy"] = "none"

        browser = webdriver.Chrome(options=option, desired_capabilities=desired_capabilities)
        browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                                {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})

        browser.get("https://exmail.qq.com/login")  # get接受url可以是任何网址,此处以百度为例
        wait = WebDriverWait(browser, 30)
        element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="loginForm"]/div[3]/div[3]/a[1]'))).click()  # 它的作用现在就是,等!!!!!!!
        input_user = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="inputuin"]'))).send_keys(
            '这里输入你的账号')  # 输入账号
        input_pwd = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="pp"]'))).send_keys('这里输入你的密码')  # 输入密码
        bt_login = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="btlogin"]'))).click()  # 点击登录按钮
        # 以下是收件箱的等待时间
        # time.sleep(6)
        folder = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="folder_1"]'))).click()  # 点击收件箱

        browser.switch_to.frame("mainFrame")
         # 定位 收件人
        time.sleep(3)
     

6.下面的代码可加可不加,可以直接选择你要的邮件页数跳转,否则就是从第一页开始,建议操作试试~

  #下面这一坨是跳转页数的
        maillistjump = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="maillistjump"]'))).click()  # 跳转
        jumppage = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="list"]/div[1]//input'))).send_keys(
            '10')  # 输入账号  # 跳转页数
        mljump = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="list"]/div[1]//a'))).click()  # 跳转按钮
        browser.switch_to.default_content()
        browser.switch_to.frame("mainFrame")
        time.sleep(3)

7.接下来就是重点的解析与循环了这可是其中的time.sleep把我坑哭了,哇哇的

  # print(len(email_list))
        for i in range(1000):
            if i != 0:
                browser.switch_to.frame("mainFrame")
                time.sleep(3)

            email_list = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="frm"]/div[2]/table')))  # 一页中所有的邮件
            # email_list1 = WebDriverWait(browser, 5).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="frm"]/div[3]/table')))  # 另一种情况
            email_list1=browser.find_elements_by_xpath('//*[@id="frm"]/div[3]/table')
            # email_list = browser.find_elements_by_xpath('//*[@id="frm"]/div[2]/table')  # //tr/td[3]/table//tr/td[3]/div[1]/u
            # email_title =browser.find_element_by_xpath('//*[@id="frm"]/div[2]/table//tr/td[3]/table//tr/td[3]/div[1]/u').text
            for index1, email in enumerate(email_list):
                email_title = wait.until(EC.presence_of_element_located(
                    (By.XPATH, '//*[@id="frm"]/div[2]/table[{}]//tr/td[3]/table//tr/td[3]/div[1]/u'.format(index1 + 1)))).text
                if email_title == '邮件标题名':#这里你可以用xpath找一下就知道了~只打开你的邮件标题的邮件
                    print(email_title)
                    # totime=wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="frm"]/div[2]/table[{}]//tr/td[1]/input'.format(index1 + 1)))).get_attribute('totime')
                    emailinfo = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="frm"]/div[2]/table[{}]//tr/td[3]/table//tr/td[3]/div[1]/u'.format(index1 + 1)))).click()
                    time.sleep(1)
                    backemail = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainmail"]/div[1]/div[2]/a[1]')))
                    html = browser.page_source
                    response = etree.HTML(html)
                    content = response.xpath('//*[@id="mailContentContainer"]//text()')  # 文本内容
                    Customer = content[1].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                    blNo = content[2].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                    portdis = content[3].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                    containere = content[4].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                    CustomerNo = Customer[-1]
                    BlNo = blNo[-1]
                    PortDis = portdis[-1]
                    Container_remake = containere[-1]
                    weituoinfo = {
                        "customerNumber": CustomerNo,
                        "shipmentNumber": BlNo,
                        "dischargingPort": PortDis,
                        "boxRemark": Container_remake
                    }
                    print(weituoinfo)
                    hea = {"Content-Type": "application/json"}#可以去掉
                    url = '传入接口的url'#可以去掉
                    response1 = requests.post(url, data=json.dumps(weituoinfo), headers=hea)#可以去掉
                    backemail.click()  # 点击返回
                    time.sleep(1)
                elif email_title == '邮件标题名':#这里你可以用xpath找一下就知道了~只打开你的邮件标题的邮件
                    print(email_title)
                    emailinfo = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="frm"]/div[2]/table[{}]//tr/td[3]/table//tr/td[3]/div[1]/u'.format(index1 + 1)))).click()
                    time.sleep(1)
                    backemail = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainmail"]/div[1]/div[2]/a[1]')))
                    html = browser.page_source
                    response = etree.HTML(html)
                    content = response.xpath('//*[@id="mailContentContainer"]//text()')  # 文本内容
                    Customer = content[1].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                    booking = content[2].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                    blNo = content[3].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                    portdis = content[4].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                    containere = content[5].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(":")
                    CustomerNo = Customer[-1]
                    Booking = booking[-1]
                    BlNo = blNo[-1]
                    PortDis = portdis[-1]
                    Container_remake = containere[-1]
                    shipbookinginfo = {
                        "customerNumber": CustomerNo,
                        "shipmentNumber":Booking,
                        "blno": BlNo,
                        "dischargingPort":PortDis,
                        "predistributionBox": Container_remake
                    }
                    print(shipbookinginfo)
                    backemail.click()  # 点击返回
                    time.sleep(1)
            if email_list1!=[]:
                for index1, email in enumerate(email_list):
                    email_title = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="frm"]/div[3]/table[{}]//tr/td[3]/table//tr/td[3]/div[1]/u'.format(index1 + 1)))).text
                    if email_title ==  '邮件标题名':#这里你可以用xpath找一下就知道了~只打开你的邮件标题的邮件
                        print(email_title)
                        # totime=wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="frm"]/div[2]/table[{}]//tr/td[1]/input'.format(index1 + 1)))).get_attribute('totime')
                        emailinfo = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="frm"]/div[3]/table[{}]//tr/td[3]/table//tr/td[3]/div[1]/u'.format(index1 + 1)))).click()
                        time.sleep(1)
                        backemail = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainmail"]/div[1]/div[2]/a[1]')))
                        html = browser.page_source
                        response = etree.HTML(html)
                        content = response.xpath('//*[@id="mailContentContainer"]//text()')  # 文本内容
                        Customer = content[1].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                        blNo = content[2].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                        portdis = content[3].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                        containere = content[4].replace(' ', '').replace('\n', '').replace('\xa0', '').replace("'", "").split(':')
                        CustomerNo = Customer[-1]
                        BlNo = blNo[-1]
                        PortDis = portdis[-1]
                        Container_remake = containere[-1]
                        weituoinfo = {
                            "customerNumber": CustomerNo,
                            "shipmentNumber": BlNo,
                            "dischargingPort": PortDis,
                            "boxRemark": Container_remake
                        }
                        print(weituoinfo)
                        backemail.click()  # 点击返回
                        time.sleep(1)
                    elif email_title ==  '邮件标题名':#这里你可以用xpath找一下就知道了~只打开你的邮件标题的邮件
                        print(email_title)
                        emailinfo = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="frm"]/div[3]/table[{}]//tr/td[3]/table//tr/td[3]/div[1]/u'.format(index1 + 1)))).click()
                        time.sleep(1)
                        backemail = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainmail"]/div[1]/div[2]/a[1]')))
                        html = browser.page_source
                        response = etree.HTML(html)
                        content = response.xpath('//*[@id="mailContentContainer"]//text()')  # 文本内容
                        Customer = content[1].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                        booking = content[2].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                        blNo = content[3].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                        portdis = content[4].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(':')
                        containere = content[5].replace(' ', '').replace('\n', '').replace("'", "").replace('\xa0', '').split(":")
                        CustomerNo = Customer[-1]
                        Booking = booking[-1]
                        BlNo = blNo[-1]
                        PortDis = portdis[-1]
                        Container_remake = containere[-1]
                        shipbookinginfo = {
                            "customerNumber": CustomerNo,
                            "shipmentNumber":Booking,
                            "blno": BlNo,
                            "dischargingPort":PortDis,
                            "predistributionBox": Container_remake
                        }
                        print(shipbookinginfo)
                        backemail.click()  # 点击返回
                        time.sleep(1)

            next_pages = wait.until(EC.presence_of_element_located((By.ID, 'nextpage')))  # 翻页prevpage#nextpage
            next_pages.click()
            browser.switch_to.default_content()
            # browser.switch_to.frame("mainFrame")
            if next_pages == []:
                break

8.如果您还有不懂的可以私信我hhhhhhhhhh在线接单??哈哈哈~

#运行这个来启动哟~
cmdline.execute("scrapy crawl Temail".split())
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值