Python爬取微信好友的信息

系统 1097 0

最近在学习python的过程中发现了一些比较好玩的东西----------爬取微信好友的信息,并可以制作一些酷炫的效果,比如:统计微信好友男女比例、实现图灵机器人自动回复消息、抓取好友头像并拼接成图、获取好友签名信息并制作成云图等。

安装itchat##

itchat是一个开源的微信个人接口,首先我们先安装itchat
方法一:可以使用本命令安装itchat

            
              pip install itchat

            
          

方法二(适用于PyCharm):

            
              通过此路径:File--->Settings----> Project Interpreter----> +  搜索itchat安装即可

            
          

图灵机器人自动回复消息

如果下面的 apikey无法使用的话,可在图灵机器人官网(http://www.tuling123.com/)自己注册一个

            
              
                import
              
               requests

              
                import
              
               itchat

apikey 
              
                =
              
              
                '1841f627d8924f5ba0bb9ca12e76ad71'
              
              
                # 定义机器人得到消息并获取回复内容的函数
              
              
                def
              
              
                get_response
              
              
                (
              
              msg
              
                )
              
              
                :
              
              
    apiUrl 
              
                =
              
              
                'http://www.tuling123.com/openapi/api'
              
              
    data 
              
                =
              
              
                {
              
              
                'key'
              
              
                :
              
               apikey
              
                ,
              
              
                'info'
              
              
                :
              
               msg
              
                ,
              
              
                'userid'
              
              
                :
              
              
                'wechat-robot'
              
              
                }
              
              
                try
              
              
                :
              
              
        r 
              
                =
              
               requests
              
                .
              
              post
              
                (
              
              apiUrl
              
                ,
              
              data
              
                )
              
              
                .
              
              json
              
                (
              
              
                )
              
              
                # 字典里的get方法在没有“text”值的时候会返回None,而不会抛出异常
              
              
                return
              
               r
              
                .
              
              get
              
                (
              
              
                'text'
              
              
                )
              
              
                except
              
              
                :
              
              
                # 如果服务器没能正常交互(返回非json或无法来连接),那么return None
              
              
                return
              
              
                # 定义机器人回复的函数
              
              
@itchat
              
                .
              
              msg_register
              
                (
              
              itchat
              
                .
              
              content
              
                .
              
              TEXT
              
                )
              
              
                def
              
              
                tuling_reply
              
              
                (
              
              msg
              
                )
              
              
                :
              
              
                # 为了保证apikey出现问题时仍旧可以恢复,这里设置一个默认的回复
              
              
    defaultReply 
              
                =
              
              
                'I received : '
              
              
                +
              
               msg
              
                [
              
              
                'Text'
              
              
                ]
              
              
                # 如果apikey出现问题,那么reply将会是None
              
              
    reply 
              
                =
              
               get_response
              
                (
              
              msg
              
                [
              
              
                'Text'
              
              
                ]
              
              
                )
              
              
                # a or b 的意思是:如果a有内容,那么返回 a,否则返回 b
              
              
                return
              
               reply 
              
                or
              
               defaultReply


              
                # 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动
              
              
itchat
              
                .
              
              auto_login
              
                (
              
              hotReload
              
                =
              
              
                True
              
              
                )
              
              
itchat
              
                .
              
              run
              
                (
              
              
                )
              
            
          

统计微信好友男女比例##

            
              
                import
              
               itchat

              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt 

              
                # 登录方法,会弹出二维码,用微信扫描登录
              
              
itchat
              
                .
              
              auto_login
              
                (
              
              
                )
              
              
friends 
              
                =
              
               itchat
              
                .
              
              get_friends
              
                (
              
              update
              
                =
              
              
                True
              
              
                )
              
              
                #统计好友的性别,微信中男性为1,女性为2,未知为0
              
              
                def
              
              
                sex
              
              
                (
              
              friends
              
                )
              
              
                :
              
              
    total_friends 
              
                =
              
              
                len
              
              
                (
              
              friends
              
                )
              
              
    male 
              
                =
              
                female 
              
                =
              
               other 
              
                =
              
              
                0
              
              
                for
              
               friend 
              
                in
              
               friends
              
                :
              
              
        sex 
              
                =
              
               friend
              
                [
              
              
                'Sex'
              
              
                ]
              
              
                if
              
               sex 
              
                ==
              
              
                1
              
              
                :
              
              
            male 
              
                =
              
               male 
              
                +
              
              
                1
              
              
                elif
              
               sex 
              
                ==
              
              
                2
              
              
                :
              
              
            female 
              
                =
              
               female 
              
                +
              
              
                1
              
              
                else
              
              
                :
              
              
            other 
              
                =
              
               other 
              
                +
              
              
                1
              
              
    sex_list 
              
                =
              
              
                [
              
              
                "男生"
              
              
                ,
              
              
                "女生"
              
              
                ,
              
              
                "不明性别"
              
              
                ]
              
              
    sex_number_list 
              
                =
              
              
                [
              
              male
              
                ,
              
              female
              
                ,
              
              other
              
                ]
              
              
                # 此行代码用来设置中文
              
              
    plt
              
                .
              
              rcParams
              
                [
              
              
                'font.sans-serif'
              
              
                ]
              
              
                =
              
              
                [
              
              
                'SimHei'
              
              
                ]
              
              
    plt
              
                .
              
              title
              
                (
              
              friends
              
                [
              
              
                0
              
              
                ]
              
              
                [
              
              
                'NickName'
              
              
                ]
              
              
                +
              
              
                '微信中的男女比例'
              
              
                )
              
              
    plt
              
                .
              
              bar
              
                (
              
              
                range
              
              
                (
              
              
                len
              
              
                (
              
              sex_list
              
                )
              
              
                )
              
              
                ,
              
              sex_number_list
              
                ,
              
              tick_label
              
                =
              
              sex_list
              
                ,
              
              color
              
                =
              
              
                "yellow"
              
              
                )
              
              
    plt
              
                .
              
              show
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              
                "男性好友 : "
              
              
                ,
              
               male
              
                )
              
              
                print
              
              
                (
              
              
                "女性好友 : "
              
              
                ,
              
               female
              
                )
              
              
                print
              
              
                (
              
              
                "不明性别好友 : "
              
              
                ,
              
               other
              
                )
              
              
                print
              
              
                (
              
              
                "好友总数 ; "
              
              
                ,
              
               total_friends
              
                )
              
              
                # 调用函数sex()
              
              
