Python3_itchat 微信好友信息爬取

文章首发于公众号:1024程序开发者社区

一、开发环境
版本:python3.5.2
编程软件:pycharm
配置库:1.pip install pyecharts
2.pip install itchat
3.pip install PIL.Image
4.pip install jieba
5.pip install wordcloud
二、实现步骤和结果
1.模拟登陆
调用itchat库中函数login(),可以直接生成一个二维码,这个二维码其实就是平时登陆web微信时候的二维码,你用手机微信扫这个二维码后,程序会模拟成你登陆进微信,进而对微信进行一系列操作。
对应代码:

    # False 每次登陆需要扫码  True可自动登录
    itchat.auto_login(False)

2.爬取好友所在省份信息
定义get_province函数对数据进行获取

def friends_province():
    # 获取好友省份
    province= get_data("Province")
    # 分类
    province_distribution = {}
    for item in province:
        #删除英文省份,因为中国地图表中没有
        if bool(re.search('[a-z]',item)):
            continue
        elif not province_distribution.__contains__(item):
            province_distribution[item] = 1
        else:
            province_distribution[item] += 1
    #将省份名为空的删除
    province_distribution.pop('')
    #提取地图接口需要的数据格式
    # print(province_distribution)
    province_keys=province_distribution.keys()
    province_values=province_distribution.values()

    return province_keys,province_values

通过pyechart的map,bar函数对数据进行绘图,结果如下:

Python3_itchat 微信好友信息爬取_第1张图片
我的微信好友分布.png
Python3_itchat 微信好友信息爬取_第2张图片
我的微信好友分布1.png

3.爬取好友性别信息
定义get_sex函数进行性别数据爬取和绘图。

def get_sex():
    my_friends = itchat.get_friends(update=True)[0:]
    sex = {"male": 0, "female": 0, "other": 0}
    for item in my_friends[1:]:
        s = item["Sex"]
        if s == 1:
            sex["male"] += 1
        elif s == 2:
            sex["female"] += 1
        else:
            sex["other"] += 1
    total = len(my_friends[1:])
    attr = list(sex.keys())
    v1 = list(sex.values())
    pie = Pie("好友性别比例")
    pie.add("", attr, v1, v1, is_label_show=True)
    pie.render(path="sex_html/sex.html")

通过pie函数画出饼状图(男女比例确实比较尬),其中other是未标注的好友:


Python3_itchat 微信好友信息爬取_第3张图片
好友性别比例.png

4.爬取好友签名信息和绘制云图
定义friend_signature函数,获取好友个性签名,对于签名中有emoji表情的进行处理。

def friends_signature():
    signature = get_data("Signature")
    wash_signature=[]
    for item in signature:
        #去除emoji表情等非文字
        if "emoji" in item:
            continue
        rep = re.compile("1f\d+\w*|[<>/=【】『』♂ω]")
        item=rep.sub("", item)
        wash_signature.append(item)

    words="".join(wash_signature)

    wordlist = jieba.cut(words, cut_all=True)
    word_space_split = " ".join(wordlist)

    global NickName
    global Sex
    # 图片的作用:生成的图片是这个图片的两倍大小
    # 根据性别选择对应的性别模板图
    coloring = np.array(Image.open("standard/boy.jpg"))
    # simkai.ttf 必填项 识别中文的字体,例:simkai.ttf,
    my_wordcloud = WordCloud(background_color="white", max_words=800,
                             mask=coloring, max_font_size=120, random_state=30, scale=2,font_path="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()
    # 保存图片
    my_wordcloud.to_file('Signature/signature.png')

通过jieba函数对数据进行分词,并用Wordcloud画图,此处需要一个模板图,可根据个人喜好进行设置。


Python3_itchat 微信好友信息爬取_第4张图片
signature.png

5.好友图像获取和拼接
定义get_img函数获取好友图像。

def get_img():
    os.chdir('F:\Python_code\Web_Spider\wechat\img')
    for friend in itchat.get_friends(update=True)[0:]:
        # 可以用此句print查看好友的微信名、备注名
        print(friend['NickName'] + "(" + friend['RemarkName'] + ")")
        img = itchat.get_head_img(userName=friend["UserName"])
        path = friend['NickName'] + "(" + friend['RemarkName'] + ").jpg"
        try:
            with open(path, 'wb') as f:
                f.write(img)
        except Exception as e:
            print(repr(e))

运行程序,将数据存储于文件夹中,通过图像拼接,将好友图像拼接于一张图片上。

for item in os.listdir(headImgPath):
    imgPath = os.path.join(headImgPath, item)
    pathList.append(imgPath)
total = len(pathList)#total是好友头像图片总数
line = int(sqrt(total))#line是拼接图片的行数(即每一行包含的图片数量)
NewImage = Image.new('RGB', (128*line,128*line))
x = y = 0
for item in pathList:
    try:
        img = Image.open(item)
        # Image.ANTIALIAS:平滑滤波。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。
        img = img.resize((128,128),Image.ANTIALIAS)
        NewImage.paste(img, (x * 128 , y * 128))
        x += 1
    except IOError:
        print("第%d行,%d列文件读取失败!IOError:%s" % (y,x,item))
        x -= 1
    if x == line:
        x = 0
        y += 1
    if (x+line*y) == line*line:
        break
NewImage.save("final.jpg")

具体结果如图:


Python3_itchat 微信好友信息爬取_第5张图片
final.jpg

公众号中回复“微信好友爬取”,获取代码链接。
关注即送海量学习资源:


Python3_itchat 微信好友信息爬取_第6张图片
7. We can see you Anonmous.png

你可能感兴趣的:(Python3_itchat 微信好友信息爬取)