本人Python大菜鸟,今天用python写了一个脚本。主要功能是获取贴吧指定贴子评论中留下的邮箱,通过系统的crontab每一分钟自动检测新邮箱并向其发送邮件,检测机制是去查询数据库的记录,也就是不会向已经发送过的邮箱再次发送邮件(当然如果有人连续留下两次邮箱,脚本会不断给他发送邮件,直到有人留下了新邮箱地址,这个也算是脚本的bug吧,不过谁让你连续留两次呢)。

运行环境是python2.6,centos6.3 64位

主文件main.py脚本内容如下:

import mysql_class
import cookielib
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
import sys,urllib2,string,re,time,smtplib,json
def sendsimplemail(content,List,subject):
    today = time.strftime('%m-%d')
    msg = MIMEText(content)
    msg['Subject'] = today + "\t" + subject
    msg['From'] = 'xxx@xxx.com'
    try:
        smtp = smtplib.SMTP()
        smtp.connect(r'127.0.0.1')
        smtp.login('tank', 'tank')
        smtp.sendmail('xxx@xxx.com', List, msg.as_string())
        smtp.close()
    except Exception, e:
        print e

db=mysql_class.mySqlConn()
resall=db.GetFetch("select * from config")
for res in resall:
    tieba_id=str(res[0])
    myUrl="http://tieba.baidu.com/p/"+tieba_id
    minIndex=int(res[1])
    lastmail=res[2]
    firstPattern=re.compile(r'(\?pn=\d+)$')
    myUrl=re.sub(firstPattern,'',myUrl)
    try:
        print(time.strftime('%Y-%m-%d-%H-%M-%S:',time.localtime(time.time())))
        '''count the totalpage'''
        cj = cookielib.CookieJar()
        opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        response=opener.open(myUrl)
        myPage=response.read()
        pagecount=re.compile(r'span class="red">(\d+)</span>')
        match = pagecount.search(myPage)
        if match:
            totalpage=match.group(1)
          maxIndex=int(totalpage)

        '''count the mail addr'''
        for i in range(minIndex,maxIndex+1):
            index=myUrl.rfind(r'?pn=')
            if index==-1:
                myUrl=myUrl+r'?pn='+str(i)
            else:
                myUrl=re.sub(firstPattern,r'?pn='+str(i),myUrl)
            print(myUrl)
        response=opener.open(myUrl)
            myPage=response.read()
            myPage=myPage.decode('GBK')
            myPage=myPage.replace(r'\r\n','')
        if i == minIndex:
            print 'go....'
            lastmail_content=re.compile(lastmail+r'(.*)')
            match = lastmail_content.search(myPage)
            if match:
                myPage=match.group(1)
            else:
            print 'not match'
            pattern=re.compile(r'([a-zA-Z0-9]+@[a-zA-Z0-9]+\.?[a-zA-Z0-9]+\.+[a-zA-Z0-9]+)')
            result=pattern.findall(myPage)
            if result is not None:
                #for email in result:
            #print email
            List = [email for email in result]
            print List
             file_object = open('/root/bin/tieba/mail_content.txt')
            content=file_object.read()
            file_object2 = open('/root/bin/tieba/mail_subject.txt')
             subject=file_object2.read()
            sendsimplemail(content,List,subject)

            else:
                print("not found")
        if i == maxIndex:
            lastmail=result[len(result)-1]
        sql="UPDATE config SET pn_begin="+str(maxIndex)+",last_mail='"+str(lastmail)+"' WHERE tieba_id="+str(tieba_id)
        db.Query(sql)
        db.Close()
        print('Suceed!!!')
    except Exception as e:
        print("something wrong or not new mailer")

其中用到了mysql_class,将python操作mysql写成一个类,放在同级目录下的mysql_class.py里(有一些方法没有用到),内容如下:

import MySQLdb
class  mySqlConn:
    """This class is connect to mysql"""
    def __init__(self, host="xxxxx", user="mail", password="mail123", db="mail"):
        """Construct function,
        connect to mysql,
        and set names utf8"""
        self.__mqUser__ = user
        self.__mqPass__ = password
        self.__mqHost__ = host
        self.__mqDb__ = db
        try:
            self.__conn__ = MySQLdb.Connect(user=self.__mqUser__, passwd=self.__mqPass__, host=self.__mqHost__, db=self.__mqDb__)
        except:
            print("Count not connect to MySQL server.")
            exit(0)
        self.__cursor__ = self.__conn__.cursor()
        try:
            self.__cursor__.execute("set names utf8")
        except:
            print("Excute `set names utf8` faild.")
            exit(0)
    def Query(self, sql):
        """ Execute a sql """
        try:
            self.__cursor__.execute(sql)
        except:
            print(sql)
            print("Sql excute faild!")
    def GetMqCursor(self):
        """Get Mysql Cursor"""
        return self.__cursor__
    def GetFetchOne(self,sql):
        """Get fetch row"""
        self.__cursor__.execute(sql)
        return self.__cursor__.fetchone()
    def GetFetch(self,sql):
        """Get fetch row"""
        self.__cursor__.execute(sql)
        return self.__cursor__.fetchall()
    def Close(self):
        """Close the mysql connect"""
    self.__conn__.commit()
        self.__cursor__.close()
    self.__conn__.close()

