首页 > 代码库 > 实现服务器数据采集脚本技术点总结

实现服务器数据采集脚本技术点总结

上周对服务器数据采集脚本进行了优化和改进,在做的过程中遇到了一些问题,学到了一些知识点,现在总结出来,以供后续学习参考,欢迎大家批评指正,共同学习进步!


一、从别的目录导入模块的两种方式

    方式一、

        sys.path.append(“想要导入的文件的存放目录”)

        import 模块名

    方式二、

        在文件夹建立一个空文件__init__.py文件,使文件夹变为一个包;然后使用os模块调整此文件所在的路径,使其在所要访问的包的上一级目录

        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

        sys.path.append(BASE_DIR)

    然后就可以导入所想要导入的模块了



二、python操作mysql数据库

    使用    MySQLdb (import MySQLdb)

1、对数据库执行增、删、改操作    

def exec_curr(sql):         

    try:   

        #打开数据库连接                                                                   cnn=MySQLdb.connect(host=host,port=port,user=db_user,passwd=db_passwd,charset=‘utf8‘,db=db)

        #使用cursor()方法获取操作游标

        cur = cnn.cursor()

        #使用execute方法执行SQL语句

        cur.execute(sql)

        cnn.commit()

    except MySQLdb.Error,e:

        print e

2、对数据库执行查询操作

def connet_curr(host=host,port=port,db=db,db_user=db_user,db_passwd =            db_passwd,sql="select ip from nosql_ip"):

    result=[]

    try:

        cnn=MySQLdb.connect(host=host,port=port,user=db_user,passwd=db_passwd,charset=‘utf8‘,db=db)

        cur = cnn.cursor()

        cur.execute(sql)

        #获取所有记录列表

        rows=cur.fetchall()

        for row in rows:

            result.append(row)

        return result

    except MySQLdb.Error,e:

        print e


三、python的序列化和反序列化

    在做数据采集的时候,用到了公司其他部门同事做好的api,从api取到的数据为字符串格式,需要通过loads转换一下,成为字典格式以方便操作(当然,这里不转化为字典的话,可以使用操作字符串的方式进行操作,但使用字典方式更加方便和准确)

    1、可以使用pickle模块

        pickle.dumps(dic)

        pickle.loads(byte_data)

    2、可以使用json模块(我这里用到的是json)

        str = json.dumps(dic)

        dic_obj = json.loads(dic_str)

技术分享

四、操作字典的方式方法(字典是无序的,字典的key必须唯一)

    假设字典为 info = {

    ‘staff1‘: "小明",

    ‘staff2‘: "小红",

    ‘staff3‘: "小李",

    }

    1、增加操作:info[‘staff4‘] = “小刘”

    2、修改操作:info[‘staff3‘] = "小樊"

    3、1)info.pop("staff1")

         2)del info[‘staff3‘]

    4、查询操作

        1)"staff2" in info

        2)info.get("staff2")  如果一个key不存在,只返回None

        3)info["staff2"]   如果一个key不存在,就报错

    5、嵌套字典的查询只需要 :字典名[ ][ ] . . .

    6、循环字典

       1)for key in info:

                print(key,info[key])

       2)for k,v in info.items(): #会先把dict转成list

                print(k,v)


五、通过ssh连接到其他服务器执行命令的方法

def    ssh_execute_shell(host,command):                                  

        ssh_shell = ( ‘‘‘/usr/bin/ssh -n -i 跳板机的私钥地址 -p 26387 -o ‘‘‘

                        ‘‘‘StrictHostKeyChecking=no -o ConnectTimeout=2 root@‘%s‘ ‘‘‘

                        ‘‘‘ "%s" ‘‘‘ % (host, command))

        p=subprocess.Popen(ssh_shell,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

        out = p.communicate()

        return out


六、python的多进程

    1、多进程使用模块

    from multiprocessing import Process

    import time

    def f(name):

        time.sleep(2)

        print(‘hello‘, name)

    if __name__ == ‘__main__‘:

        p = Process(target=f, args=(‘process1‘,))

        p.start()

        p.join() 

    2、由于进程间内存不共享,进程间共享数据的方式有以下几种

        Queues(消息队列)

        Pipes(管道)

        Managers

    3、进程池

        from  multiprocessing import Process,Pool

        import time

        def Foo(i):

            time.sleep(2)

            return i+100

        pool = Pool(5)

        for i in range(10):

            pool.apply_async(func=Foo, args=(i,))

            #pool.apply(func=Foo, args=(i,))

        pool.close()

        pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。   

     

七、使用python发邮件

    import smtplib

    from email.MIMEText import MIMEText

    mailto_list = ["收件人用户名@staff.sina.com.cn"]

    mail_host = "mail.staff.sina.com.cn"

    mail_user = "发件人用户名"

    mail_pass = "发件人邮箱密码"

    mail_postfix = "staff.sina.com.cn"

    def send_mail(to_list, sub, content):

        me = "hello" + "<" + mail_user + "@" + mail_postfix + ">"

        msg = MIMEText(content, _subtype=‘html‘, _charset=‘UTF-8‘)

        msg[‘Subject‘] = sub

        msg[‘From‘] = me

        msg[‘To‘] = ";".join(to_list)

        try:

            s = smtplib.SMTP()

            s.connect(mail_host)

            s.login(mail_user, mail_pass)

            s.sendmail(me, to_list, msg.as_string())

            s.close()

            return True

        except Exception as e:

            print str(e)

            return False


                                                                                    欢迎批评指正!


本文出自 “10917734” 博客,请务必保留此出处http://10927734.blog.51cto.com/10917734/1950559

实现服务器数据采集脚本技术点总结