本人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实时获取贴吧邮箱名单并向其发送邮件的更多相关文章
-
使用Python实时获取cmd的输出
最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须 ...
-
这个帖子要收藏,以后用得着--python 实时获取子进程输出
在论坛上找到方法了,http://bbs.csdn.net/topics/340234292 http://blog.csdn.net/junshao90/article/details/821575 ...
-
Python实时语音识别控制
代码地址如下:http://www.demodashi.com/demo/12946.html Python实时语音识别控制 概述 本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio ...
-
使用python发邮件(qq邮箱)
今天打算用QQ邮箱作为示例使用的邮箱,其他邮箱基本操作一样. 第一步:首先获取QQ邮箱授权码 1.进入QQ邮箱首页,点击设置,如图, 2.然后点击账户 3.拉到这个地方,开启POP3/SMTP服务服务 ...
-
subprocess.Popen stdout重定向内容实时获取
python 打开一个新进程执行系统命令, test 执行完才能获取返回, test1 实时获取返回结果 import subprocess def test(cmd): p = subprocess ...
-
PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法
对于Model/View中视图的数据编辑后怎么能实时获取编辑的数据变动位置和变动情况查阅了一些资料,终于基本弄明白必须重写Model的setData方法才能截获.setData方法是视图中各种角色数据 ...
-
【NLP】Python NLTK获取文本语料和词汇资源
Python NLTK 获取文本语料和词汇资源 作者:白宁超 2016年11月7日13:15:24 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集 ...
-
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
-
geotrellis使用(二十二)实时获取点状目标对应的栅格数据值
目录 前言 实现方法 总结 一.前言 其实这个功能之前已经实现,今天将其采用1.0版的方式进行了重构与完善,现将该内容进行总结. 其实这个功能很常见,比如google地球上 ...
随机推荐
-
Source Insight 显示中文乱码
Source Insight 3.X utf8支持插件震撼发布 继上次SI多标签插件之后,因为公司内部编码改为utf8编码,因此特意做了这个Source Insight 3.X utf8插件. 下载地 ...
-
atomic_t原子操作
所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念. 原子操作需要硬件的支持 ...
-
玩玩hibernate
这几天师兄,让我玩玩hibernate,然后通过这个玩意写爬虫(spider).这一说不打紧,嗯,一个星期没有了,全都是由于配置环境,心很塞,整个星期的空闲时间都用来做重复的工作.在学习之前,我先查找 ...
-
Intellij Idea使用频率较高的几个快捷键
自动补全参数定义: Ctrl+Alt+V 运行断点Expression: Alt+F8 选择具体的方法以断点步入:Shift+F7 智能操作: Alt+Enter 打开最近文件:Ctrl+E 打开最近 ...
-
如何直观的解释back propagation算法?
转自:知乎-https://www.zhihu.com/question/27239198 作者:匿名用户链接:https://www.zhihu.com/question/27239198/answ ...
-
剑指Offer——知识点储备-常用算法
剑指Offer--知识点储备-常用算法 快速排序 注:若排序是有序的,采用快排,则退化为冒泡排序. 解决这个问题,采用两个选取基准的方法 (1)随机选取基数(在这个区间内随机取一个数) 出现的恶劣情况 ...
-
MySQL三层结构、用户权限、索引设计原则
一.守护进程是什么? Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对 ...
-
linux之在当前目录下按照文件大小进行排序的三种方法
当前目录下按照文件大小排序 [root@test23 script]# ls -lSh 总用量 44K -rw-r--r-- 1 root root 2.4K 12月 8 17:24 test.con ...
-
js传输图片路径
数据库中存储数据/commons/img/***.jpg格式的图片路径. "<a onclick=\"showImg(\'"+dataEle.imgPath.rep ...
-
URAL 1029 Ministry
URAL 1029 思路: dp+记录路径 状态:dp[i][j]表示到(i,j)这个位置为止的最少花费 初始状态:dp[1][i]=a[1][i](1<=i<=m) 状态转移:dp[i] ...