main.py还用到了发送邮件功能,邮件服务器是我自己搭建的postfix+saslauthed+cyrsu-imap,没时间自己弄邮件服务器的可以用第三方的发信功能(个人认为,没用Python测试过)。

数据库名mail,表名:config,表结构如下(主要是用来存放贴吧id,上次记录的帖子的最大页数,还有上次记录的最后一个邮箱):
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| tieba_id  | varchar(100) | NO   | PRI | 1       |       |
| pn_begin  | int(11)      | NO   |     | 1       |       |
| last_mail | varchar(100) | NO   |     |         |       |
+-----------+--------------+------+-----+---------+-------+

另外发信的标题和内容我是放在文本里的,这样方便更新(也是因为我发现直接写在程序里会乱码,知道怎么解决的请留言告诉我哦,感激不尽)。

发信标题文本:mail_subject.txt,内容省略啦。

发信内容文本:mail_content.txt,内容省略啦。

脚本经过本人测试可行,qq邮箱可以发送,编码也没有问题,但是163邮箱貌似会乱码,有知道的朋友请指教。

-------------------------------------------------------黄金分割线-------------------------------------------------------------------

嘿嘿,其实我是向贴吧里的人推荐给力的VPN的,借此机会也向你们推荐一下哈,NydusVPN,目前俺用过的最给力的,有需要的朋友试试看:官网地址

Python实时获取贴吧邮箱名单并向其发送邮件的更多相关文章

  1. 使用Python实时获取cmd的输出

    最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须 ...

  2. 用Python实时获取Steam特惠游戏数据,我看看谁的钱包还有钱

    前言 大家好鸭, 我是小熊猫 Steam大家应该不陌生吧?不知道的话就让我们来了解一下吧~(一下简称"S") S是由美国电子游戏商Valve于2003年9月12日推出的数字发行平台 ...

  3. 这个帖子要收藏,以后用得着--python 实时获取子进程输出

    在论坛上找到方法了,http://bbs.csdn.net/topics/340234292 http://blog.csdn.net/junshao90/article/details/821575 ...

  4. Python实时语音识别控制

    代码地址如下:http://www.demodashi.com/demo/12946.html Python实时语音识别控制 概述 本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio ...

  5. 使用python发邮件(qq邮箱)

    今天打算用QQ邮箱作为示例使用的邮箱,其他邮箱基本操作一样. 第一步:首先获取QQ邮箱授权码 1.进入QQ邮箱首页,点击设置,如图, 2.然后点击账户 3.拉到这个地方,开启POP3/SMTP服务服务 ...

  6. subprocess.Popen stdout重定向内容实时获取

    python 打开一个新进程执行系统命令, test 执行完才能获取返回, test1 实时获取返回结果 import subprocess def test(cmd): p = subprocess ...

  7. PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法

    对于Model/View中视图的数据编辑后怎么能实时获取编辑的数据变动位置和变动情况查阅了一些资料,终于基本弄明白必须重写Model的setData方法才能截获.setData方法是视图中各种角色数据 ...

  8. 【NLP】Python NLTK获取文本语料和词汇资源

    Python NLTK 获取文本语料和词汇资源 作者:白宁超 2016年11月7日13:15:24 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集 ...

  9. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接

    使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...

随机推荐

  1. 如何通过JavaScript构建Asp.net服务端控件

    摘要 虽然ASP.NET的服务器控件一直被大家所诟病,但是用户控件(ACSX)在某些场景下还是非常有用的. 在一些极特珠的情况下,我们会使用JavaScript动态的构建页面中的控件,但假设遇到了我要 ...

  2. linux命令-ssh {远程登录}

    一 命令解释 命令: ssh ssh [-l login_name] [-p port] [user@]hostname

  3. CentOS开机无法进入系统,如何查错

    开机时按e/F5按钮,进入选择系统界面 会出现 CentOS(2.6.32-...类似的选择列表,选择默认的系统然后按e: 这时会出现 root kernel ... initd... 三个选项,选择 ...

  4. 黑马程序员_ C语言基础之指针(三)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...

  5. JSON 获取属性值的方法

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript(Standard ECMA-262 ...

  6. 《算法导论》 调用RANDOM(0,1),实现RANDOM(a,b)的过程

    描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?(RANDOM(0,1)以等概率输出0或者1,RANDOM(a,b)以等概率 ...

  7. 软件调试——IA-32 保护模式下寄存器一览

    最近在看张银奎先生的<调试软件>一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧. 1 通用寄存器 EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等 ...

  8. Mysql 第一天

    数据库课程体系 在PHP阶段,将数据库分为三个阶段: 基础阶段(就业班第一个阶段): 6天, mysql数据库的基本操作(增删改查), 以及一些高级操作(视图, 触发器,函数,存储过程等), 和PHP ...

  9. 前端---DOM

    一.介绍: http://www.cnblogs.com/wupeiqi/articles/5643298.html 什么是DOM? DOM字面意思是文档对象模型,DOM将网页内的元素与内容呈现为一个 ...

  10. Python导入cx_Oracle报错

    系统环境:RHEL5.4   python2.5(手动编译安装,系统带有2.4版本) 在使用python脚本访问数据库时,需要导入cx_Oracle模块 $>>>import cx_ ...