sex
              
                (
              
              friends
              
                )
              
            
          

抓取好友头像并拼成图

            
              
                import
              
               itchat

              
                import
              
               os

              
                from
              
               os 
              
                import
              
               listdir

              
                import
              
               math

              
                import
              
               PIL
              
                .
              
              Image

itchat
              
                .
              
              auto_login
              
                (
              
              
                )
              
              
friends 
              
                =
              
               itchat
              
                .
              
              get_friends
              
                (
              
              update
              
                =
              
              
                True
              
              
                )
              
              
user 
              
                =
              
               friends
              
                [
              
              
                0
              
              
                ]
              
              
                [
              
              
                "NickName"
              
              
                ]
              
              
                print
              
              
                (
              
              user
              
                )
              
              
                # 建立文件夹来装好友的头像----- mkdir()方法用来创建文件夹(目录)
              
              
os
              
                .
              
              mkdir
              
                (
              
              user
              
                )
              
              
                # 将头像存到一个文件夹下
              
              
number 
              
                =
              
              
                0
              
              
                for
              
               friend 
              
                in
              
               friends
              
                :
              
              
    img 
              
                =
              
               itchat
              
                .
              
              get_head_img
              
                (
              
              userName
              
                =
              
              friend
              
                [
              
              
                "UserName"
              
              
                ]
              
              
                )
              
              
    fileImage 
              
                =
              
              
                open
              
              
                (
              
              user 
              
                +
              
              
                "/"
              
              
                +
              
              
                str
              
              
                (
              
              number
              
                )
              
              
                +
              
              
                ".jpg"
              
              
                ,
              
              
                'wb'
              
              
                )
              
              
    fileImage
              
                .
              
              write
              
                (
              
              img
              
                )
              
              
    fileImage
              
                .
              
              close
              
                (
              
              
                )
              
              
    number 
              
                +=
              
              
                1
              
              
                # listdir()方法用于返回指定文件夹下包含的文件或文件夹的名字的列表,在此处就是:每一张图片的名字
              
              
pics 
              
                =
              
               listdir
              
                (
              
              user
              
                )
              
              
                # 获取照片的张数
              
              
numberPics 
              
                =
              
              
                len
              
              
                (
              
              pics
              
                )
              
              
                # 设置每张照片的大小
              
              
eachsize 
              
                =
              
              
                int
              
              
                (
              
              math
              
                .
              
              sqrt
              
                (
              
              
                float
              
              
                (
              
              
                640
              
              
                *
              
              
                640
              
              
                )
              
              
                /
              
              numberPics
              
                )
              
              
                )
              
              
                # 获取每一行放置多少张图片
              
              
numbline 
              
                =
              
              
                int
              
              
                (
              
              
                640
              
              
                /
              
              eachsize
              
                )
              
              
                # 设置图片的大小为 640*640
              
              
toImage 
              
                =
              
               PIL
              
                .
              
              Image
              
                .
              
              new
              
                (
              
              
                "RGBA"
              
              
                ,
              
              
                (
              
              
                640
              
              
                ,
              
              
                640
              
              
                )
              
              
                )
              
              

x 
              
                =
              
              
                0
              
              
y 
              
                =
              
              
                0
              
              
                # pic 为每一张图片
              
              
                for
              
               pic 
              
                in
              
               pics
              
                :
              
              
                try
              
              
                :
              
              
                # 打开图片
              
              
        img 
              
                =
              
               PIL
              
                .
              
              Image
              
                .
              
              
                open
              
              
                (
              
              user 
              
                +
              
              
                "/"
              
              
                +
              
               pic
              
                )
              
              
                except
              
               IOError
              
                :
              
              
                print
              
              
                (
              
              
                "Error : 没有找到文件或读取文件失败"
              
              
                )
              
              
                else
              
              
                :
              
              
                # 缩小图片 && ANTIALIAS(抗锯齿)
              
              
        img 
              
                =
              
               img
              
                .
              
              resize
              
                (
              
              
                (
              
              eachsize
              
                ,
              
              eachsize
              
                )
              
              
                ,
              
              PIL
              
                .
              
              Image
              
                .
              
              ANTIALIAS
              
                )
              
              
                #拼接图片 paste()方法,粘贴图片,在拼接图片时将图片一张张粘贴上去
              
              
        toImage
              
                .
              
              paste
              
                (
              
              img
              
                ,
              
              
                (
              
              x 
              
                *
              
               eachsize
              
                ,
              
              y 
              
                *
              
               eachsize
              
                )
              
              
                )
              
              
        x 
              
                +=
              
              
                1
              
              
                if
              
               x 
              
                ==
              
               numbline
              
                :
              
              
            x 
              
                =
              
              
                0
              
              
            y 
              
                +=
              
              
                1
              
              
                # 保存拼接后的抬头像
              
              
toImage
              
                .
              
              save
              
                (
              
              user 
              
                +
              
              
                ".BMP"
              
              
                )
              
              
                # 将拼接好的图片发送给文件传输助手
              
              
itchat
              
                .
              
              send_image
              
                (
              
              user 
              
                +
              
              
                ".BMP"
              
              
                ,
              
              
                'filehelper'
              
              
                )
              
            
          

获取好友签名信息并制作成云图

            
              
                import
              
               itchat

              
                import
              
               jieba

              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt

              
                from
              
               wordcloud 
              
                import
              
               WordCloud
              
                ,
              
               ImageColorGenerator

              
                import
              
               numpy 
              
                as
              
               np

              
                import
              
               PIL
              
                .
              
              Image 
              
                as
              
               Image

              
                import
              
               re


              
                # 设置登录方法
              
              
itchat
              
                .
              
              auto_login
              
                (
              
              hotReload
              
                =
              
              
                True
              
              
                )
              
              
friends 
              
                =
              
               itchat
              
                .
              
              get_friends
              
                (
              
              update
              
                =
              
              
                True
              
              
                )
              
              
                # 获取好友签名信息并储存在 siglist 中
              
              
siglist 
              
                =
              
              
                [
              
              
                ]
              
              
                for
              
               indedx
              
                ,
              
              friend 
              
                in
              
              
                enumerate
              
              
                (
              
              friends
              
                )
              
              
                :
              
              
    sigture 
              
                =
              
               friend
              
                [
              
              
                'Signature'
              
              
                ]
              
              
                # 如果存在签名的话
              
              
                if
              
              
                len
              
              
                (
              
              friend
              
                [
              
              
                'Signature'
              
              
                ]
              
              
                )
              
              
                >
              
              
                0
              
              
                :
              
              
                # 将个性签名中的表情符号去掉(这里没有去除干净,利用正则表达式)
              
              
        sigture 
              
                =
              
               sigture
              
                .
              
              replace
              
                (
              
              
                'span'
              
              
                ,
              
              
                ''
              
              
                )
              
              
                .
              
              replace
              
                (
              
              
                'class'
              
              
                ,
              
              
                ''
              
              
                )
              
              
                .
              
              replace
              
                (
              
              
                'emoji'
              
              
                ,
              
              
                ''
              
              
                )
              
              
                .
              
              replace
              
                (
              
              
                '< ='
              
              
                ,
              
              
                ''
              
              
                )
              
              
                .
              
              replace
              
                (
              
              
                '"'
              
              
                ,
              
              
                ''
              
              
                )
              
              
                .
              
              replace
              
                (
              
              
                ''
              
              
                ,
              
              
                ''
              
              
                )
              
              
                .
              
              replace
              
                (
              
              
                '>'
              
              
                ,
              
              
                ''
              
              
                )
              
              
        siglist
              
                .
              
              append
              
                (
              
              sigture
              
                )
              
              
                # 将siglist中的元素拼接为一个字符串
              
              
text 
              
                =
              
              
                ''
              
              
                .
              
              join
              
                (
              
              siglist
              
                )
              
              
                # jieba(结巴分词:有全模式、精确模式、默认模式、新词识别、搜索引擎模式)
              
              
                # jieba.cut()所接收的两个参数,第一个参数为需要分词的字符串,第二个为是否采用全模式
              
              
word_list 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                True
              
              
                )
              
              
                # 空格拼接
              
              
word_space_split 
              
                =
              
              
                ' '
              
              
                .
              
              join
              
                (
              
              word_list
              
                )
              
              
                # 字体的颜色为对应路径的背景图片的颜色
              
              
coloring 
              
                =
              
               np
              
                .
              
              array
              
                (
              
              Image
              
                .
              
              
                open
              
              
                (
              
              
                "D:/PythonWorkplace/WeChat/image.png"
              
              
                )
              
              
                )
              
              
                # font_path: 字体路径; random_state: 为每个字体返回一个PIL颜色; scale:按照比例放大画布;max_font_size:显示的最大字体的大小
              
              
                # 如果参数 mask 为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代
              
              
my_wordcloud 
              
                =
              
               WordCloud
              
                (
              
              background_color
              
                =
              
              
                "white"
              
              
                ,
              
               max_words
              
                =
              
              
                2000
              
              
                ,
              
              
                         mask
              
                =
              
              coloring
              
                ,
              
               max_font_size
              
                =
              
              
                150
              
              
                ,
              
               random_state
              
                =
              
              
                42
              
              
                ,
              
               scale
              
                =
              
              
                3
              
              
                ,
              
              
                         font_path
              
                =
              
              
                "C:/Windows/Fonts/simkai.ttf"
              
              
                )
              
              
                .
              
              generate
              
                (
              
              word_space_split
              
                )
              
              
                # 画布的颜色
              
              
image_colors 
              
                =
              
               ImageColorGenerator
              
                (
              
              coloring
              
                )
              
              
plt
              
                .
              
              imshow
              
                (
              
              my_wordcloud
              
                .
              
              recolor
              
                (
              
              color_func
              
                =
              
              image_colors
              
                )
              
              
                )
              
              
plt
              
                .
              
              imshow
              
                (
              
              my_wordcloud
              
                )
              
              
plt
              
                .
              
              axis
              
                (
              
              
                "off"
              
              
                )
              
              
plt
              
                .
              
              show
              
                (
              
              
                )
              
            
          

可承接各种项目,有意者加QQ:1217898975


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论